这里写目录标题
1 Cookie
1.1 会话介绍
- 会话:浏览器和服务器之间的多次请求和响应
- 会话过程中所产生的一些数据,可以通过会话技术(Cookie 和 Session)保存
1.2 Cookie 介绍
- Cookie:客户端会话管理技术
把要贡献的数据保存到客户端中
每次请求时,把会话信息带到服务器端,从而实现多次请求的数据共享 - 作用:可以保存客户端访问网站的相关内容,从而保证每次访问时先从本地缓存中获取,以此提高效率
1.3 Cookie 属性
1.4 Cookie 方法
1.4.1 Cookie 添加和获取
- 添加:HttpServletResponse
- 获取:HttpServletRequest
1.5 Cookie 的使用
- 需求说明
通过 Cookie 记录最后访问时间,并在浏览器上显示出来 - 最终目的
掌握 Cookie 的基本使用,从创建到添加客户端,再到从服务器获取 - 代码演示:
package com.txt.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter pw = resp.getWriter();
pw.write("欢迎访问本网站,您的最后访问时间为:<br>");
Cookie cookie = new Cookie("time", System.currentTimeMillis() + "");
cookie.setMaxAge(3600);
resp.addCookie(cookie);
Cookie[] cookies = req.getCookies();
for (Cookie c : cookies){
if ("time".equals(c.getName())){
String value = c.getValue();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
pw.write(sdf.format(new Date(Long.parseLong(value))));
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 效果如下
1.6 Cookie 的细节
- 数量限制
每个网站最多有20和 Cookie, 且大小不能超过 4KB。所有网站的 Cookie 总数不能超过 300个 - 名称限制
Cookie 的名称只能包含 ASCCI 码表中的字母、数字字符。不能包含逗号、分号、空格,不能以 $ 开头
Cookie 的值不支持中文 - 存货时间限制 setMaxAge() 方法接收数字
负整数:当前会话有效,浏览器关闭则清除
0:立刻清除
正整数:以秒为单位设置存活时间 - 访问路径限制
默认路径:取自第一次访问的资源路径前缀,只要以这个前缀为开头(包括子级路径),就能访问到
设置路径:setPath() 方法设置指定路径
2 Session
2.1 HttpSession 介绍
- HttpSession:服务器会话管理技术
本质也是采用客户端会话管理技术
只不过客户端保存的是一个特殊表示,而共享的数据保存到了服务器的内存对象中
每次请求时,会将特殊标识带到服务器端,根据这个标识来找到对应的内存空间,从而实现数据共享
是 Servlet 规范中四大域对象之一的会话域对象 - 作用:可以实现数据共享
2.2 HttpSession 常用方法
2.3 HttpSession 获取
- HttpSession 实现类对象是通过 HttpSevletRequest 对象来获取
2.4 HttpSession 的使用
- 需求说明
通过第一个 Servlet 设置共享数据用户名,并在第二个 Servlet 获取到 - 最终目的
掌握 HttpSession 的基本使用,如何获取和使用 - 代码演示
package com.txt.servlet;
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;
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 获取请求的用户名
String username = req.getParameter("username");
//2. 获取 HTTPSession 的对象
HttpSession session = req.getSession();
//3. 将用户名信息添加到共享数据中
session.setAttribute("username",username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.txt.servlet;
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;
@WebServlet("/servletDemo02")
public class ServletDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 获取 HTTPSession 对象
HttpSession session = req.getSession();
//获取共享数据
Object username = session.getAttribute("username");
//将数据响应给浏览器
resp.getWriter().write(username +"");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2.5 HttpSession 的细节
- 唯一标识的查看
- 浏览器禁用 Cookie
方式一:通过提示信息告知用户,大部分网站采用的解决方式
方式二:访问时拼接 jsessionid 标识,通过 encodeURL() 方法重写地址 - 钝化和活化
- 什么是钝化和活化
钝化:序列化。把长时间不用,但还不到过期时间的 HttpSession 进行序列化,写到磁盘上
活化:相反的状态 - 何时钝化
第一种情况:当访问量很大是,服务器会根据 getLastAccessTime 来进行排序
对长时间不用,但是还没有到过期时间的 HttpSession 进行序列化
第二种情况:当服务器进行重启的时候,为了保持客户 HttpSession 中的数据,也要对其进行序列化
- 什么是钝化和活化
- 注意:
HttpSession 的序列化由服务器自动完成,我们无需关心
3 JSP
3.1 JSP 介绍
- JSP(Java Servlet Page):是一种动态网页技术标准
- JSP 部署在服务器上,可以处理客户端发送的请求,并根据请求内容动态的生成 HTML、XML 或其他格式文档的 Web 网页,然后再响应给客户端
- JSP 是基于Java 语言的,它的本质就是 Servlet
3.2 JSP 快速入门
- 创建一个web项目
- 在 web 目录下创建一个 index.jsp 文件
- 在文件中写一句内容为:这是我的第一个jsp
- 部署并启动项目
- 通过浏览器测试
- 代码演示
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP</title>
</head>
<body>
这是我的第一个JSP
</body>
</html>
3.3 JSP 执行过程
3.4 JSP 语法
-
JSP 注释
<%--注释的内容-->
-
Java 代码块
<% Java 代码块%>
<%
System.out.println("Hello JSP");
out.print("Hello JSP");
%>
注意:
System.out.println(“Hello JSP”); 普通输出语句,输出在控制台
out.print(“Hello JSP”); out是 JSPWriter 对象,输出在页面 -
JSP 表达式
<%=表达式%>
<%="hello"%>
相当于 out.print(“hello”); 的简化
-
JSP 声明
<%! 声明变量或方法 %>
<%! String s = "abc"; %>
<%=s%>
如果加!代表的是声明的是成员变量
如果不加!代表的是声明的是局部变量
3.5 JSP 指令
- page 指令
<%@ page 属性名 = 属性值 属性名 = 属性值 … %>
- include 指令:可以包含其他页面
<%@ include file=包含的页面 %> - taglib 指令:可以引入外部标签库
<%@ taglib uri=标签库的地址 prefix=前缀名称%>
3.6 JSP 细节
- 九大隐式对象
- PageContext 对象
是 JSP 独有的,Servlet 中没有
是四大域对象之一的页面域对象,还可以操作其他三个域对象中的属性
还可以获取其他八个隐式对象
生命周期是随着 JSP 的创建而存在,随着 JSP 的结束而小旺旺,每个 JSP 页面都有一个 PageContext 对象
3.7 四大域对象
3.8 MVC 模型
- M(Model):模型。 用与封装数据,封装的是数据模型
- V(View):视图。 用于显示数据,动态资源用 JSP 页面,静态资源用 HTML 页面
- C(Controller):控制器。 用于处理请求和响应,例如 Servlet