显示书的浏览记录
Session
session概述
- 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
- Session和Cookie的主要区别在于:
l Cookie是把用户的数据写给用户的浏览器。
l Session技术把用户的数据写到用户独占的session中。存在服务器,也存在tomcat中
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
- 每个浏览器存储自己的数据到Session中
- Session的数据是不能被其它浏览器共享的
- Session一般可用于判断用户是否登录
package com.zx.web.servlet.lesson04; import java.io.IOException; 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; @WebServlet("/Lesson04Servlet1") public class Lesson04Servlet1 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub //通过request来获取Session对象 HttpSession session= req.getSession(); //存数据到Session session.setAttribute("name", "zx"); } }
package com.zx.web.servlet.lesson04; import java.io.IOException; 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; @WebServlet("/Lesson04Servlet2") public class Lesson04Servlet2 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub //通过request来获取Session对象 HttpSession session= req.getSession(); //获取Session的值 String name= (String) session.getAttribute("name"); //响应给客户端 resp.getWriter().write(name); } }
一个浏览器获取到值之后,其他的浏览器就获取不到了
关闭浏览器之后,重新打开,就是一个新的会话了,所以session也变化了。
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
Session的疑问
疑问:服务器是如何实现一个session为一个用户浏览器服务的?
v 服务器会为每个浏览器分配一个session ID,然后把Session ID通过Cookie的形式存储在客户端
Session的实现原理:
- 浏览器访问后台时,后台会创建一个Session对象,并分配一个id
- 把这个Session Id 通过响应头的Cookie形式返回给客户端
- 客户端ji就会把Cookie存在本地(浏览器)
- 当下次再访问这个站点时,会把session id 通过请求头cookie的形式传回给后台
package com.zx.web.servlet.lesson07; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class LoginServlet */ @WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub resp.setHeader("content-type", "text/html;charset=utf-8"); //1.获取请求参数 String username=req.getParameter("username"); String password=req.getParameter("password"); String client_code=req.getParameter("code"); //2.获取服务端的code String server_code=(String) req.getSession().getAttribute("code"); if (server_code==null) { resp.getWriter().write("清刷新上一个页面"); } //3.验证码对比 if (!server_code.equalsIgnoreCase(client_code)) { resp.getWriter().write("验证码不一致"); }else { //resp.getWriter().write("验证码不一致"); if ("zx".equals(username)&&"123".equals(password)) { resp.getWriter().write("登录成功"); }else { resp.getWriter().write("登录失败"); } } //4.把验证码从服务器删除 //req.getSession().removeAttribute("code"); req.getSession().invalidate();//让Session的所有数据都删除 } }
package com.zx.web.servlet.lesson07; import java.io.IOException; 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 cn.dsna.util.images.ValidateCode; /** * Servlet implementation class ValidateCodeServlet * 验证码的Servlet */ @WebServlet("/ValidateCodeServlet") public class ValidateCodeServlet extends HttpServlet { /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub ValidateCode vc=new ValidateCode(100, 30, 4, 6); System.out.println("生成的验证码:"+vc.getCode()); //把验证码存在session request.getSession().setAttribute("code", vc.getCode()); vc.write(response.getOutputStream()); } }
HttpSession常用方法
- 把数据保存在HttpSession对象中,该对象也是一个域对象。
- void setAttribute(String name,Object value);存数据
- Object getAttribute(String name);取数据
- void removeAttribute(String name);删除一个key的数据
- HttpSession.getId()
- setMaxInactiveInterval(int interval) 设置session的存活时间
- invalidate() 使此会话无效
getSession():内部执行原理
HttpSession request.getSession():内部执行原理
1、获取名称为JSESSIONID的cookie的值。
2、没有这样的cookie,创建一个新的HttpSession对象,分配一个唯一的SessionID,并且向客户端写了一个名字为JSESSIONID=sessionID的cookie
3、有这样的Cookie,获取cookie的值(即HttpSession对象的值),从服务器的内存中根据ID找那个HttpSession对象:
找到了:取出继续为你服务。
找不到:从2开始。
HttpSession request.getSession(boolean create)
参数:
true:和getSession()功能一样。
false:根据客户端JSESSIONID的cookie的值,找对应的HttpSession对象,找不到返回null(不会创建新的,只是查询)。
浏览器传了Sessionid,但是服务器没有这个id对应的对象,服务器返回null
Session的状态三种:
创建:当浏览器第一次访问服务器动态资源就创建
活着:服务器应用运行时
死亡:
Session.invalidate();强制销毁
超时:默认30分钟
setMaxInactiveInterval(int )单位秒
Session的持久化
节约内存空间;
确保在服务器重启或单个Web应用重启后,能回复重启前的会话;
方法:需要的类上面实现Serializable接口(session存储对象实现)
JSP:
当访问lesson1.jsp时,会先将其编译lession1_jsp.java,然后再编译成lession1_jsp.class
- JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP/Servlet规范。JSP实际上就是Servlet。
- JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
jsp的最佳实践
- Servlet:控制器。重点编写java代码逻辑 (获取表单数据、处理业务逻辑、分发转向)
- JSP:代码显示模板。重点在于显示数据
演示:JSP也可以处理表单请求,但一般不用这么用,由Servlet去处理表单
注:request,out,response称为JSP的内置对象,不需要声明直接使用
两种指定.jsp的方式都可以:
1.加项目名
2.直接写.jsp文件名
- 小脚本 <% java代码 %>
- 表达式 <%= 2+3 %> 等价于out.print(2+3);
- 声明 <%! %> 表示在类中定义全局成员,和静态块。
JSP注释:<%-- 被注释的内容 --%> 特点:安全,省流量
网页注释:<!-- 网页注释 --> 特点:不安全,费流量
Page
属性:
少用:自学 |
session: 是否会自动创建session对象。默认值是true; |
buffer: JSP中有javax.servlet.jsp.JspWriter输出字符流。设置。输出数据的缓存大小,默认是8kb |
isErrorPage: 是否创建throwable对象。默认是false; |
常用:演示 |
import 和java代码中的import是一样的 <%@ page import="java.util.Date,java.util.List"%> 或者: <%@ page import="java.util.Date"%> <%@ page import="java.util.List"%> 注:JSP会自动导入以下的包: import java.lang.*; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; |
errorPage: 如果页面中有错误,则跳转到指定的资源 errorPage="/uri" 如果写“/”则代表当前应用的目录下,绝对路径。 如果不写“/”则代表相对路径。 有/就是从WebContent路径下寻找 |
contextType: 等同于response.setContextType("text/html;charset=utf-8"); |
pageEncoding: 告诉JSP引擎要翻译的文件使用的编码。 |
isELIgnored: 是否支持EL表达式。 默认是false |
include
静态包含:把其它资源包含到当前页面中。
<%@ include file="/include/header.jsp" %>
动态包含:
<jsp:include page="/include/header.jsp"></jsp:include>
两者的区别:翻译的时间段不同
前者:在翻译时就把两个文件合并
后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。
jsp翻译过程是指:访问.jsp文件时,h会把.jsp转成.java再转成.class
原则:能用静的就不用动的。
JSP的6个常用动作:
JSP的6个常用动作
- <jsp:include > 动态包含 另一个jsp内容进入当前的jsp页面
- <jsp:forward> 请求转发 (相当于request的转发)
- <jsp:param> 设置请求参数
- <jsp:useBean> 创建一个对象
- <jsp:setProperty> 给指定的对象属性赋值
- <jsp:getProperty> 取出指定对象的属性值
对象的id与下面的name是相关联的