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;
@WebServlet("/LastAccessServlet") public class LastAccessServlet 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"); 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); }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 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框架")); } public static Collection<Book> getAll(){ return map.values(); } 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;
@WebServlet("/ListBookServlet") public class ListBookServlet 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"); 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/>"); } }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 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 { 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 { 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 { 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 { 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 { 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>
|
最后登录就行了