一、会话技术
会话:指一次会话中包含多次请求和响应。
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止(这个断开指浏览器关闭了、或者服务器关闭了)。
会话功能:在一次会话的范围内的多次请求间共享数据。
会话的两种方式:客户端会话技术Cookie 、服务器端会话技术Session。
1.1 Cookie
Cookie 是客户端会话技术,它将数据保存在客户端(如浏览器)。Cookie会话技术基于响应头 set-cookie 和请求头 cookie 实现。
快速入门
- 创建Cookie对象,绑定数据:
new Cookie(String name, String value) - 发送Cookie对象:
response.addCookie(Cookie cookie) - 获取Cookie,拿到数据:
Cookie[] request.getCookies()
细节使用
问题 | 解决 |
---|
可以一次发送多个cookie吗? | 可以。 可以通过创建多个Cookie对象,使用response调用多次addCookie()方法发送cookie。 | cookie能浏览器中保存多长时间? | 默认情况下,当浏览器关闭后,cookie数据被销毁。 也可持久化存储,通过 setMaxAge(int expiry) 实现。 1. expiry为正数:将cookie数据写到硬盘的文件中,持久化存储,并指定cookie存活时间,时间到后,cookie文件自动失效; 2. expiry为负数:默认值; 3. expiry等于零:意味着删除该cookie键。 | cookie能不能存放中文? | 在Tomcat 8 之前(Tomcat 7 及以下版本)不能直接存储中文,需要将中文转码(URL编码存储,URL解码解析)。 Tomcat 8 之后,cookie支持中文数据,但不包括特殊字符。 | cookie获取范围多大? 1. 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享? 2. 不同的tomcat服务器间能实现cookie共享吗? | 1. 默认情况下cookie不能共享。但也可以手动设置 setPath("/") 。 2. 如果设置一级域名相同,那么多个服务器之间cookie可以共享 setDomain(String path) 。 |
Cookie的特点
- Cookie数据存储在客户端浏览器;
- 浏览器对于单个Cookie的大小有限制(4kb),且对同一个域名下的总Cookie数量也有限制(20个)。
Cookie的作用
- Cookie一般用于存储少量的不太敏感的数据;
- 在不登录的情况下,完成服务器对客户端的身份识别。
1.2 Session
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的 HttpSession 对象中。Session的实现是依赖于Cookie的。
快速入门
- 获取HttpSession对象:
HttpSession session = request.getSession() - 使用HttpSession对象:
Object getAttribute(String name) 、 void setAttribute(String name, Object value) 、 void removeAttribute(String name)
细节使用
问题 | 解决 |
---|
当客户端关闭后,服务器不关闭,两次获取session是否为同一个? | 默认情况下,不是。 如果需要相同的,则可以创建Cookie对象,通过设置Cookie键JSESSIONID的最大存活时间,让Cookie持久化保存。
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c); | 客户端不关闭,服务器关闭后,两次获取的session是否为同一个? | 不是同一个。 那么如何才能确保数据不丢失?通过session的钝化/活化实现。 | session什么时候被销毁? | 1. 服务器关闭的时候; 2. 调用session对象invalidate()方法; 3. session默认失效时间 30分钟。该默认时间可以修改,在Tomcat的conf目录下的web.xml文件中,找到并修改以下信息:
<session-config>
<session-timeout>30</session-timeout>
</session-config> |
Session特点
- session用于存储一次会话的多次请求的数据,存在服务器端。
- session可以存储任意类型、任意大小的数据。
1.3 Cookie和Session的区别
- Session存储数据在服务器端,Cookie在客户端。
- Session没有数据大小限制,Cookie有。
- Session数据安全,Cookie相对于不安全。
二、JSP
Java Server Pages (Java 服务器端页面)。本质上仍是一个Servlet。
JSP的脚本(JSP定义Java代码的方式)
<% 代码 %> :定义的Java代码,在service()方法中。service()方法中可以定义什么,该脚本中就可以定义什么。<%! 代码 %> :定义的Java代码,在jsp转换后的Java类的成员位置。<%= 代码 %> :定义的Java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
JSP隐含对象
JSP支持九个自动定义的变量,称为隐含对象,也叫内置对象。
对象 | 描述 |
---|
request | HttpServletRequest类的实例 | response | HttpServletResponse类的实例 | out | PrintWriter类的实例,用于把结果输出至网页上 | session | HttpSession类的实例 | application | ServletContext类的实例,与应用上下文有关 | config | ServletConfig类的实例 | pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 | page | 类似于Java类中的this关键字 | Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
JSP指令
JSP指令用于配置JSP页面,导入资源文件。语法格式:<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %> 。
这里有三种指令标签:
指令 | 描述 |
---|
<%@ page … %> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等。 可以使用的属性有: import导包; errorPage当前页面发生异常后,会自动跳转到指定的错误页面; isErrorPage标识当前也是是否是错误页面(true可以使用内置对象exception,默认值false不可以使用内置对象exception) | <%@ include … %> | 包含其他文件。如:
<%@include file="top.jsp"%> | <%@ taglib … %> | 引入标签库的定义,可以是自定义标签。如:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
JSP注释
<!-- 注释内容 --> 只能注释 html 代码片段,注释内容仍会发送到 respond 里面,只是浏览器不会实现其中代码。<%-- 注释内容 --%> 可以注释所有,且浏览器不会接收到注释内容。
JSP EL
JSP 表达式语言(EL 表达式) 使访问存储在 JavaBean 内中的数据变得非常简单。语法格式:${表达式} 。
如何使用它?
-
算术和逻辑操作符
操作符 | |
---|
算数运算符 | +、—、*、/(div)、%(mod) | 比较运算符 | >、<、>=、<=、==、!= | 逻辑运算符 | && 、|| 、! | 空运算符 | empty 用于判断字符串、集合、数组对象是否为null或者长度是否为0。
${empty list} 判断字符串、集合、数组对象是否为null或者长度为0。
${not empty str} 表示判断字符串、集合、数组对象是否不为null并且长度>0。 |
-
获取值
要求 | 实现 |
---|
从指定域中获取指定键的值 | ${域名称.键名} ,如 ${requestScope.name} | 从最小的域中查找是否有该键对应的值,直到找到为止。 | ${键名} | 获取对象、List集合、Map集合的值 | 1. 获取对象 ${域名称.键名.属性名} 2. 获取List集合 ${域名称.键名[索引]} 3. 获取Map集合 ${域名称.键名.key名称} 、 ${域名称.键名["key名称"]} |
EL 表达式只能从域对象中获取值,域对象有(作用范围从小到大):pageScope (将从pageContext 对象中获取值)、requestScope (将从request 对象中获取值)、sessionScope (将从session 对象中获取值)、applicationScope (将从application 对象即ServletContext 中获取值)
JSP 默认支持EL表达式。那么如何禁用EL表达式原文本展示呢?1. 给jsp的page指令中设置 isELIgnored="true" ,表示忽略当前jsp页面中所有的EL表达式;2. \${表达式} ,忽略当前这个EL表达式。
JSP 标准标签库(JSTL)
JavaServer Pages Tag Library。是由Apache组织提供的开源的免费的jsp标签。用于简化和替换jsp页面上的java代码。
使用步骤:
- 导入jstl相关jar包:javax.servlet.jsp.jstl.jar 、jstl-impl.jar,下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
- 引入标签库,taglib指令:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - 使用标签
常用的JSTL标签 : <c:if>、 <c:choose>、 <c:foreach>
|