目录
- JSP内置对象
- request
- request对象的常用方法
- get与post区别
- 问题
- 解决表单提交时中文乱码的问题
- response
- response对象的常用方法
- 思考
- 请求的转发
- 示例
- 转发与重定向的区别
- 会话
- session对象
- 常用方法
- session与窗口的关系
- 示例:使用session实现访问控制
- 思考
- 小结
- 思考
- JSP页面中的包含操作
- 动态包含与静态包含的区别
- application
- application对象的常用方法
- 示例:统计网站访问次数的实现
- JSP四大作用域
- 思考
- Cookie
- Cookie的作用
- 安全性能
- 在JSP中使用Cookie
- Cookie类的常用方法
- session与Cookie的关系
- session的工作原理
- cookie的工作原理
- session与Cookie的区别
JSP内置对象
JSP内置对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP所支持的九大内置对象:
对象名 | 类型 | 说明 |
---|---|---|
request | javax.servlet.http.HttpServletRequest | 每当客户端请求JSP页面时,JSP引擎会制造一个新的request对象来代表这个请求。 |
response | javax.servlet.http.HttpServletResponse | 当服务器创建request对象时会同时创建用于响应这个客户端的response对象 |
session | javax.servlet.http.HttpSession | session对象用来跟踪在各个客户端请求间的会话 |
application | javax.servlet.ServletContext | 该对象代表web应用本身,整个web应用共享一个application对象 |
config | javax.servlet.ServletConfig | 这个对象允许开发者访问Servlet或者JSP引擎的初始化参数。 |
exception | java.lang.Throwable | 这个对象包装了从先前页面中抛出的异常信息 |
out | javax.servlet.jsp.JspWriter | out对象用来在response对象中写入内容 |
pageContext | javax.servlet.jsp.PageContext | 页面上下文对象,这个对象存储了内置对象的引用。 |
page | java.lang.Object当前对象this | 这个对象就是页面实例的引用。它可以被看做是整个JSP页面的代表 |
request
- 主要用于处理客户端请求。
- request对象中保存了用户的请求数据和浏览器的相关信息,通过调用相关方法就可以实现请求数据的读取。
request对象的常用方法
方法名称 | 说明 |
---|---|
String getParameter(String name) | 根据表单组件名称获取提交数据 |
String[ ] getParameterValues(String name) | 获取表单组件对应多个值时的请求数据 |
void setCharacterEncoding(String charset) | 指定每个请求的编码 |
RequestDispatcher getRequestDispatcher(String path) | 返回一个RequestDispatcher对象,该对象的forward( )方法用于转发请求 |
<form name="form1" method="post" action=“util/doreg.jsp">
<div class="form-group">
<label for="userName">用户名</label>
<input id="userName" name="userName" required type="text" class="form-control" placeholder="6-15位字母或数字" >
</div>
<!—省略其他表单元素-->
</form>
get与post区别
比较项 | get | post |
---|---|---|
参数出现在URL中 | 是 | 否 |
长度限制 | 有 | 无 |
安全性 | 低 | 高 |
URL可传播 | 是 | 否 |
问题
产生这种结果的原因是Tomcat中对于post方法提交的表单采用的默认编码为ISO-8859-1,而这种编码格式不支持中文字符。
解决表单提交时中文乱码的问题
- post请求出现乱码
request.setCharacterEncoding(“utf-8”); - get请求出现乱码
治标的方法:new String(s.getBytes(“iso-8859-1”),“utf-8”);
治本的方法:配置tomcat\conf\server.xml文件
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
response
response对象用于响应客户请求并向客户端输出信息
response对象的常用方法
方法名称 | 说明 |
---|---|
void addCookie(Cookie cookie) | 给客户端添加一个Cookie对象,以保存客户端的信息 |
PrintWriter getWriter() | 返回一个输出字符流 |
void sendRedirect() | 将请求重新定位到一个不同的URL,即页面重定向 |
void setCharacterEncoding(String encoding) | 设置字符编码类型为encoding |
思考
- 页面实现跳转了,请求的信息是否也一起转移呢?
- 如何才能实现页面跳转后,请求信息不丢失呢?
- 使用转发取代重定向实现页面跳转
请求的转发
- 转发的作用
在服务器端,将请求发送给服务器上的其他资源,以共同完成一次请求的处理 - 转发的实现
RequestDispatcher对象的forward()方法
示例
<%
RequestDispatcher rd = request.getRequestDispatcher("welcome.jsp");
rd.forward(request, response);
%>
转发与重定向的区别
转发 | 重定向 |
---|---|
转发是在服务器端发挥作用,将同一请求在服务器资源之间进行传递 | 重定向是在客户端发挥作用,通过发送一个新的请求实现页面转向 |
客户端浏览器的地址栏不会显示转向后的地址 | 在地址栏中可以显示转向后的地址 |
会话
- 会话就是在一段时间内,一个客户端与Web服务器的一连串相关的交互过程。
- 会话可以在多次请求中保存和使用数据。
- 在JSP中使用session对象实现会话的存取。
session对象
- session机制是一种服务器端的机制,在服务器端保存信息。
- 用于存储与用户相关的会话信息
常用方法
方法名称 | 说明 |
---|---|
void setAttribute(String key,Object value) | 以key/value的形式保存对象值 |
Object getAttribute(String key) | 通过key获取对象值 |
void invalidate() | 设置session对象失效 |
String getId() | 获取sessionid |
void setMaxInactiveInterval(int interval) | 设定session的非活动时间 |
int getMaxInactiveInterval() | 获取session的有效非活动时间(以秒为单位) |
void removeAttribute(String key) | 从session中删除指定名称(key)所对应的对象 |
session与窗口的关系
- 每个session对象都与一个浏览器窗口对应 ,重新开启一个浏览器窗口,可以重新创建一个session对象(不同版本浏览器可能有所差别)
- 通过超链接打开的新窗口,新窗口的session与其父窗口的session相同
- 每个session都有一个唯一的sessionid
示例:使用session实现访问控制
- 在登录处理页面获取用户请求的登录信息进行验证
<%
if ("admin".equals(userName) && “0".equals(userPwd)) {
session.setAttribute("loginUser", user);
// 设置session过期时间
session.setMaxInactiveInterval(10*60);
response.sendRedirect("../manage/index.jsp");
}
else {
response.sendRedirect(“../index.jsp");
}
%>
- 在管理员首页获取用户的登录会话信息进行验证
<%
User loginUser = (User) session.getAttribute(“loginUser");
if (loginUser == null) {
out.println(“<script>alert(‘未登录的用户不能进入管理页面');location.href='../index.jsp';</script>");
} %>
思考
- session的数据是在服务器端的,服务器保存的会话数据量会越来越大,若没有清理机制,会导致性能问题或服务器崩溃。
- 如何清理服务器端的会话数据 ??
会话的清除和过期有两种形式。
- 程序主动清除session数据
- 设置会话失效:session.invalidate();
- 只移除会话的一个属性:session. removeAttribute(String name);
- 服务器主动清除长时间没有再次发出请求的session
-
通过setMaxInactiveInterval(int interval )方法,单位是秒
<% session.setAttribute("loginUser",user); session.setMaxInactiveInterval(600); response.sendRedirect("admin.jsp"); %>
-
修改tomcat服务器的web.xml,单位是分钟
<session-config> <session-timeout>30</session-timeout> </session-config>
-
小结
- 用浏览器访问服务器——产生会话
- 通过浏览器在网站登录——在会话中保存数据
- 登录成功后用个人身份进行访问——会话有效期内
- 关闭了浏览器——结束会话
- 服务器主动结束会话——会话到期
- 使会话失效、删除属性——及时释放会话资源
- 程序主动结束会话、会话到期——会话中的数据丢失
思考
通过之前的编码,我们实现了后果管理首页的权限,只有登录的管理员才可以进入后台首页,直接输入后台管理首页是无法进入的。实际上,后台的其它管理页面中同样需要加入登录验证,那就需要把以上代码编写多遍,有没有办法避免冗余代码的出现?
解决方案:JSP页面的包含操作
JSP页面中的包含操作
在JSP中实现页面包含的方式有两种:
- 使用<%@include%>指令实现静态包含
<%@include file=“URL”%>
- 使用jsp:include标签实现动态包含
<jsp:include page=“URL”>
动态包含与静态包含的区别
静态包含 | 动态包含 |
---|---|
<%@include%> | jsp:include |
先将页面包含,后执行页面代码,即将一个页面的代码复制到另一个页面中。 | 先执行页面代码,后将页面包含,即将一个页面的运行结果包含到另一个页面中。 |
被包含的页面内容发生变化时,包含页面将会被重新编译。 | 被包含页面内容发生变化时,包含页面不会重新编译。 |
application
- application对象代表web应用本身,整个web应用共享一个application对象,该对象主要用于在多个JSP页面或者Servlet之间共享变量。
- application对象开始于服务器的启动,终止于服务器的关闭。
- application对象实现了用户间的数据共享,可以存放全局变量。
application对象的常用方法
方法名称 | 说 明 |
---|---|
void setAttribute(String key,Object value) | 以key/value的形式保存对象值 |
Object getAttribute(String key) | 通过key获取对象值 |
String getRealPath(String path) | 返回相对路径的真实路径 |
示例:统计网站访问次数的实现
<%
Integer count = (Integer) application.getAttribute("count");
if (count != null) {
count = 1 + count;
} else {
count = 1;
}
application.setAttribute("count", count);
%>
<%
Integer i = (Integer) application.getAttribute("count");
out.println("您好,您是第 " + i + " 位访问本网站的用户");
%>
JSP四大作用域
名称 | 对应的内置对象 | 说 明 |
---|---|---|
page作用域 | pageContext 对象 | 在一个页面范围内有效,通过pageContext对象访问 |
request作用域 | request对象 | 在一个请求范围内有效 |
session作用域 | session对象 | 在一次会话范围内容有效 |
application作用域 | application对象 | 在一个应用服务器范围内有效 |
思考
京东购物车会自动记录已经放入购物车的物品 ??
解决方案:使用Cookie保存客户端的信息
Cookie
- 浏览器与WEB服务器之间是使用HTTP协议进行通信的,当某个用户发出页面请求时,WEB服务器进行响应后就关闭与该用户的连接。当一个请求发送到WEB服务器时,无论其是否是第一次来访,服务器都会把它当作第一次来对待,这样的不好之处可想而知。
- 为了弥补这个缺陷,Netscape开发出了Cookie这个有效的工具来保存某个用户的识别信息,因此人们昵称为“小甜饼”。
- Cookie是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段:Netscape Navigator使用一个名为cookies.txt本地文件保存从所有站点接收的Cookie信息;当用户再次访问某个站点时,服务端将要求浏览器查找并返回先前发送的Cookie信息,来识别这个用户。
- Cookie是Web服务器保存在客户端的一系列文本信息
Cookie的作用
- 对特定对象的追踪(Cookie能告诉在线广告商广告被点击的次数,从而可以更精确的投放广告)
- 实现各种个性化服务(Cookie能帮助站点统计用户个人资料以实现各种各样的个性化服务)
- 简化登录(Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况下进入曾经浏览过的一些站点)
安全性能
- 容易泄露信息
在JSP中使用Cookie
//创建Cookie对象
Cookie newCookie = new Cookie(String key, String value);
//由服务器端向客户端写入Cookie对象
response.addCookie(newCookie);
//读取客户端的Cookie对象
Cookie[] cookies = request.getCookies();
Cookie类的常用方法
方法名称 | 说 明 |
---|---|
void setMaxAge(int expiry) | 设置cookie的有效期,以秒为单位 |
void setValue(String value) | 在cookie创建后,对cookie进行赋值 |
String getName() | 获取cookie的名称 |
String getValue() | 获取cookie的值 |
int getMaxAge() | 获取cookie的有效时间,以秒为单位 |
session与Cookie的关系
cookie和session都是用来跟踪浏览器用户身份的会话方式。
session的工作原理
- 浏览器端第一次发送请求到服务器端,服务器端创建一个Session,同时会创建一个特殊的Cookie(name为JSESSIONID的固定值,value为session对象的ID),然后将该Cookie发送至浏览器端
- 浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象
- 服务器端根据name为JSESSIONID的Cookie的value(sessionId),去查询Session对象,从而区分不同用户。
- name为JSESSIONID的Cookie不存在(关闭或更换浏览器),返回1中重新去创建Session与特殊的Cookie
- name为JSESSIONID的Cookie存在,根据value中的SessionId去寻找session对象
- value为SessionId不存在**(Session对象默认存活30分钟)**,返回1中重新去创建Session与特殊的Cookie
- value为SessionId存在,返回session对象
cookie的工作原理
- 浏览器端第一次发送请求到服务器端
- 服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端
- 浏览器端再次访问服务器端时会携带服务器端创建的Cookie
- 服务器端通过Cookie中携带的数据区分不同的用户
session与Cookie的区别
session | cookie |
---|---|
在服务器端保存用户信息 | 在客户端保存用户信息 |
session中保存的是Object类型 | cookie保存的是 String类型 |
随会话的结束而将其存储的数据销毁 | cookie可以长期保存在客户端 |
保存重要的信息 | 保存不重要的用户信息 |