文章目录
一、会话技术
会话:指一次会话中包含多次请求和响应。
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止(这个断开指浏览器关闭了、或者服务器关闭了)。
会话功能:在一次会话的范围内的多次请求间共享数据。
会话的两种方式:客户端会话技术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>