目录
五、会话及其会话技术
5.1 会话概述
(1)客户端请求Wob服务懈时,针对每次HTP请求,Web服务器都会创建一个HttpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,之前购买请求中的数据将会丢失。
(2)使用ServletContext 对象保存数据时,由于同一个Web应用共享的是同一个ServletContext对象,因此,当用户在发送结账请求时,由于无法区分哪些商品是哪个用户所购买的,而会将该购物网站中所有用户购买的商品进行结算,这显然也是不可行的。
为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。
5.2 Cookie 对象
Cookie是一种会话技术, 它用于将会话过程中的数据保存到用户的浏览器中,从而使浏览器和服务器可以更好地进行数据交互。
5.2.1 什么是 Cookie
服务器向客户端发送Cookie时,会在HTTP响应头字段中增加Set-Cookie响应头字段。Set-Cookie头字段中设置的Cookie遵循一定的语法格式。
Set-Cookie:user=itcast; Path=/;
在上述示例中,user表示Cookie的名称,itcast表示Cookie的值,Path表示Cookie的属性。需要注意的是,Cookie必须以键值对的形式存在,其属性可以有多个,但这些属性必须用分号和空格分隔。
5.2.2 Cookie API
为了封装Cookie信息,在Servlet API中提供了一个javax servlet Cookie类,该类包含了生成Cookie信息和提取Cookie信息各个属性的方法。
1.构造方法
Cookie类有且仅有一个构造方法。
public Cookie(java.lang.String name,java.lang.String value)
在Cookie的构造方法中,参数name用于指定Cookie的名称,value用于指定Cookie的值。需要注意的是,Cookie一旦创建,它的名称就不能更改,Cookie的值可以为任何值,创建后允许被修改。
2. Cookie类的常用方法
通过Cookie的构造方法创建Cookie对象后,便可调用该类的所有方法。
显示用户上次访问时间
package cn.itcast.chapter05.re;
import java.io.IOException;
import java.util.Date;
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;
/**
* Servlet implementation class LastAcess
*/
@WebServlet("/acess")
public class LastAcess extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Cookie[] cookies=request.getCookies();
String lasttime=null;
for(int i=0;cookies!=null && i<cookies.length;i++) {
String name=cookies[i].getName();
if("lastAccess".equals(name)) {
lasttime=cookies[i].getValue();
}
}
if(lasttime==null) {
response.getWriter().print("你是第一次访问本网站");
}else {
response.getWriter().print("你上次访问本网站的时间是:"+lasttime);
}
String time=String.format("%tF%<tT", new Date());
Cookie cookie=new Cookie("lastAccess",time);
response.addCookie(cookie);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
5.3 Session对象
Cookie技术可以将用户的信息保存在各自的浏览器中,并且可以在多次请求下实现数据的共享。但是,如果传递的信息比较多,使用Cookie技术显然会增大服务器端程序处理的难度,这时,可以使用Session技术。Session是一种将会话数据保存到服务器端的技术。
5.3.1 什么是Session
当人们去医院就诊时,就诊病人需要办理医院的就诊卡,该卡上只有卡号,而没有其他信息。但病人每次去该医院就诊时,只要出示就诊卡,医务人员便可根据卡号查询到病人的就诊信息。Session技术就好比医院发放给病人的就医卡和医院为每个病人保留病例档案的过程。当浏览器访问Web服务器时,Servet 容器就会创建一个Session对象和ID属性,其中,Session 对象就相当于病历档案,ID就相当于就诊卡号。当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。
需要注意的是,由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。
5.3.2 HttpSession API
Session是与每个请求消息紧密相关的,为此,HttpServletRequest定义了用于获取Session对象的getSession()方法,该方法有两种重载形式,具体如下。
publle HttpSession getSession (boolean create)
publie HttpSession getSession()
课堂示例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
data.jps页面用来输出当前时间:
<%out.print(new Date().toLocaleString()); %>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%!
int a=1;
int b=2;
%>
<%!
public String dashuju(){
String str="dashuju";
return str;
}
%>
<% out.print(a+b); %>
<br/>
<% response.getWriter().print("huagong"); %>
<br/>
<% out.print(dashuju()); %>
<br/>
<br/><br/><br/>
<%=a+b %>
<br/>
<%=dashuju() %>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
html内容
<!-- html注释 -->
<%
//java注释
System.out.print("java 注释");
%>
<%--jsp注释 --%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
大数据2005 <br/>2020080605012<br/>杨骏
<% response.getWriter().print("化工");%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
我是include页面,下面是我包进来的页面:
<%@ include file="date.jsp" %>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
out.print("first line");
response.getWriter().print("second line <br/> 2020080605012 杨骏<br/>");
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
HttpServletRequest req=(HttpServletRequest) pageContext.getRequest();
//req.setAttribute("dashu", "huagong");
pageContext.setAttribute("dashu11","pageContext",PageContext.PAGE_SCOPE);
pageContext.setAttribute("dashu22","REQUEST",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("dashu33","SESSION",PageContext.SESSION_SCOPE);
pageContext.setAttribute("dashu","APPLICATION",PageContext.APPLICATION_SCOPE);
%>
<%=pageContext.findAttribute("dashu") %>
<hr/>
<%=(String) req.getAttribute("dashu") %>
</body>
</html>
2020080605012