JavaWeb-狂神-P11
1.共享数据
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//this.getInitParameter(); 初始化参数//this.getServletConfig(); Servlet配置//this.getServletContext(); Servlet上下文ServletContext servletContext = this.getServletContext();String username="尚硅谷";//数据servletContext.setAttribute("username",username);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
public class GetServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();String username = (String) servletContext.getAttribute("username");resp.setContentType("text/html");resp.setCharacterEncoding("utf-8");resp.getWriter().print("名字"+username);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
<servlet><servlet-name>servlet1</servlet-name><servlet-class>HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>servlet1</servlet-name><url-pattern>/one</url-pattern></servlet-mapping>
2.获取初始化参数
<!--配置一些web应用初始化参数--><context-param><param-name>url</param-name><param-value>jdbc.mysql:://localhost:3306/mybatis</param-value></context-param>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();String url = servletContext.getInitParameter("url");resp.getWriter().print(url);}
3.请求转发
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.print("进入了ServletDemo04");ServletContext servletContext = this.getServletContext();servletContext.getRequestDispatcher("/three").forward(req,resp);//转发的请求路径,调用forward实现请求转发}
4.读取资源文件
properties
- 在java目录下新建properties
- 在resources目录下新建properties
发现:都被打包到了同一个路径下:classes,我们俗称这个路径为类路径classpath;
需要一个文件流;
username=qinjiang
password=123456
public class ServletDemo05 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();InputStream is = servletContext.getResourceAsStream("/WEB-INF/classes/db.properties");//路径区分大小写Properties pros = new Properties();pros.load(is);String username = pros.getProperty("username");String password = pros.getProperty("password");resp.getWriter().print(username+password);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
访问测试即可ok;
P12
1.HttpServletReponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse;
- 如果要获取客户端请求过来的参数:找HttpServletRequest
- 如果要给客户端响应一些信息:找HttpServletResponse
1.简单分类
负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;PrintWriter getWriter() throws IOException;
负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);void setContentLength(int var1);void setContentLengthLong(long var1);void setContentType(String var1);void setBufferSize(int var1);void setDateHeader(String var1, long var2);void addDateHeader(String var1, long var2);void setHeader(String var1, String var2);void addHeader(String var1, String var2);void setIntHeader(String var1, int var2);void addIntHeader(String var1, int var2);void setStatus(int var1);
响应的状态码
int SC_CONTINUE = 100;int SC_SWITCHING_PROTOCOLS = 101;int SC_OK = 200;int SC_CREATED = 201;int SC_ACCEPTED = 202;int SC_NON_AUTHORITATIVE_INFORMATION = 203;int SC_NO_CONTENT = 204;int SC_RESET_CONTENT = 205;int SC_PARTIAL_CONTENT = 206;int SC_MULTIPLE_CHOICES = 300;int SC_MOVED_PERMANENTLY = 301;int SC_MOVED_TEMPORARILY = 302;int SC_FOUND = 302;int SC_SEE_OTHER = 303;int SC_NOT_MODIFIED = 304;int SC_USE_PROXY = 305;int SC_TEMPORARY_REDIRECT = 307;int SC_BAD_REQUEST = 400;int SC_UNAUTHORIZED = 401;int SC_PAYMENT_REQUIRED = 402;int SC_FORBIDDEN = 403;int SC_NOT_FOUND = 404;int SC_METHOD_NOT_ALLOWED = 405;int SC_NOT_ACCEPTABLE = 406;int SC_PROXY_AUTHENTICATION_REQUIRED = 407;int SC_REQUEST_TIMEOUT = 408;int SC_CONFLICT = 409;int SC_GONE = 410;int SC_LENGTH_REQUIRED = 411;int SC_PRECONDITION_FAILED = 412;int SC_REQUEST_ENTITY_TOO_LARGE = 413;int SC_REQUEST_URI_TOO_LONG = 414;int SC_UNSUPPORTED_MEDIA_TYPE = 415;int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;int SC_EXPECTATION_FAILED = 417;int SC_INTERNAL_SERVER_ERROR = 500;int SC_NOT_IMPLEMENTED = 501;int SC_BAD_GATEWAY = 502;int SC_SERVICE_UNAVAILABLE = 503;int SC_GATEWAY_TIMEOUT = 504;int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
2.下载文件
1.向浏览器输出消息(一直在讲,见上面的例子)
2.下载文件
1.要获取下载文件的路径
2.下载的文件名是啥?
3.设置想办法让浏览器能够支持下载我们需要的东西
4.获取下载文件的输入流
5.创建缓冲区
6.获取OutputStream对象
7.将FileOutputStream流写入buffer缓冲区
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.要获取下载文件的路径String realPath = "D:\\ideaWorkSpace\\javaweb-servlet-01\\response\\src\\main\\resources\\狂神.png";System.out.print("下载文件的路径:"+realPath);// 2.下载的文件名是啥?String fileName = realPath.substring(realPath.lastIndexOf("//") + 1);
// 3.设置想办法让浏览器能够支持(Content-disposition)下载我们需要的东西,中文文件名URLEncoder.encode编码,否则有可能乱码resp.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
// 4.获取下载文件的输入流FileInputStream fis = new FileInputStream(realPath);
// 5.创建缓冲区int len=0;byte[] buffer = new byte[1024];
// 6.获取OutputStream对象ServletOutputStream os = resp.getOutputStream();
// 7.将FileOutputStream流写入buffer缓冲区while ((len=fis.read(buffer))!=-1){os.write(buffer,0,len);}os.close();fis.close();}
3.验证码功能
验证怎么来的?
- 前端实现
- 后端实现
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//如何让浏览器5秒自动刷新一次resp.setHeader("refresh","3");//在内存中创建一个图片BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);//得到图片Graphics2D g = (Graphics2D) image.getGraphics();//笔//设置图片的背景颜色g.setColor(Color.white);g.fillRect(0,0,80,20);//给图片写数据g.setColor(Color.blue);g.setFont(new Font(null, Font.BOLD,20));g.drawString(makeNum(),0,20);//告诉浏览器这个请求用图片的方式打开resp.setContentType("image/ PNG");//网站存在缓存,不让浏览器缓存resp.setDateHeader("expires",-1);resp.setHeader("cache- Control","no-cache");//缓存策略resp.setHeader("pragma","no-cache");//把图片写给浏览器boolean png = ImageIO.write(image, "png", resp.getOutputStream());}
4.实现重定向
一个web资源收到客户端请求后,他会通知客户端去访问另外一个web资源,这个过程叫重定向
常见场景:
- 用户登录
void sendRedirect(String var1) throws IOException;
测试:
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {/*resp.setHeader("Location","/image");resp.setStatus(302);*/resp.sendRedirect("/image");//重定向}
面试题:请你聊聊重定向和转发的区别?
相同点:
- 都会跳转到别的页面
不同点:
- 请求转发的时候,url不会产生变化
- 重定向的时候,url会产生变化
小贴士:tomcat9控制台中文乱码,可以解决,但不建议
1、找到${CATALINA_HOME}/conf/logging.properties
2、找到java.util.logging.ConsoleHandler.encoding = UTF-8
修改为java.util.logging.ConsoleHandler.encoding = GBK
简单实现登录重定向
注意在转发的时候如果在点击提交按钮的时候报404错误,并且是因为输入pageContext.request.contextPath的这一段,是因为web.xml的版本问题
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//处理请求String username=req.getParameter("username");String password=req.getParameter("password");System.out.print(username+password);//重定向的时候一定要注意,路径问题,否则404resp.sendRedirect("/r/success.jsp");}
<servlet><servlet-name>Test</servlet-name><servlet-class>com.atguigu.servlet.RequestTest</servlet-class></servlet><servlet-mapping><servlet-name>Test</servlet-name><url-pattern>/login</url-pattern></servlet-mapping>
<html>
<head><title>登录页面</title><!--meta charset="UTF-8"--></head>
<body>
<h2>Hello World!</h2><%--这里提交的路径,需要寻找到项目的路径--%>
<%--${pageContext.request.contextPath}代表当前的项目 --%>
<form action="${pageContext.request.contextPath}/login" method="get">用户名:<input type="text" name="username">密码:<input type="text" name="password"><input type="submit">
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>Success</h1>
</body>
</html>
2.HttpServletRequest
1.获取前段传递的参数
2.请求转发
@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");String username = req.getParameter("username");String password = req.getParameter("password");String[] hobbys = req.getParameterValues("hobbys");//后台接收中文乱码问题System.out.println(username);System.out.println(password);System.out.println(Arrays.toString(hobbys));System.out.println("===================");//重定向
// resp.sendRedirect();//转发
// this.getServletContext()//通过请求转发//这里的斜杠代表当前的web应用req.getRequestDispatcher("/Success.jsp").forward(req,resp);}
面试题:请你聊聊重定向和转发的区别
相同点
- 页面都会实现跳转
不同点
- 请求转发的时候,url不会产生变化 307
- 重定向的时候,url地址会发生变化 302
7.Cookie、Session
7.1会话
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话
有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话;
你能怎么证明你是谁?
1.身份证
一个网站,怎么证明你来过?
客户端 服务端
1.服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了;cookie
2.服务器登记你来过了,下次你来的时候我来匹配你;seesion
7.2、保存会话的两种技术
cookie
- 客户端技术(响应,请求)
seesion
- 服务器技术、利用这个技术,可以保存用户的会话信息?我们可以把信息或数据放在Session中!
常见场景:网站登录之后,你下次不用登录了,第二次访问直接就上了!
7.3Cookie
1.从请求中拿到Cookie信息
2.服务器响应给客户端Cookie
Cookie[] cookies = req.getCookies();//获得Cookiecookie.getName()//获得Cookie中的keycookie.getValue()//获得Cookie中的valueout.write(date.toLocaleString());//date类型转Stringcookie.setMaxAge(24*60*60);//设置有效期Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");//新建Cookieresp.addCookie(cookie);//响应给客户端一个Cookie
cookie:一般会保存在本地的用户目录下appdata;
一个网站的Coolie是否存在上限!聊聊细节问题
- 一个Cookie只能保存一个信息;
- 一个web站点可以给浏览器发送多个cookie,每个站点最多存放20个Cookie
- Cookie大小有限制4kb;
- 300个Cookie浏览器上限
删除Cookie
- 不设置有限期,关闭浏览器,自动失效;
- 设置有效期时间为0
编码解码:
URLEncoder.encode("秦疆","utf-8")//编码
URLDecoder.decode(cookie.getValue(),"utf-8")//解码
7.4、Session(重点)
什么是Session:
- 服务器会给每一个用户(浏览器)创建一个Session对象;
- 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
- 用户登录之后,整个网站它都可以访问!--->保存用户的信息;保存购物车的信息...
Session
Session和Cookie的区别:
- Cookie是把用户的数据写给用户的浏览器,浏览器保存
- Session把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
- Session对象由服务器创建
使用场景:
- 保存一个登录用户的信息;
- 购物车信息;
- 经常在整个项目中或网站中经常使用的数据,保存在Session中;
使用Session:
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决乱码问题req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");resp.setContentType("text/html;Character=utf-8");//得到SessionHttpSession session = req.getSession();//给Session中存东西session.setAttribute("name",new Person("秦疆",1));//获取Session的IDString id=session.getId();//判断Session是不是新创建if(session.isNew()){resp.getWriter().write("Session创建成功,id="+id);}else{resp.getWriter().write("Session已经在服务器中存在"+id);}//Session做了什么
// Cookie jsessionid = new Cookie("JSESSIONID", "6815754D02889928D1B75B3EADDFCB07");
// resp.addCookie(jsessionid);}//得到SessionHttpSession session = req.getSession();HttpSession session1 = req.getSession();Person name = (Person) session1.getAttribute("name");resp.getWriter().write(name.toString());HttpSession session = req.getSession();session.removeAttribute("name");//手动注销sessionsession.invalidate();
会话自动过期:web.xml配置
<!--设置session默认的失效时间--><session-config><!--十五分钟后Session自动失效,以分钟为单位--><session-timeout>15</session-timeout></session-config>
8.JSP
Java Server Pages:Java服务器端页面,也和Servlet一样,用于动态Web技术!
最大的特点:
- 写JSP就像在写HTML
- 区别:
- HTML只给用户提供静态的数据
- JSP页面可以嵌入JAVA代码,为用户提供动态数据;
8.2、JSP原理
思路:JSP到底怎么执行的!
- 代码层面没有任何问题
- 服务器内部工作
- tomcat中有一个work目录;
- IDEA中使用Tomcat的会在IDEA中产生一个work目录
我电脑的地址:
C:\Users\q\.IntelliJIdea2017.3\system\tomcat\Unnamed_javaweb-session-cookie\work\Catalina\localhost\s\org\apache\jsp
发现页面转变成了Java程序!
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet!
JSP最终也会转换成一个Java类!
JSP本质也是一个Servlet
//初始化public void _jspInit() {}//销毁public void _jspDestroy() {}//JSPServicepublic void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)throws java.io.IOException, javax.servlet.ServletException {
1.判断请求
2.内置了一些对象
final javax.servlet.jsp.PageContext pageContext; //页面上下文javax.servlet.http.HttpSession session = null; //sessionfinal javax.servlet.ServletContext application; //applicationContextfinal javax.servlet.ServletConfig config; //configjavax.servlet.jsp.JspWriter out = null; //outfinal java.lang.Object page = this; //page:当前页面HttpServletRequest request //请求HttpServletResponse response //响应
3.输出页面前增加的代码
response.setContentType("text/html"); //设置响应的页面类型pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true); _jspx_page_context = pageContext;application = pageContext.getServletContext();config = pageContext.getServletConfig();session = pageContext.getSession();out = pageContext.getOut();_jspx_out = out;
4.以上的这些个对象我们可以在JSP页面中直接使用
在JSP页面中:
只要是JAVA代码就会原封不动的输出,只要是HTML代码就会被转为:
out.write("</html>\r\n");
这样的格式,输出到前端!
8.3JSP基础语法
任何语言都有自己的语法,JAVA中有...JSP作为java技术的一种应用,它拥有一些自己扩充的语法(了解,知道即可!),java所有语法都支持()
JSP表达式
<%--JSP表达式作用:用来将程序的输出,输出到客户端<%= 变量或者表达式%>--%><%= new java.util.Date()%>
JSP脚本片段
<%-- jsp脚本片段--%><%int sum=0;for (int i=0;i<=100;i++){sum+=i;}out.println("<h1>Sum="+sum+"<h1>");%>
脚本片段的再实现
<% int x=10;
out.println(x);
%><p>这是一个JSP文档</p><%int y=20;out.println(y);%><hr><%--在代码嵌入HTML元素--%><%for (int i = 0; i <100 ; i++) {%><h1>hello kuangshen <%=i%></h1>><%}%>
JSP声明
<%!static {System.out.println("Loding Servlet");}private int globalVar=0;public void kuang(){System.out.println("进入狂method");}%>
JSP声明:会被编译到JSP生成的JAVA类的类中!其他的就会被生成到_jspService方法中!
在JSP中,嵌入JAVA代码即可!
<%%>
<%=%>
<%!%><%--注释--%>
<!--HTML注释-->
JSP的注释,不会在客户端显示,HTML就会!
8.4、JSP指令
<%@ page isErrorPage="true" %><%-- @include 会将两个页面合二为一 定义的变量或常量不能重名--%><%@include file="/common/header.jsp"%><h1>网页主体</h1><%@include file="common/footer.jsp"%><%--jsp:include拼接页面,本质还是三个 定义的变量或常量可以重名--><%--jsp标签--%><jsp:include page="/common/header.jsp"/><jsp:include page="/common/footer.jsp"/>
8.5、九大内置对象
- PageContext 存东西
- Requset 存东西
- Response
- Session 存东西
- Application 【ServletContext】 存东西
- config 【ServletConfig】
- out
- page 不用了解
- Exception
pageContext.setAttribute("name1","one");//保存的数据只在一个页面中有效request.setAttribute("name2","two");//保存的数据只在一次请求中有效,请求转发会携带这个数据session.setAttribute("name3","three");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器application.setAttribute("name4","four");//打开的数据只在服务器中有效,从打开服务器到关闭服务器
request:客户端向服务器发送请求,请求的数据,用户看完就没用了,比如:新闻
session:客户端向服务器发送请求,请求的数据,用户用完一会儿还会用,比如:购物车;Hystrix
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;
8.6、JSP标签、JSTL标签、EL表达式
<!--JSP 依赖--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version></dependency><!--STANDARD 标签库--><!-- https://mvnrepository.com/artifact/taglibs/standard --><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency><!--JSTL 依赖--><!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api --><dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>jstl-api</artifactId><version>1.2</version></dependency>
EL表达式:${ }
- 获取数据
- 执行运算
- 获取web开发的常用对象
- 调用java方法(不常用)
JSP标签
<%--<jsp:include page="/common/footer.jsp"/>--%><%--
http://Locahost:8080/jsptag.jsp?name=kuangshen&shr=22
--%>
<jsp:forward page="/jsptag2.jsp"><jsp:param name="name" value="kuangshem"></jsp:param><jsp:param name="age" value="22"></jsp:param>
</jsp:forward>
JSTL表达式
JSTL标签库的是用就是为了弥补HTML标签的不足;它自定义了许多标签,可以供我们使用,标签的功能就和java代码一样!
格式化标签
SQL标签
XML标签
核心标签(必须掌握)
JSTL标签库使用步骤:
- 引入对应的taglib
- 使用其中的方法
- 在Tomcat也需要引入jstl的包,否则会报错:JSTL解析错误
- c:if
<head><title>Title</title>
</head>
<body><h4>if测试</h4><hr><form action="coreif.jsp" method="get">
<%--
EL表达式获取表单中的数据
${<param.参数名}
--%>
<input type="text" name="username" values="${param.username}">
<input type="submit" value="登录">
</form>
<%--判断如果提交的用户名是管理员,则登录成功--%><%if ("admin".equals(request.getParameter("username"))) {out.print("登陆成功");}
%><c:if test="${param.username=='admin'}" var="isAdmin"><c:out value="登陆成功"></c:out>
</c:if><c:out value="${isAdmin}"/></body>
- c:choose
- c:when
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><%--定义一个变量score,值为90--%>
<c:set var="score" value="90"/><c:choose><c:when test="${score>=90}">你的成绩为优秀</c:when><c:when test="${score>=80}">你的成绩为良好</c:when><c:when test="${score>=60}">你的成绩为合格</c:when><c:when test="${score<60}">你的成绩为不合格</c:when></c:choose>
</body>
</html>
c:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%ArrayList<String> people = new ArrayList<>();people.add(0,"张三");people.add(1,"李四");people.add(2,"王五");people.add(3,"赵六");people.add(4,"田七");request.setAttribute("list",people);
%><%--
var 每一次遍历出来的变量
items 要遍历的对象
begin 哪里开始
end 到哪里
step 步长
--%>
<c:forEach var="people" items="${list}"><c:out value="${people}"/> <br></c:forEach><hr><c:forEach begin="0" end="4" var="people" items="${list}" step="2"><c:out value="${people}"/> <br></c:forEach>
</body>
</html>
9、JavaBean
实体类
JavaBean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法;
- 一般用来和数据库的字段做映射 ORM;
ORM编程思想:对象关系映射
- 表--->类
- 字段--->属性
- 行记录--->对象
id | name | age | address |
1001 | 张小龙 | 39 | 深圳 |
1002 | 宫玉龙 | 25 | 凤阳 |
1003 | 陈小小 | 24 | 湖州 |
class People{private int id;private String name;private int age;private String address;private People(int id,String name, int age, String address) {this.id=id;}private People() {}
}
10、MVC三层加工
什么是MVC? Model View Controller 模型、视图、控制器
10.1、早些年三层架构
用户直接访问控制层、控制层就可以直接操作数据库;
servlet --->CRUD--->数据库
弊端:程序十分臃肿,不利于维护 servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码架构:没有什么是加一层解决不了的!
程序员调用
|
JDBC
|
Mysql Oracle SqlServer ....
10.2、MVC三层架构
Model
- 业务处理:业务逻辑(Service)
- 数据持久层:CRUD(Dao)
View
- 展示数据
- 提供连接发起Servlet请求(a,from,img...)
Controller
- 接受用户请求:(req:请求参数、Seesion信息....)
- 交给业务层处理对应的代码
- 控制视图的跳转
登录--->接受用户的登录请求--->处理用户的请求(获取用户登录的参数,username、password)---
>交给业务层处理登录业务(判断用户名密码是否正确:事务)--->Dao层查询用户名和密码是否正确---
>数据库
11、Filter(重点)
Shiro安全框架
Filter:过滤器,用来过滤网站的数据;
- 处理中文乱码
Filter开发步骤:
- 导包
- 编写过滤器
- 导包不要错
实现Filter接口,重写对应的方法即可
public class charcterEncodingFilter implements Filter{//初始化:web服务器启动,就已经初始化了,随时等待过滤对象出现@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("charcterEncodingFilter初始化");}//链/*1.过滤中的所有代码,在过滤特定请求的时候都会执行2.必须要让过滤器继续同行*/@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {response.setCharacterEncoding("utf-8");request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");System.out.println("characterEncodingFilter执行前....");chain.doFilter(request,response);//让我们的请求继续走,如果不写,程序到这里就被拦截停止!System.out.println("characterEncodingFilter执行后....");}//销毁:web服务器关闭的时候,过滤器会销毁@Overridepublic void destroy() {System.out.println("charcterEncodingFilter已销毁");}
}
3.在web.xml中配置过滤器
<filter><filter-name>characterEncodingFilter</filter-name><filter-class>com.atguigu.filter.charcterEncodingFilter</filter-class></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><!--只要是/servlet的任何请求,都会经过这个过滤器--><url-pattern>/servlet/*</url-pattern></filter-mapping>
12、监听器
实现一个监听器的接口:()
1.编写一个监听器
实现监听器的接口
//统计网站在线人数:
public class OnLineCountListener implements HttpSessionListener{//创建session监听:看你的一举一动//一旦创建Session就会触发一次这个事件!@Overridepublic void sessionCreated(HttpSessionEvent se) {ServletContext ctx = se.getSession().getServletContext();Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");System.out.println(se.getSession().getId());if (onlineCount==null){onlineCount=new Integer(1);}else{int count= onlineCount.intValue();onlineCount =new Integer(count+1);}ctx.setAttribute("OnlineCount",onlineCount);}//销毁session监听//一旦销毁Session就会触发一次这个事件!@Overridepublic void sessionDestroyed(HttpSessionEvent se) {ServletContext ctx = se.getSession().getServletContext();Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");if (onlineCount==null){onlineCount=new Integer(0);}else{int count= onlineCount.intValue();onlineCount =new Integer(count-1);}ctx.setAttribute("OnlineCount",onlineCount);}/*Session销毁:1.手动销毁 getSession().invalidate();2.自动销毁* */
}
2.web.xml中注册监听器
<session-config><session-timeout>1</session-timeout><!--一分钟自动销毁--></session-config>
3.看情况是否使用!
13、过滤器、监听器常见应用
监听器:GUI编程中经常使用;
public class TestPanle {public static void main(String[] args) {Frame frame = new Frame("中秋节快乐");//新建一个窗体Panel panel=new Panel(null);//面板frame.setLayout(null);//设置窗体的布局frame.setBounds(300,300,500,500);frame.setBackground(new Color(160,180,140));//设置背景颜色panel.setBounds(50,50,300,300);panel.setBackground(new Color(255,100,50));//设置背景颜色frame.add(panel);frame.setVisible(true);//监听事件:监听关闭事件frame.addWindowListener(new WindowListener() {@Overridepublic void windowOpened(WindowEvent e) {System.out.println("打开");}@Overridepublic void windowClosing(WindowEvent e) {System.out.println("关闭ing");System.exit(0);}@Overridepublic void windowClosed(WindowEvent e) {System.out.println("关闭ing");}@Overridepublic void windowIconified(WindowEvent e) {}@Overridepublic void windowDeiconified(WindowEvent e) {}@Overridepublic void windowActivated(WindowEvent e) {System.out.println("激活");}@Overridepublic void windowDeactivated(WindowEvent e) {System.out.println("未激活");}});frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {super.windowClosing(e);}});}}
用户登录之后才能进入主页!用户注销后就不能进入主页了!
在javaweb编程进行jsp页面跳转时,点击提交按钮无反应,来回检查许多遍相关文件配置,最终发现是将form写成了from,所以有时候细节真的害死人
1.用户登录之后,向Session中放入用户的数据
2.进入主页的时候要判断用户是否已经登录;要求:在过滤器中实现!
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req= (HttpServletRequest) request;HttpServletResponse resp= (HttpServletResponse) response;Object userSession = req.getSession().getAttribute(Constant.USER_SESSION);if (userSession==null){resp.sendRedirect("/login.jsp");}chain.doFilter(request, response);}
14、JDBC
什么是JDBC:java连接数据库!
需要jar包的支持:
java.sql
javax.sql
实验环境搭建:
USE jdbc
CREATE TABLE users(
id INT PRIMARY KEY,
`name` VARCHAR(40),
`password` VARCHAR(40),
email VARCHAR(60),
birthday DATE
);SELECT *FROM usersINSERT INTO users(id,`name`,`password`,email,birthday)
VALUES
(2,'李四','123456','ls@qq.com','2000-01-10'),
(3,'王五','234567','ww@qq.com','2001-01-10'),
(4,'赵一','345678','zy@qq.com','2002-01-10'),
(5,'钱二','456789','qs@qq.com','2001-01-10')
导入数据库依赖:
<dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version></dependency></dependencies>
IDEA中连接数据库:
JDBC连接:
1.配置信息
2.加载驱动
3.连接数据库
4.向数据库发送SQL的对象
5.编写SQL
6.执行查询SQL,返回ResultSet结果集
7.关闭连接,释放资源(一定要做)先开后关
public class TestJdbc {public static void main(String[] args) {//1.配置信息//useUnicode=true&characterEncoding=utf-8解决中文乱码String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";String username="root";String password="love521.";Connection conn=null;Statement st=null;ResultSet rs=null;try {//2.加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//3.连接数据库conn = DriverManager.getConnection(url, username, password);System.out.println(conn);//4.向数据库发送SQL的对象Statement:CRUDst = conn.createStatement();//5.编写SQLString sql="select * from users";//6.获取结果集rs = st.executeQuery(sql);while (rs.next()){System.out.print("id="+rs.getObject("id"));System.out.print("name="+rs.getObject("name"));System.out.print("password="+rs.getObject("password"));System.out.print("email="+rs.getObject("email"));System.out.println("birthday="+rs.getObject("birthday"));}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {//7.关闭连接,释放资源(一定要做)if (rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(st!=null){try {st.close();} catch (SQLException e) {e.printStackTrace();}}if(conn!=null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
预编译SQL语句:
public class TestJdbc2 {public static void main(String[] args) {//1.配置信息//useUnicode=true&characterEncoding=utf-8解决中文乱码String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";String username="root";String password="love521.";Connection conn=null;Statement st=null;ResultSet rs=null;try {//2.加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//3.连接数据库conn = DriverManager.getConnection(url, username, password);System.out.println(conn);//4.编写SQLString sql="insert into users(id,name,password,email,birthday) VALUES (?,?,?,?,?)";//5.向数据库发送SQL的对象Statement:CRUDPreparedStatement ps = conn.prepareStatement(sql);//填充SQL语句并执行ps.setInt(1,6);ps.setString(2,"qingjiang");ps.setString(3,"123456");ps.setString(4,"qingjiang@qq.com");ps.setDate(5,new Date(2345653421L));int i = ps.executeUpdate();if (i>0){System.out.println("ok");}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {//7.关闭连接,释放资源(一定要做)if (rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(st!=null){try {st.close();} catch (SQLException e) {e.printStackTrace();}}if(conn!=null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
事务
要么都成功,要么都失败
ACID原则:保护数据的安全
开启事务
事务提交 commit()
事务回滚 rollback()
关闭事务
转账:
A:1000
B:1000
A(900) ---> 100 ---> B(1100)
JavaWeb-狂神-P11相关推荐
- 文件上传(JavaWeb 狂神笔记)
跟着狂神的代码看一天了,泪目,我终于成功了!特此记录~ 我的环境:IDEA 2020,Tomcat 9.0.24,Maven 3.8.1 (环境其实要求应该没那么严,我跟狂神的也不完全一样~) 视频链 ...
- 【狂神说】JavaWeb笔记整理 | SMBMS项目 | 文件上传和邮件发送
目录 JavaWeb 1.基本概念 1.1 概念 1.2 web应用程序: 1.3 静态web 1.4 动态web 2.web服务器 2.1 技术讲解 2.2 web 服务器 3. Tomcat 3. ...
- JavaWeb笔记01
文章目录 JavaWeb(狂神说Java) 1.基本概念 1.1前言 1.2web应用程序 1.3静态web 1.4 动态web 2.web服务器 2.1技术讲解 2.2web服务器 3.Tomcat ...
- MySQL总结__狂神说Java
1.初识MySQL JavaEE:企业级Java开发 Web 前端(页面:展示:数据) 后台 (连接点:连接数据库JDBC,连接前端(控制视图跳转,给前端传递数据)) 数据库(存数据,Txt,Exce ...
- Java全栈系列笔记
Java全栈系列笔记 全部文档.项目.源码: github:https://github.com/name365/Blog-Java 码云:https://gitee.com/yang365/Blog ...
- JavaWeb(狂神老师上课笔记)
JavaWeb Java Web 1.基本概念 1.1.前言 web开发: web,网页的意思 , www.baidu.com 静态web html,css 提供给所有人看的数据始终不会发生变化! 动 ...
- B站狂神说JavaWeb学习笔记
JavaWeb学习笔记(根据b站狂神说java编写) 1.基本概念 1.1 前言 静态Web: 提供给所有人看数据不会发生变化! HTML,CSS 动态Web: 有数据交互,登录账号密码,网站访问人数 ...
- 【狂神说Java】JavaWeb入门到实战(学习笔记)
学习视频来自B站 狂神说 JavaWeb视频: https://www.bilibili.com/video/BV12J411M7Sj?p=1 文章目录 1.基本概念 1.1 前言 1.2 Web 应 ...
- B站狂神 JavaWeb 1-6
Java Web 学习(上) 本博客基于B站狂神老师的JavaWeb课程,地址:https://space.bilibili.com/95256449,记录自己的代码和老师的笔记,同时也会有自己关于这 ...
- 【狂神说Java】JavaWeb入门到实战--Maven详解
目录 狂神视频地址 1.Maven项目架构管理工具 2.下载安装Mavne 3.配置环境变量 4.阿里云镜像 5.本地仓库 6.在idea中使用maven 7.创建一个普通的maven项目 8.标记文 ...
最新文章
- linux命令:du,看文件大小
- vb使用字符串分隔字符串_为什么要使用字符串
- 还在担心没有服务器做不了数据分析?这个免费资源看一下!
- 【Nginx那些事】nginx配置实例(四)搭建高可用集群
- Python Profiler 列举
- 如何利用Printconfig dll:从 iPhone 到 NT AUTHORITY\SYSTEM 的真实案例
- 手机扣费软件大曝光 金山手机卫士帮您免费检测
- 未定义标识符_ConnectionPtr
- mysql 查询 int类型日期转换成datetime类型
- 远程办公安全解决方案
- C语言将txt文本文档数据重新排序并放至新txt文本文档中
- ERP生产线管理系统 with WAMP
- 【论文写作】投稿心路
- 如何将PDF转换成图片
- STM32CubeMX - 系统框图
- Gerber文件介绍
- 有一天,你不上班后,打算干什么?
- 代码随想录第四天 leetcode 24、19、206
- java 大量数据返回_怎么接收第三方接口返回的大量数据?
- 微信关注二维码不显示
热门文章
- MAXENT模型生物多样性
- 夜天之书 #59 饱和沟通:开源社群的消息传递准则
- 富文本插件 和回显 vue-quill-editor
- 纽约时报杂志关于区块链最好的一篇深度报道
- pytecplot做图命令总结
- 【Codeforces】1665E MinimizOR 题解
- Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts
- idea中的.iml和.idea能删除么——可以
- java毕设项目车牌号码识别系统开源了,很好玩,建议尝试
- node.js云学堂微信小程序学习系统的设计与实现毕业设计源码011735