out
request
response
session
application
pageContext
config
page
exception
作用:主要用来向客户端输出数据
clear() 清空缓冲区;
clearBuffer() 清空当前区的内容;
close() 先刷新流,然后关闭流;
flush() 刷新流;
getBufferSize() 以字节为单位返回缓冲区的大小;
getRemaining() 返回缓冲区中没有使用的字符的数量;
isAutoFlush()返回布尔值,自动刷新还是在缓冲区溢出时抛出IOException异常
<body> <h1>out内置对象</h1> <% out.println("<h2>静夜思</h2>");//可以在println();里面加入标签 out.println("床前明月光"); out.println("疑是地上霜"); out.flush(); out.clear();//这里会抛出异常,因为上面有flush out.clearBuffer();//这里不会抛出异常 out.println("举头望明月"); out.println("低头思故乡"); %> 缓冲区大小:<%=out.getBufferSize() %>byte<br> 缓冲区剩余大小:<%=out.getRemaining() %>byte<br> 是否自动清空缓冲区:<%=out.isAutoFlush() %><br> </body>描述:来自客户端的请求经Servlet容器处理后,由request对象进行封装。注:客户端和服务器的一次通信就是一次请求(发送请求或得到相应)。
作用域:request。说明,这次请求结束后,它的生命周期 就结束了。
⭐️Get请求和Post的区别:get参数通过URL传递,post放在request body中。安全性:post比get安全。请求缓存:GET 会被缓存,而post不会。
Get请求上传的数据不能大于2KB(是因为浏览器对于URL的长度有限制),而Post请求对于传输的数据理论上来说是没有限制的。所以,在JavaWeb开发中,对于文件的上传的表单的提交方法必须为“Post”方式
getParameterValues(key) 获取提交表单的一组数据(用于获取数组的数据)
request.getRequestDispatcher(“list.jsp”).forward(request,response) 转发(通过代码的方式进行转发)
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <form action="request-receiver.jsp" method="post"> 11 username:<input type="text" name="user"/><br/> 12 password:<input type="password" name="pwd"/><br/> 13 14 <input type="submit" name="登陆"/> 15 16 </form> 17 </body> 18 </html> <% 2 //获取请求数据 3 //设置请求方式的编码 4 request.setCharacterEncoding("UTF-8"); 5 String name = request.getParameter("user"); 6 String pwd = request.getParameter("pwd"); 7 System.out.println(name+","+pwd); 8 9 if("smyh".equals(name) && "007".equals(pwd)) { 10 out.println("登陆成功"); 11 request.setAttribute("age", "22"); 12 request.getRequestDispatcher("request-success.jsp").forward(request, response); 13 14 }else{ 15 out.println("errors"); 16 } 17 %> 如果用户名密码正确,就将这个请求转发给"request-success.jsp".forward(request, response)表示当前的请求对象和当前的响应对象。request.setAttribute(key,object) 设置请求对象的属性
request.getAttribute(key) 获取请求对象的属性
<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 欢迎你,<%=request.getParameter("user") %> <br/> 11 年龄:<%=request.getAttribute("age") %> 12 13 </body> 14 </html> request.setCharacterEncoding(“UTF-8”) 对请求数据重新编码System.out.println("request.getRemoteAddr(): " + request.getRemoteAddr()); 获得客户端的ip地址System.out.println("request.getRemoteHost(): " + request.getRemoteHost());获得客户端的主机名System.out.println(request.getContextPath());获取项目名;request.getServletContext().getRealPath("/");//获取web服务器项目的真实物理(绝对)路径;//😄:\java\apache-tomcat-9.0.37-windows-x64\apache-tomcat-9.0.37\webapps\tmail\ ;request.getRequestURI(); 返回除去host(域名或者ip)部分的路径:/tmail/welcome.jspquest.getParameterMap()方法也是通过前台表单中的name值进行获取的,获取到后又进行了一次封装。 之所以返回的map中的value为字符串类型的数组,是为了解决表单中有多个name值一样的项。****
request.getParameterMap()返回的是一个Map类型的值,该返回值记录着前端(如jsp页面)所提交请求中的请求参数和请求参数值的映射关系。这个返回值有个特别之处——只能读。不像普通的Map类型数据一样可以修改。
对request.getParameterMap()的返回值使用泛型时应该是Map<String,String[]>形式,因为有时像checkbox这样的组件会有一个name对应对个value的时候,所以该Map中键值对是String[]>的实现。
response.sendRedirect(“页面”):页面跳转。注意,之前的forward是转发,这里是跳转,注意区分。
//重定向;服务端的两次页面跳转,显示跳转地址 //response.send ("success.jsp"); //转发(服务端的一次页面跳转,是服务器的一次行为) //request.getRequestDispatcher("success.jsp").forward(request, response);response.setCharacterEncoding(“utf-8”):设置响应编码
<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 //获取请求数据 5 //设置请求方式的编码 6 request.setCharacterEncoding("UTF-8"); 7 String name = request.getParameter("user"); 8 String pwd = request.getParameter("pwd"); 9 System.out.println(name+","+pwd); 10 11 12 if("smyh".equals(name) && "007".equals(pwd)) { 13 out.println("登陆成功"); 14 request.setAttribute("age", "22岁"); 15 request.getRequestDispatcher("request-success.jsp").forward(request, response); 16 17 }else{ 18 //out.println("errors"); 19 response.setCharacterEncoding("UTF-8"); //设置响应的编码 20 //设置响应内容的类型 21 response.setContentType("text/html;charset=UTF-8"); 22 response.sendRedirect("response.jsp"); 23 } 24 %>19行至22行是添加的代码:如果用户名、密码错误,就调到response.jsp页面去。
新建response.jsp,代码如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 不好意思,登陆失败。 11 </body> 12 </html>注意第06行的“content=text/html”,表示:指定服务器返回的数据类型。
运行程序,当输入的用户名、密码错误后,效果如下:(注意url)
重定向和转发:
重定向的意思是说,当页面进行跳转之后,request和response的生命周期已经结束,完全交给下一个页面去处理了(连url都变了);而转发的时候,还可以往request里面添加携带参数(url不变)。
描述:表示一个会话,用来保存用户信息,以便跟踪每个用户的状态。(不要用来保存业务数据,request)
定义:是指在一段时间内客户端和服务器之间的一连串的相关的交互过程。
作用域:session。
如果是第一次接触“会话”这个概念,需要重复一下。说白了,客户端与服务器之间可能需要不断地进行数据交互(请求与相应),这个过程就可以理解为一段回话。Tomcat默认的会话时间为30分钟,这段时间内如果没有交互,会话结束;下次客户端一旦发送请求,重新创建会话。当客户端第一次发送请求的时候,才会创建一个会话。session的生命周期比request长
session.getid():取得session的id号.id由tomcat自动分配。
session.isnew():判断session时候是新建的
session.setAttribute(key,object):往当前会话中设置一个属性(保证会话的安全)【常用于跳转页面之前】
session.getAttribute(key):获取当前会话中的一个属性
session.removeAttribute(key):删除当前会话中的属性
session.setMaxInactiveInterval(10006030):设置当前会话失效时间(ms) 。Tomcat默认的会话时间为30分钟。
session.invalidate():初始化当前会话对象(一般在推出的时候使用,可以删除当前会话的数据)
会话结束的条件之一:
服务器关闭会话过期(一段会话时间默认为30分钟)手动终止会话类型:javax.servlet.ServletContext
描述:从servlet配置对象获得的servlet上下文
作用域:application
这个对象的生命周期是最长的。服务器启动的时候就会创建application对象。从服务器存在到服务器终止,都一直存在,且只保留一个对象,所有用户共享一个application。不是很常用。
page:当前页面。
request:一次请求。//重定向response.sendRedirect(“success.jsp”);(得不到request的数据,因为客户端进行了两次请求request不一样) //转发(服务端的一次页面跳转,是服务器的一次行为) //request.getRequestDispatcher(“success.jsp”).forward(request, response);(可以拿到request的数据,只进行了一次请求)
session:关闭浏览器,或者session过期。或者设置session.invalidate()使session过期。
application:服务器重启。
描述:本JSP的页面上下文。
作用域:page
注:上下文的理解:上下文可以联系到当前页面所有的信息
1.创建Cookie,以键值对的方式存储: Cookie[] cookie = request.getCookies();
2.Cookie的生命周期: setMaxAge();
cookie.setMaxAge(-1):cookie的maxAge属性的默认值就是-1,表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么cookie就会消失*。
cookie.setMaxAge(0):cookie生命等于0是一个特殊的值,它表示cookie被作废!也就是说,如果原来浏览器已经保存了这个Cookie,那么可以通过Cookie 的setMaxAge(0)来删除这个Cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个Cookie。
3.获取Cookie的名称: getName();
4.设置Cookie的值: setValue();
5.获取Cookie的值: getValue();
<% Cookie[] cookie = request.getCookies(); String name = ""; String pwd = ""; for (Cookie c : cookie) { if (c.getName().equals("UNAME")) { name = c.getValue(); } if (c.getName().equals("UPWD")) { pwd = c.getValue(); } } %> </head> <body> <form method="post" action="loginSubmitCookie.jsp" name="loginForm"> 用户名:<input type="text" name="username" value="<%=name%>" /><br /> 密 码:<input type="password" name="userpwd" value="<%=pwd%>" /><br /> <input type="checkbox" name="fLogin" value="1" />记住我<br /> <input type="submit" value="登陆" /> </form> </body> <body> <% String name = request.getParameter("username"); String pwd = request.getParameter("userpwd"); String fLogin = request.getParameter("fLogin"); out.println(fLogin); if ("admin".equals(name) && "123".equals(pwd)) { if ("1".equals(fLogin)) { Cookie cookName = new Cookie("UNAME", name); cookName.setMaxAge(10); response.addCookie(cookName);//将Cookie信息写回到客户端浏览器中 Cookie cookPwd = new Cookie("UPWD", pwd); cookPwd.setMaxAge(10); response.addCookie(cookPwd);//将Cookie信息写回到客户端浏览器中 } } %> </body>Cookie就是服务器保存在客户端的数据;
Cookie采用客户端存储,Session采用的服务端存储的机制。
session依赖于cookie(原因:客户端与服务器之间保持状态的解决方案,sessionID存储在浏览器端的cookie里,当浏览器发送请求的时候,服务器用一个sessionID来区分是哪个用户session变量,要不然服务器怎么知道是那个用户发过来的请求呢)。
session一直存储在服务器内存中。当浏览器不变时请求的是同一个Session。当浏览器关闭时候,再打开session就会发生变化(“只要关闭浏览器,session就消失了”),原因:其实关闭浏览器前的session并没有消失,只是在关闭浏览器的时候seesionId消失了,再次打开浏览器时无法找到原来的session了,如果把原来的sessionId再发服务器,还是能找到原来的Session。
cookie 当设置cookie不设置生命周期时,保存在内存中,当关闭浏览器时cookie被清空。当设置生命周期时候,cookie被保存在硬盘中,所以当关闭浏览器,再打开还是可以访问到,直到生命周期结束。
sessionId 默认(通过Cookie)存储在浏览器的内存中,所以关闭浏览器,sessionId会消失。
Page指令为容器提供当前页面的使用说明,Page指令一般位于jsp页面顶端。**一个JSP页面可以包含多个page指令。**Page指令的语法格式:
buffer指定out对象使用缓冲区的大小autoFlush控制out对象的 缓存区contentType指定当前JSP页面的MIME类型和字符编码errorPage指定当JSP页面发生异常时需要转向的错误处理页面isErrorPage指定当前页面是否可以作为另一个JSP页面的错误处理页面extends指定servlet从哪一个类继承import导入要使用的Java类info定义JSP页面的描述信息isThreadSafe指定对JSP页面的访问是否为线程安全language定义JSP页面所用的脚本语言,默认是Javasession指定JSP页面是否使用sessionisELIgnored指定是否执行EL表达式isScriptingEnabled确定脚本元素能否被使用例如
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*,java.time.*" %>JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。Include指令的语法格式如下:
<%@ include file="relative url" %> || isELIgnored | 指定是否执行EL表达式 | | isScriptingEnabled | 确定脚本元素能否被使用 |
例如
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*,java.time.*" %>JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。Include指令的语法格式如下:
<%@ include file="relative url" %>