session
Session: 服务器中的会话技术
存储数据 - 域对象
域对象范围: 一次会话
获得方式及持久化
-
当客户端第一次调用该方法, 服务器会创建一个session对象并返回
request.getSession();
当客户端再次调用该方法, 服务器直接将之前的session返回 -
服务器第一次为客户端创建Session对象的时候, 会分配一个JSESSIONID编号,并且将 JSESSIONID 传递给客户端的cookie进行保存
-
一次会话结束(浏览器关闭), 下次会话想要继续访问之前的session,
因此需要将 JSESSIONID 进行持久化
@WebServlet("/Demo01Servlet")
// 1.获取session对象
HttpSession session = request.getSession();
// 2.获取session的id
-- String jsessionid = session.getId();
持 // 3.创建一个一模一样的cookie
久 Cookie cookie = new Cookie("JSESSIONID", jsessionid);
化 cookie.setPath(request.getContextPath());//获得当前虚拟目录并携带
操 // 4.设置这个cookie持久化时间
作 cookie.setMaxAge(Integer.MAX_VALUE);
// 5.将原来的cookie覆盖
-- response.addCookie(cookie);
// 2.向session中存储数据
session.setAttribute("name", "zhangsan");//String,Object
@WebServlet("/Demo02Servlet")
// 1.获取session对象
HttpSession session = request.getSession();
// 2.从session中取数据
Object name = session.getAttribute("name");
response.setContentType("text/html");
response.getWriter().write("name: " + name + "<br/>");
response.getWriter().write("JSESSIONID: " + session.getId());
生命周期
创建: 客户端第一次调用getSession()方法时
销毁:
-
手动销毁 session.invalidate();
-
服务器非正常关闭
注:服务器正常关闭, session不会消失, 会变成文件保存在本地磁盘 - session钝化 -
超时 - 30分钟 tomca/config/web.xml
<session-config> <session-timeout>分钟</session-timeout> </session-config>
四种域对象范围总结
从大到小
- ServletContext: 服务器启动期间
- session: 一次会话
- request: 一次请求
- pageContext: page域
jsp
概述
JSP第一次运行之前会先翻译成xx_jsp.java文件, 再编译成xx_jsp.class
xx_jsp.java: 在work文件夹中
例:C:\Users\管盛凯\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat_javaweb\work\Catalina\localhost
JSP文件->翻译成java文件->继承HttpJspBase->继承HttpServlet
class xx_jsp 本质就是Servlet
核心方法 _jspService - 服务方法, 功能和service方法一致
_jspService:
html标签 --> out.write()
<% %> --> Java代码
<% 普通java代码 %>: 翻译到service方法中
<%=表达式 %>: 翻译到service方法中, out.print(表达式);
<%! 声明语句 %>: 翻译成 xx_jsp 类的成员
jsp指令(了解)
page: <%@ page 属性 %>
contentType: response.setContentType("text/html;charset=utf-8")
language: java语言
session: true-默认
pageEncoding: response.setContentType("text/html;charset=utf-8")
<meta charset=utf-8>
buffer: out缓冲区大小, 默认8kb, 设置关闭=none
extends: 继承 HttpJspBase
import: 导包
isErrorPage: 是否是错误页面, 默认false
errorPage: 错误页面, 当前页面出现异常后转发到的页面
isELIgnored: 是否忽略EL表达式, 默认"false"
include: <%@ include%> 静态包含
引入文件, 属性file="不加虚拟目录uri"
路径中不加虚拟目录:
1.转发
2.errorPage
3.include中file属性
taglib: <%@ taglib%> 标签库
uri:jar路径 prefix:前缀
jsp内置对象
JSP内置对象9个: 在<% %>中可以直接使用的对象
HttpServletRequest request
HttpServletResponse response
** PageContext pageContext 域对象
本质是pageContext.findAttribute("name")
从 page->request->session->application 按顺序搜索name对应的值, 直到找到为止, 并返回
HttpSession session: session = true
ServletContext application
ServletConfig config
JspWriter out
Object page = this
Throwable exception: isErrorPage = true
pagecontext域对象
1.可以获得其他八个内置对象 – 框架设计
ServletRequest req = pageContext.getRequest();
pageContext.getResponse();
pageContext.getException();
pageContext.getSession();
2.可以作为域对象使用, 域范围: 当前页面page
pageContext.setAttribute("name", "zhangsan");
String str = (String) pageContext.getAttribute("name");
3.可以通过 pageContext 操作其他三个域对象
等同于内置对象.setAttribute
例如:session.setAttribute
向四个域中存储数据:
pageContext.setAttribute("name", "zhangsan", PageContext.APPLICATION_SCOPE);
pageContext.setAttribute("name", "lisi", PageContext.SESSION_SCOPE);
pageContext.setAttribute("name", "wangwu", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("name", "zhaoliu", PageContext.PAGE_SCOPE);
跳转页面后取数据,注意每个域对象的范围
<%= "application------"+pageContext.getAttribute("name", PageContext.APPLICATION_SCOPE)%><br>
<%= "session------"+pageContext.getAttribute("name", PageContext.SESSION_SCOPE)%><br>
<%= "request------"+pageContext.getAttribute("name", PageContext.REQUEST_SCOPE)%><br>
<%= "page------"+pageContext.getAttribute("name", PageContext.PAGE_SCOPE)%><br>
动态标签
JSP动态标签: 意义-减少java脚本的书写
<jsp:include page=“uri”> 动态包含
对比: <%@ include file=“uri” %> 静态包含
翻译后的java文件
<jsp:forward page=“uri”/>
<h1>JSP动态标签</h1>
<%-- 动态包含 --%>
<jsp:include page="includeB.jsp"/>
<%-- 请求转发 --%>
<jsp:forward page="includeB.jsp"/>
EL表达式
expression language 对象属性导航语言 OGNL
作用: 为了取代get方法,从域中取值
${对象.属性} - 对象.get属性()
<% // 模拟向域中存值
request.setAttribute("name", "zhangsan");
Cookie cookie1 = new Cookie("user", "tom");
Cookie cookie2 = new Cookie("password", "12345");
response.addCookie(cookie1);
response.addCookie(cookie2);
%>
<%-- <%=request.getAttribute("name")%> --%>
${requestScope.name}<br> //zhangsan
<%-- request.getParameter("username") --%>
${param.username} -- ${param["username"]}
<br>
<%-- request.getHeader("user-agent") --%>
${header["user-agent"]}<br>
<%-- Cookie[] cookies = request.getCookies()其中name=user的cookie对象
for(int i ) {
cookies[i].getName() == "user"
cookies[i].getValue() -> tom
}
cookie.user -- Cookie对象
--%>
${cookie}<br>
${cookie.user.name} --- ${cookie.user.value}//user --- tom
empty
<%-- empty 表示
1. 对象为null
2. 对象没有内容
–%>