回顾
- 请求和响应时,哪些情况会出现中文乱码,如何解决
- 发 post 请求时,request.setCharacterEncoding(“编码”)
- 响应的乱码: response.setContentType(“text/html;charset=编码”);
- 如何在请求转发时共享数据
- request.getRequestDispatcher("/目标资源路径").forward(request, response);
- A -> B
- A: request.setAttribute(“名”, 数据);
- B: request.getAttribute(“名”)
- 请求转发和请求包含的区别
- forward A -> B 最后由 B 来返回响应结果
- include A -> B 最后是由 A+B 返回响应的结果
- 请求转发和重定向的区别
- response.sendRedirect("/虚拟目录/目标资源路径");
- 转发是1次请求,重定向是2次请求
- 转发地址栏不变,重定向地址栏改变
- 请求转发可以使用 request 域共享数据,但重定向不能
- 转发只能是本项目的资源,而重定向可以是任意资源
- 常见状态码的作用,304 是什么?Expires 头是什么(过期时间)
- 200
- 302 - 重定向
- 304 - 缓存
- 400 - 请求参数不正确
- 404 - 找不到
- 405 - 方法不支持
- 500 - 服务器异常 web.xml error-page
- 如何返回 html 格式的响应
- response.getWriter().print("")
- 如何返回二进制格式的响应(图片),如何下载
- response.getOutputStream()
- 两个响应头
- Content-Type: application/octet-stream
- Content-Disposition: attachement;filename=文件名
今日内容
默认情况下,两个http请求之间是没有联系的,无状态
1. cookie (小甜点)
把多个请求间要共享的信息,存储在客户端
response.addCookie(new Cookie(name, value)) - 将 cookie 存入客户端浏览器
request.getCookies[] => Cookie[] - 从浏览器获取上次存储的 cookie(多个)
maxAge - 最大寿命
-
cookie.setMaxAge(-1) 默认值是 -1 ,当浏览器关闭,cookie 被销毁
-
cookie.setMaxAge(3600) 单位是秒, 当1小时后,cookie 被销毁
-
cookie.setMaxAge(0) 表示立刻删除此 cookie
个数限制
- 每个cookie 大小 4k
cookie 中文解决方法
// 编码
new Cookie(名, URLEncoder.encode("中文", "utf-8"));
// 解码
URLDecoder.decode(cookie.getValue(), "utf-8");
2. session
把多个请求间要共享的信息,存储在服务器端
- HttpServletRequest 请求域 - 共享数据仅存在一次请求中
- HttpSession 会话域 - 同一个浏览器与服务器之间多次通信,是一个会话(可以配合重定向用)
- ServletContext 应用域 - 多个浏览器之间想共享数据,可以使用它来共享数据
request.getSession(); // 查看session有没有,有则直接获取,没有就会创建(相当于 boolean 变量是 true)
request.getSession(false); // 查看session有没有,有则直接获取, 没有返回null 不会创建session
session.invalidate() 销毁session
session 生命周期(补充)
-
当第一次调用 request.getSession() 方法时会创建 session
-
销毁session
-
主动销毁 session.invalidate() 会删除所有的共享数据,并回收session 占用的内存
-
被动销毁 当浏览器有一段时间(30分钟)没有发请求了,那么服务器会销毁此session
-
当用户量较大时,建议缩短过期时间
-
<session-config> <session-timeout>20</session-timeout> </session-config>
-
注销 /logout ==> servlet ==> session.invalidate()
-
3. jsp
java server page 协助 servlet 来生成 html 页面
- servlet 只负责处理请求,写 java 代码逻辑,生成数据
- 域 request
- jsp 页面只负责展示数据
本质是一个 servlet
语法
注释
<%-- 注释内容 --%>
java 代码块
<% java 代码 %>
表达式
<%= 表达式 %>
声明
<%!
成员变量;
成员方法;
%>
指令
<%@ page contentType="" import="" %>
<%@ include file="页面地址" %>
<%@ taglig %>
9 个隐式对象(以下四个必须掌握)
pageContext
request
session
application (ServletContext)
Cookie
补充问题
- 再讲下域对象和前面的servelet的context,config之类的区别和联系
pageContext, request, session, application => 管理共享数据
application === ServletContext (.getRealPath(), setAttribute getAttribute(), getInitParameter())
response, out, page【代表当前jsp对象】, config【servlet的初始化参数】, exception【异常信息】
ServletConfig 获取每个servlet 的初始化参数的
web.xml
<context-param>
<param-name></param-name>
<param-value></param-value>
</context-param>
<servlet>
<init-param>
<param-name></param-name>
<param-value></param-value>
</init-param>
</servlet>
-
cookie 和 session
- cookie 的信息存储在浏览器中,每个cookie 4k数据,只能存字符串类型,中文问题
- session 的信息存储在服务器中,数据没有上限(建议尽量少存),可以存任意类型,没有中文问题,依赖于 cookie
-
resp.addCookie(timeCookie);添加到客户端后是下次请求才开始生效吗? 是的
-
jsp企业是不是过期了,新的代替技术是什么 freeMarker
-
Session 中有唯一(JsessionID), 这个ID 属于cookie 的一个属性值?;
他是 cookie 的名字,值是唯一的标识
-
cookie是有数量和大小限制的; 是否因此会影响session的数量和大小?
没有关系
-
Parameter和Attribute有啥区别
-
用来获取请求参数的: request.getParamter(“name”); // ?name=zhangsan, <input type=text name=“name”
-
用来获取request域中共享数据 request.getAttribute(“name”),也就是用 request.setAttribute(“name”, “lisi”)
-
-
cookie使用细节哪里有个访问路径限制
- 比如路径 设置为 /test8
- 当浏览器访问 /test8 下任意资源时都会携带 cookie
- /test8/index.jsp, /test8/aaa/s1, …
- /test8/aaa 下任意资源时都会携带 cookie
- /test8/aaa/1.jsp |