当用户第一次登陆的时候,提示,你是第一次登陆,且记录该次访问的时间,下一次访问的时候,获取上一次访问事件并且展示出来。
完成记录功能需要会话技术、cookie和jsp技术。
1.jsp
jsp(java server pages),即,java服务器页面,本质上就是一个servlet,在HTML代码中嵌套java代码,运行在服务器端,处理请求,生成动态的内容。其对应的java和class文件在tomcat目录下的work目录中。
1.1 执行流程
1)浏览器发送请求,访问jsp页面;
2)服务器接受请求,jspServlet查找对应的jsp文件;
3)服务器将jsp页面翻译为java文件;
4)jvm将java编译成.class文件;
5)服务器运行class文件,生成动态内容;
6)将内容发送给服务器;
7)服务器组成相应信息,发送给浏览器;
8)浏览器接受数据,解析展示。
1.2 jsp脚本
有如下形式
java程序的片段;
生成在jsp的service方法中;
输出表达式;
生成在jsp的service方法中,相当于在java中调用out.print();
声明成员
生成在成员位置
2.会话技术
当用户打开浏览器访问不同的资源,直到用户将浏览器关闭,可以认为这是一次会话。
因为http协议是一种无状态的协议,它记录用户上次访问的内容,用户在访问过程中难免会产生一些数据,通过会话技术能够将其进行保存。
例如:用户登录、验证码、购物车以及访问记录等等;
会话技术分为:
cookie:浏览器端会话技术;
session:服务器端会话技术
3.cookie
cookie是由服务器端生成,通过respnse将cookie写回浏览器(Set-cookie),保留在浏览器上,下一次访问,浏览器根据一定的规则携带不同的cookie(通过request的头 cookie),服务器就可以接受cookie。
cookie的api为
new Cookie(String key, String value)
写回浏览器
response.addCookie(Cookie c);
获取cookie
Cookie[] arr = request.getCookies();
cookie常用方法
getName():获取cookie的key(名称);
getValue:获取制定cookie的值;
setMaxAge(int 秒):设置cookie在浏览器端的存活时间,以秒为单位;
若设置为0,便是删除该cookie(前提必须路径一致);
setPath(String path):设置cookie的路径,当我们访问的路径包含此cookie的path,则通过request携带。
默认路径:访问servlet的路径,从“/项目名称”开始,到最后一个“/”结束。例如访问的servlet的路径为/day/a/b/hello,那么默认路径为:/day/a/b
手动设置路径:以“/项目名:开始,以”/“结尾。
4.步骤分析
1.创建一个servlet Remservlet,路径为/rem;
2.在servlet中: 1)获取制定cookie,例如名称为lastTime
request.getCookies()
2)判断cookie是否为空。若为空,提示信息,第一次访问。若不为空,获取cookie的value,展示信息为:您上次访问事件为...... 3)将访问事件记录,写回浏览器
(1)创建cookie
(2)写回浏览器
5.代码实现
package com.itcast.rem;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 记录访问的事件
*/
public class RemServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码
response.setContentType("text/html;charset=utf-8");
PrintWriter w = response.getWriter();
//获取制定cookie
Cookie c = getCookieByName("lastTime",request.getCookies());
//判断是否为空
if(c == null) {
w.print("您是第一次登陆");
}else {
String value = c.getValue();
long time = Long.parseLong(value);
Date date = new Date(time);
w.print("您上次访问的时间为"+date.toLocaleString());
}
//将当前访问事件记录
//创建cookie,末尾加空格是为了转化为字符串
c = new Cookie("lastTime", new Date().getTime()+"");
//写回
response.addCookie(c);
}
/**
* 通过名称在cookie素组获取指定的cookie
* @param name cookie名称
* @param cookies 数组
* @return
*/
private Cookie getCookieByName(String name, Cookie[] cookies) {
if(cookies!=null) {
for(Cookie c:cookies) {
if(name.equals(c.getName())) {
return c;
}
}
}
return null;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
6.实现持久化
实现cookie的持久化,并更改路径。
//将当前访问事件记录
//创建cookie,末尾加空格是为了转化为字符串
c = new Cookie("lastTime", new Date().getTime()+"");
//持久化cookie,保存时间为1个小时
c.setMaxAge(3600);
//设置路径,为“0831/”
c.setPath(request.getContextPath()+"/");
//写回浏览器
response.addCookie(c);