JavaWeb-05 会话及其会话技术

实例:显示用户上次访问时间

###1.创建Servlet
在Eclipse中新建Web项目chapter05,并在该项目下新建一个名称为pidan.cookie.example的包,在该包中编写一个名称为LastAccessServlet的Servlet类,用于实现获取 Cookie信息并将当前时间作为Cookie 值发送给客户端。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package bai.cookie.example;

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 LastAccessServlet
*/
@WebServlet("/LastAccessServlet")
public class LastAccessServlet 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("lastccess".equals(name)) {
lastTime=cookies[i].getValue();
}
}
if(lastTime==null) {
response.getWriter().print("第一次访问本网站!");
}else {
response.getWriter().print("上次访问的时间是:"+lastTime);
response.getWriter().print("学号:2020080604029");
}
String time=String.format("%tF%<tT", new Date());
Cookie cookie=new Cookie("lastccess", time);
Cookie cookie1 = new Cookie("dashuju", "2004");
response.addCookie(cookie);
response.addCookie(cookie1);
}

/**
* @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);
}

}

由于这里直接通过 @WebServlet 标签配置URL映射,不再需要从 web.xml 里面配置 servlet。

启动Tomcat 服务器,在浏览器的地址栏中输入 localhost:8080/chapter05/LastAccessServlet”访问 LastAccessServlet,由于是第一次访问LastAccessServlet:

重新访问地址(刷新页面):

实例:实现购物车

1.新建一个名称为pidan.session.example01的包,在该包中创建一个名称为Book的类,该类用于封装图书的信息,
其中定义了id和name属性,分别用来表示书的编号和名称。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package bai.session.example01;

public class Book {
private String id;
private String name;
public Book() {

}
public Book(String id, String name) {

this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

###2.在pidan.session.example01包中创建一个名称为BookDB的类,该类用于模拟保存所有图书的数据库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package bai.session.example01;

import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;

public class BookDB {
private static Map<String,Book> map = new LinkedHashMap<String,Book>();
static{
map.put("1", new Book("1","javaWeb"));
map.put("2", new Book("2","jdbc入门"));
map.put("3", new Book("3","java基础"));
map.put("4", new Book("4","struts框架"));
map.put("5", new Book("5","hibernate框架"));

}
//1.得到所有图书
public static Collection<Book> getAll(){
return map.values();
}
//2.根据map的key,也就是图书的id,得到某本图书
public static Book getBook(String id){
return map.get(id);
}
}

###3.创建一个名称为ListBookServlet的Servlet类,
该Servlet用于显示所有可购买图书的列表,通过单击“购买”链接,便可将指定的图书添加到购物车中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package bai.session.example01;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;

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 BookDB
*/
@WebServlet("/ListBookServlet")
public class ListBookServlet 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");
//1,
Collection <Book> books= BookDB.getAll();

PrintWriter out=response.getWriter();

out.print("本网站售卖的书籍:"+"<br/><br/>");

for(Book b:books) {
String name= b.getName();
String id=b.getId();
String url="<a href='purcharse?id="+id+"'>点击购买</a>";
out.print("图书名称: "+name+" "+url+"<br/><br/>");
}
}

/**
* @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);
}

}

###4.创建一个名称为PurchaseServlet的Servlet类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package bai.session.example01;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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 javax.servlet.http.HttpSession;

@WebServlet("/purcharse")
public class purcharseServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String id=request.getParameter("id");
System.out.println("id :"+id);
if(id==null) {
response.sendRedirect("list");
return;
}
Book book=BookDB.getBook(id);
HttpSession session=request.getSession();//获得内存区域
List<Book> list=(List<Book>)session.getAttribute("cart");//获得购物车
if(list==null) {//首次购买
list =new ArrayList<Book>();
session.setAttribute("cart", list);
}
list.add(book);
Cookie cookie =new Cookie("JESSIONID", session.getId());
response.addCookie(cookie);
response.sendRedirect("cart");
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}

###5.创建一个名称为CartServlet的Servlet类,该类主要用于展示用户已经购买的图书列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package bai.session.example01;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

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("/cart")
public class CartServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
List<Book> cart=null;
HttpSession session = request.getSession(false);
boolean cartFlag=true;
if(session==null) {
cartFlag=false;
}else {
cart=(List<Book>)session.getAttribute("cart");
if(cart==null) {
cartFlag=false;
}
}
if(!cartFlag) {
out.print("您的购物车里面没有图书,请前往购买");
}else {
out.print("购买图书如下:"+"<br/>");
for(Book b:cart) {
out.print(/*"购买的图书:"+*/b.getName()+"<br/>");
}
}
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}

###6.启动Tomcat 服务器,访问ListBookServlet,
1.单击图中“javaweb开发”后的“点击购买”链接
2.再次访问(或点击浏览器的返回上一页)ListBookServlet,选择“jdbc开发”后的“点击购买”链接

任务:实现用户登录

实现效果:

用户登录的整个流程,当用户访问某个网站的首界面时,首先会判断用户是否登录,如果已经登录则在首界面中显示用户登录信息,否则进入登录页面,完成用户登录功能,然后显示用户登录信息。
在用户登录的情况下,如果单击用户登录界面中的“退出”时,就会注销当前用户的信息,返回首界面。

###1.创建封装用户信息类
1.在chapter05项目的src下新建一个名称为pidan.session.example02的包,在包中编写一个名称为User的类,
User类中包含username和password两个属性以及其getter和setter方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package bai.session.example02;

public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}

2.创建Servlet
在pidan.session.example02包中编写IndexServlet 类, 该Servlet 用于显示网站的首界面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package bai.session.example02;

import java.io.IOException;
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 javax.servlet.http.HttpSession;

@WebServlet("/IndexServlevt")
public class IndexServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
HttpSession session= request.getSession();
User user =(User) session.getAttribute("user");
if(user==null) {
response.getWriter().print("您还没登录,请<a href='login.html'>登录</a>");
}else {
response.getWriter().print("你已登录,欢迎你,"+user.getUsername()+"!");
response.getWriter().print("<a href='LogoutServlet'>退出</a>");
Cookie cookie =new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60*30);
cookie.setPath("/chapter05");
response.addCookie(cookie);
}
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}**

3.在pidan.session.example02包中编写LoginServlet,该Servlet用于显
示用户登录成功后的界面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package bai.session.example02;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
PrintWriter pw=response.getWriter();
if(("pidan").equals(username)&&("666").equals(password)) {
User user = new User();
user.setUsername(username);
user.setPassword(password);
request.getSession().setAttribute("user", user);
response.sendRedirect("IndexServlevt");
}else {
pw.write("用户名或密码错误,登录失败");
}
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}

4.在pidan.session.example02包中编写LogoutServet,该Servlet用于完
成用户注销功能,当用户单击【退出】时,该类会将Session对象中的用户信息移除,并跳
转到网站的首界面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package bai.session.example02;

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;

@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getSession().removeAttribute("user");
response.sendRedirect("IndexServlevt");
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}

3.创建登陆页面

在chapter05项目的WebContent目录下创建一个名称为login.html的页面,该页面中包含用户登录表单信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form name="reg" action="/chapter05/LoginServlet" method="post">
用户名:<input name="username" type="text" /><br/>
密__码:<input name="password" type="password" /><br/>
<input type="submit" value="提交" id="bt" />
</form>
</body>
</html>

最后登录就行了