6、Session

会话技术

服务器无法识别每一次HTTP请求的出处(不知道来自于哪个终端),它只会接收到一个请求信号,所以就存在一个问题:将用户的响应发送给其他人,必须有一种技术来让服务器知道请求来自哪里,这就是会话技术。
会话:就是客户端和服务器之间发生的一系列连续的请求和响应的过程。 具体来讲就是打开浏览器操作到关闭浏览器的过程。
会话状态:指的是服务器和浏览器在会话过程中产生的状态信息,借助于会话状态,服务器能够把属于同一次会话的系列请求和响应关联起来。
实现会话有2种方式:

  • session(存储于服务器内部的数据,属于Java对象)
  • cookie(存储于客户端的数据,不属于Java对象,用户可手动清理)

属于同一次会话的请求都有一个相同的标识符,即SessionID。

  1. <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>JSP - Hello World</title>
  6. </head>
  7. <body>
  8. <%
  9. String sessionId = session.getId();
  10. %>>
  11. //> 423E3631E923D3B2E4F9FFF2B83F5AAD
  12. <%=sessionId%>
  13. </body>
  14. </html>

常用方法

  • String getId(); //获取sessionID
  • void setMaxInactiveInterval(int interval) //设置session的失效时间,单位为秒
  • int getMaxInactiveInterval() //获取session的失效时间,单位为秒
  • void invalidate(); //设置session立即失效
  • void setAttribute(String key,Object value) //通过键值对形式来存储数据,也可修改
  • Object getAttribute(String key) //通过键值对获取对应的数据
  • void removeAttribute(String key) //通过key删除对应的数据

    一个小案例

    ```java package com.simon.methodtest;

import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException;

//注意,这个“/”是指部署根目录对应的路径,即localhost:8080这一级 @WebServlet(“/login”) public class LoginServlet extends HttpServlet { String myusername; String mypassword;

  1. @Override
  2. public void init(ServletConfig config) throws ServletException {
  3. myusername = config.getInitParameter("username");
  4. mypassword = config.getInitParameter("password");
  5. }
  6. @Override
  7. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  8. super.doGet(req, resp);
  9. }
  10. @Override
  11. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  12. //把这些参数赋值给默认初始化参数
  13. String username = req.getParameter("username");
  14. String password = req.getParameter("password");
  15. if (username.equals(myusername)&&password.equals(mypassword)){
  16. HttpSession session = req.getSession();
  17. session.setAttribute("username",username);

// req.setAttribute(“username”,username); req.getRequestDispatcher(“welcome.jsp”).forward(req,resp); }else { resp.sendRedirect(“login.jsp”); } } }

  1. ```html
  2. <%--
  3. Created by IntelliJ IDEA.
  4. User: Simon
  5. Date: 2021/11/4
  6. Time: 22:33
  7. To change this template use File | Settings | File Templates.
  8. --%>
  9. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  10. <html>
  11. <head>
  12. <title>Title</title>
  13. </head>
  14. <body>
  15. <form action="/login" method="post">
  16. <table>
  17. <tr>
  18. <td>
  19. 用户名:
  20. </td>
  21. <td>
  22. <input type="text" name="username">
  23. </td>
  24. </tr>
  25. <tr>
  26. <td>
  27. 密码:
  28. </td>
  29. <td>
  30. <input type="password" name="password">
  31. </td>
  32. </tr>
  33. <tr>
  34. <td>
  35. <input type="submit" value="登录">
  36. </td>
  37. </tr>
  38. <tr>
  39. <td>
  40. <input type="reset" value="重置">
  41. </td>
  42. </tr>
  43. </table>
  44. </form>
  45. </body>
  46. </html>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <servlet>
  7. <servlet-name>login</servlet-name>
  8. <servlet-class>com.simon.methodtest.LoginServlet</servlet-class>
  9. <init-param>
  10. <param-name>username</param-name>
  11. <param-value>admin</param-value>
  12. </init-param>
  13. <init-param>
  14. <param-name>password</param-name>
  15. <param-value>123123</param-value>
  16. </init-param>
  17. </servlet>
  18. <servlet-mapping>
  19. <servlet-name>login</servlet-name>
  20. <url-pattern>/login</url-pattern>
  21. </servlet-mapping>
  22. </web-app>
  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: Simon
  4. Date: 2021/11/4
  5. Time: 23:47
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <html>
  10. <head>
  11. <title>Title</title>
  12. </head>
  13. <body>
  14. <h1>Welcome</h1>
  15. 欢迎回来
  16. //<%=request.getAttribute("username")%>
  17. //在哪里存就从哪里取
  18. <%=session.getAttribute("username")%>
  19. </body>
  20. </html>

image.png

7、Cookie

简述

Cookie是服务端在HTTP响应种附带传给浏览器的一个小文本文件,一旦浏览器保存了某个cookie,在之后的请求喝响应过程中,会将此cookie来回传递,这样就可以通过cookie这个载体完成客户端和服务端之间的数据交互。
image.png
在Java中,我们操作cookie的就是Cookie类。

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <%
  8. Cookie cookie = new Cookie("name", "zs");
  9. response.addCookie(cookie);
  10. Cookie[] cookies = request.getCookies();
  11. for (Cookie cookie1 : cookies) {
  12. System.out.println(cookie1.getName() + "<br/>");
  13. }
  14. // name<br/>
  15. // JSESSIONID<br/>
  16. // name<br/>
  17. // JSESSIONID<br/>
  18. %>
  19. </body>
  20. </html>

click twice;
image.png
这实际上是因为 response.addCookie(cookie); 之后,服务器响应给客户端。所以如果是第一次响应的话,请求头的Cookie内容是:JSESSIONID=0164843B17132FC86DA43118A4EFA4C5,响应头Set-Cookie为:name=zs;第二次响应的话,request会携带响应头带来的Cookie给服务器,这时候的请求头就会加上name=zs,而响应头的cookie则会覆盖请求头的内容,以此类推。

常用方法

  1. void setMaxAge(int age) 设置Cookie的有效时间,单位为秒
  2. int getMaxAge() 获取Cookie的有效时间
  3. String getName() 获取Cookiename
  4. String getValue() 获取Cookievalue

Session和Cookie的区别

session cookie
数据保存位置 服务器 客户端
生命周期 随会话结束而销毁 长期保存,与会话无关
保存数据类型 Object类型 文本信息
保存的数据重要性 重要 不重要

8、JSP内置对象的作用域

jsp内置对象这里重点讲4个:page、request、session、application。因为这四个都有getAttribute()和setAttribute()方法。

重点内置对象

page作用域:对应的内置对象是pageContext;
request作用域:对应的内置对象是request;
session作用域:对应的内置对象是session;
application作用域:对应的内置对象是application。
page < request < session < application:
page只在当前页面有效;
request在一次请求内有效;
session在一次会话内有效;
application对应的是整个web应用

案例:记录网站浏览人数

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: Simon
  4. Date: 2021/11/5
  5. Time: 16:53
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <html>
  10. <head>
  11. <title>Title</title>
  12. </head>
  13. <body>
  14. <%
  15. Integer count = (Integer) application.getAttribute("count");
  16. if (count == null){
  17. count = 1;
  18. application.setAttribute("count",count);
  19. }else {
  20. count++;
  21. application.setAttribute("count",count);
  22. }
  23. %>
  24. 您是当前第<%=count%>位访客!
  25. </body>
  26. </html>

效果:
image.png

9、EL表达式

Expression Language,表达式语言,可替代jsp页面中数据访问时的复杂编码。可以非常便捷地取出域对象中保存的数据,前提是要先setAttribute,EL就相当于在简化getAttribute。

域对象默认查找顺序

EL表达式对于4种域对象的查找顺序:pageContext—>request—>session—>application。同名下找到立即返回,在application也没找到,就返回为null。

指定作用域查找

pageContext:${pageContext.name}
request:${requestScope.name}
session:${sessionScope.name}
application:${applicationScope.name}

语法格式

语法:${变量名}

  1. //el.jsp文件
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <html>
  4. <head>
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <%
  9. request.setAttribute("name","tom");
  10. request.getRequestDispatcher("el2.jsp").forward(request,response);
  11. %>
  12. </body>
  13. </html>
  1. //el2.jsp文件
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <html>
  4. <head>
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <%--//常规方式:--%>
  9. <%
  10. String name = (String) request.getAttribute("name");
  11. %>
  12. <%=name%>
  13. <hr/>
  14. <%--EL表达式--%>
  15. ${name}
  16. </body>
  17. </html>

效果如下:
image.png

数据级联

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <%
  8. User user = new User(1, "zs", 86.5, "杭州市");
  9. System.out.println(user.toString());
  10. pageContext.setAttribute("user",user);
  11. %>
  12. <table>
  13. <tr>
  14. <th>编号</th>
  15. <th>姓名</th>
  16. <th>成绩</th>
  17. <th>地址</th>
  18. </tr>
  19. <tr>
  20. //可读也可写,一般是读,跟属性类的方法绑定的
  21. <td>${user.id}</td>
  22. <td>${user.name}</td>
  23. <td>${user.score}</td>
  24. <td>${user.address}</td>
  25. </tr>
  26. </table>
  27. </body>
  28. </html>

EL执行表达式

  1. && || ! < > <= >= ==
  2. && and
  3. || or
  4. ! not
  5. == eq
  6. != ne
  7. < lt
  8. > gt
  9. <= le
  10. >= gt
  11. empty 变量为null,长度为0Stringsize集合为0