WEB应用开发设计实验报告四
一.实验课题
会话技术Cookie和Session的应用
二. 实验目的
1.掌握Cookie对象和常用API的运用。
2.掌握Session对象和常用API的运用。
三. 实验内容
1、完成课本任务5-2。
2、完成课本任务5-3。
四. 实验步骤
在以下表格中给出实验内容的相应代码。
5-2 实现购物车
BOOK.java
1./**
2. * BOOK.java
3. */
4.
5.package sessioin.shoppingcar;
6.
7./**
8. * @Title:BookStore Shopping cart
9. * @Description: [用session建一个购物车]
10. * @Param:
11. * @author <a href="mail to: aaa@qq.com">JSQ97</a>
12. * @CreateDate: 2020年5月30日 下午4:08:01</p>
13. * @update: [序号][日期YYYY-MM-DD] [更改人姓名][变更描述]
14. *
15. * 1.方法与步骤
16. * 1)创建Book封装图书信息:Book
17. * 2)创建BookDataBase 模拟数据库,里面保存图书
18. * 3)提供图书的购买页面:ListBookServlet
19. * 4)添加购物车:PurcharseServlet
20. * 5)回显购物车图书信息:CartServlet
21. */
22.public class Book {
23. private String id;
24. private String name;
25. //Alt+shift+s 创造构造参数快捷键
26. /**
27. *
28. */
29. public Book() {
30.
31. }
32.
33. /**
34. * @param id
35. * @param name
36. */
37. public Book(String id, String name) {
38. this.id = id;
39. this.name = name;
40. }
41.
42. /**
43. * @return the id
44. */
45. public String getId() {
46. return id;
47. }
48. /**
49. * @param id the id to set
50. */
51. public void setId(String id) {
52. this.id = id;
53. }
54. /**
55. * @return the name
56. */
57. public String getName() {
58. return name;
59. }
60. /**
61. * @param name the name to set
62. */
63. public void setName(String name) {
64. this.name = name;
65. }
66.
67.}
BookStoreDataBase.java
1.package sessioin.shoppingcar;
2.
3.import java.util.Collection;
4.import java.util.LinkedHashMap;
5.import java.util.Map;
6.
7./**
8. * @Title:BookStoreDataBase
9. * @Description: [创建一个模拟的数据库]
10. * @Param:
11. * @author <a href="mail to: aaa@qq.com">JSQ97</a>
12. * @CreateDate: 2020年5月30日 下午4:15:50</p>
13. * @update: [序号][日期YYYY-MM-DD] [更改人姓名][变更描述]
14. */
15.public class BookDataBase {
16. /**
17. * 创建模拟数据库,static静态代码块内内容只加载一次
18. */
19. private static Map<String,Book> map = new LinkedHashMap<String,Book>();
20. static {
21. map.put("1",new Book("1","javaWeb"));
22. map.put("2",new Book("2","jdbc入门"));
23. map.put("3",new Book("3","java基础"));
24. map.put("4",new Book("4","Struts框架"));
25. map.put("5",new Book("5","hibernate框架"));
26. }
27. //1. 得到所有图书的方法
28. /**
29. * @return
30. */
31. public static Collection<Book> getAll(){
32. return map.values();
33. }
34. //2. 根据map的key,也就是图书id来得到某一本图书
35. /**
36. * @param id
37. * @return
38. */
39. public static Book getBook(String id) {
40. return map.get(id);
41. }
42.}
ListBookServlet.java
1.package sessioin.shoppingcar;
2.
3.import java.io.IOException;
4.import java.io.PrintWriter;
5.import java.util.Collection;
6.
7.import javax.servlet.ServletException;
8.import javax.servlet.annotation.WebServlet;
9.import javax.servlet.http.HttpServlet;
10.import javax.servlet.http.HttpServletRequest;
11.import javax.servlet.http.HttpServletResponse;
12.
13./**
14. * 提供一个购买图书的页面
15. */
16.@WebServlet("/List")
17.public class ListBookServlet extends HttpServlet {
18. private static final long serialVersionUID = 1L;
19.
20.
21.
22. /**
23. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
24. */
25. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
26. // 处理响应中文的乱码问题
27. response.setContentType("text/html;charset = utf-8");
28. //1.得到所有的图书
29. Collection<Book> books = BookDataBase.getAll();
30. //2.回显页面
31. PrintWriter out = response.getWriter();
32. out.print("以下是本网站售卖的所有图书:"+ "<br/><br/>");
33. //3.遍历集合,把图书回显页面
34. for(Book b:books) {
35. //4.得到图书的名称
36. String name = b.getName();
37. String id = b.getId();
38. //5.提供一个购买图书的链接
39. String url = "<a herf = '/BookStore/BookDataBase/purcharse?id = "+id+"'>点击购买</a>";
40. out.print("图书名称: "+name+" "+url+"<br/><br/>");
41. }
42.
43. }
44.
45. /**
46. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
47. */
48. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
49. // TODO Auto-generated method stub
50. this.doGet(request, response);
51. }
52.
53.}
CartServlet.java
1.package servlet_test;
2.
3.import java.io.IOException;
4.import java.io.PrintWriter;
5.import java.util.List;
6.
7.import javax.servlet.ServletException;
8.import javax.servlet.http.HttpServlet;
9.import javax.servlet.http.HttpServletRequest;
10.import javax.servlet.http.HttpServletResponse;
11.import javax.servlet.http.HttpSession;
12.
13./**
14. * Servlet implementation class CartServlet
15. */
16.public class CartServlet extends HttpServlet {
17. private static final long serialVersionUID = 1L;
18.
19. /**
20. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
21. */
22. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
23. // TODO Auto-generated method stub
24. response.setContentType("text/html;charset = utf-8");
25. PrintWriter out = response.getWriter();
26. //变量cart引用用户的购物车
27. List<Book> cart = null;
28. //变量pruFlag标记用户是否买过商品
29. boolean pruFlag = true;
30. //获得用户的session
31. HttpSession session = request.getSession(false);
32. //如果session为null,pruFlag设置为false
33.
34. if(session == null) {
35. pruFlag = false;
36. }else {
37. //获得用户购物车
38. cart = (List) session.getAttribute("cart");
39. //如果用过的购物车为null,pruFlage设置为False
40. if(cart == null) {
41. pruFlag = false;
42. }
43. }
44. /*
45. * 如果pruFlag为False,表明用户没有购买图书,重定向到ListServlet页面
46. */
47.
48. if(pruFlag = false) {
49. out.write("对不起!您还没有购买任何商品!<br />");
50. }else {
51. //否则显示用户购买图书信息
52. out.write("您购买的图书有: <br />");
53. double price = 0;
54. for(Book b:cart) {
55. out.write(b.getName()+"<br/>");
56. }
57. }
58. }
59.
60. /**
61. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
62. */
63. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
64. // TODO Auto-generated method stub
65. doGet(request, response);
66. }
67.
68.}
PurchaseServlet.java
1.package servlet_test;
2.
3.import java.io.IOException;
4.import java.util.ArrayList;
5.import java.util.List;
6.
7.import javax.servlet.ServletException;
8.import javax.servlet.http.Cookie;
9.import javax.servlet.http.HttpServlet;
10.import javax.servlet.http.HttpServletRequest;
11.import javax.servlet.http.HttpServletResponse;
12.import javax.servlet.http.HttpSession;
13.
14./**
15. * Servlet implementation class PurchaseServlet
16. */
17.public class PurchaseServlet extends HttpServlet {
18. private static final long serialVersionUID = 1L;
19.
20. /**
21. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
22. */
23. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
24. // 获得用户购买的商品
25. String id = request.getParameter("id");
26. if(id == null) {
27. //如果id==null(没有此书),就重定向到listBookServlet页面
28. String url = "/ListBookServlet";
29. response.sendRedirect(url);//重定向
30. return;
31. }
32.
33. Book b = BookDataBase.getBook(id);
34. //创建或获得用户的session对象
35. HttpSession session = request.getSession();
36. //从session对象里获得用户的购物车
37. List<Book> cart = (List)session.getAttribute("cart");
38. if(cart == null) {
39. //首次购买,为用户创建一个购物车(List集合模拟购物车)
40. cart = new ArrayList<Book>();
41. //将购物车存入Session对象
42. session.setAttribute("cart", cart);
43. }
44. cart.add(b);//这个是购物车列表
45. //创建cookie存放session的标识号
46. Cookie cookie = new Cookie("UserID",session.getId());
47. cookie.setMaxAge(60*30);//这个是cookie的有效时间:60s*30个=半小时
48. cookie.setPath("/servlet_test");//设置该cookie项有效目录路径
49. response.addCookie(cookie);
50. //重定向到购物车页面
51. String url = "/servlet_test/CartServlet";
52. response.sendRedirect(url);
53.
54. }
55.
56. /**
57. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
58. */
59. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
60. // TODO Auto-generated method stub
61. doGet(request, response);
62. }
63.
64.}
CartServlet.java
1.package servlet_test;
2.
3.import java.io.IOException;
4.import java.io.PrintWriter;
5.import java.util.List;
6.
7.import javax.servlet.ServletException;
8.import javax.servlet.http.HttpServlet;
9.import javax.servlet.http.HttpServletRequest;
10.import javax.servlet.http.HttpServletResponse;
11.import javax.servlet.http.HttpSession;
12.
13./**
14. * Servlet implementation class CartServlet
15. */
16.public class CartServlet extends HttpServlet {
17. private static final long serialVersionUID = 1L;
18.
19. /**
20. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
21. */
22. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
23. // TODO Auto-generated method stub
24. response.setContentType("text/html;charset = utf-8");
25. PrintWriter out = response.getWriter();
26. //变量cart引用用户的购物车
27. List<Book> cart = null;
28. //变量pruFlag标记用户是否买过商品
29. boolean pruFlag = true;
30. //获得用户的session
31. HttpSession session = request.getSession(false);
32. //如果session为null,pruFlag设置为false
33.
34. if(session == null) {
35. pruFlag = false;
36. }else {
37. //获得用户购物车
38. cart = (List) session.getAttribute("cart");
39. //如果用过的购物车为null,pruFlage设置为False
40. if(cart == null) {
41. pruFlag = false;
42. }
43. }
44. /*
45. * 如果pruFlag为False,表明用户没有购买图书,重定向到ListServlet页面
46. */
47.
48. if(pruFlag = false) {
49. out.write("对不起!您还没有购买任何商品!<br />");
50. }else {
51. //否则显示用户购买图书信息
52. out.write("您购买的图书有: <br />");
53. double price = 0;
54. for(Book b:cart) {
55. out.write(b.getName()+"<br/>");
56. }
57. }
58. }
59.
60. /**
61. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
62. */
63. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
64. // TODO Auto-generated method stub
65. doGet(request, response);
66. }
67.
68.}
5-3 实现用户登录
IndexServlet.java
1.package login;
2.
3.import java.io.IOException;
4.import javax.servlet.ServletException;
5.import javax.servlet.http.Cookie;
6.import javax.servlet.http.HttpServlet;
7.import javax.servlet.http.HttpServletRequest;
8.import javax.servlet.http.HttpServletResponse;
9.import javax.servlet.http.HttpSession;
10.
11./**
12. * Servlet implementation class IndexServlet
13. */
14.public class IndexServlet extends HttpServlet {
15. private static final long serialVersionUID = 1L;
16. /**
17. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
18. */
19. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
20. // 解决中文乱码
21. response.setContentType("text/html;charset = utf-8");
22. //创建或者获取保存用户信息的session对象
23. HttpSession session = request.getSession();
24. User user = (User) session.getAttribute("user");
25. if(user == null) {
26. response.getWriter().print("您还没有登录,请<a href = 'servlet_test/login.html'>登录</a>");
27. }else {
28. response.getWriter().print("您已登录,欢迎你 " + user.getUsername() + " !");
29. response.getWriter().print("<a href = '/login/LogoutServlet'>退出</a>");
30. //创建cookie存放Session的标识号
31. Cookie cookie = new Cookie("JSESSIONID",session.getId());
32. cookie.setMaxAge(60*30);
33. cookie.setPath("/login");
34. response.addCookie(cookie);
35. }
36. }
37.
38. /**
39. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
40. */
41. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
42. // TODO Auto-generated method stub
43. doGet(request, response);
44. }
45.
46.}
LoginServlet.java
1.package login;
2.
3.import java.io.IOException;
4.import java.io.PrintWriter;
5.
6.import javax.servlet.ServletException;
7.import javax.servlet.http.HttpServlet;
8.import javax.servlet.http.HttpServletRequest;
9.import javax.servlet.http.HttpServletResponse;
10.
11./**
12. * Servlet implementation class LoginServlet
13. */
14.public class LoginServlet extends HttpServlet {
15. private static final long serialVersionUID = 1L;
16. /**
17. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
18. */
19. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
20. // TODO Auto-generated method stub
21. response.setContentType("text/html;charset = utf-8");
22. String username = request.getParameter("username");
23. String PSW = request.getParameter("PSW");
24. PrintWriter pw = response.getWriter();
25. //假设正确的用户名是JWH 密码是123 (这一段之后可以连接数据库扫描用户)
26. if(("JWH").equals(username) && ("123").equals(PSW)) {
27. User user = new User();
28. user.setUsername(username);
29. user.setPSW(PSW);
30. request.getSession().setAttribute("user", user);
31. response.sendRedirect("/login/IndexServlet");
32. }else {
33. pw.write("用户名或密码错误,登录失败");
34. }
35. }
36.
37. /**
38. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
39. */
40. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
41. // TODO Auto-generated method stub
42. doGet(request, response);
43. }
44.
45.}
LogoutServlet.java
1.package login;
2.
3.import java.io.IOException;
4.import javax.servlet.ServletException;
5.import javax.servlet.http.HttpServlet;
6.import javax.servlet.http.HttpServletRequest;
7.import javax.servlet.http.HttpServletResponse;
8.
9./**
10. * Servlet implementation class LogoutServlet
11. */
12.public class LogoutServlet extends HttpServlet {
13. private static final long serialVersionUID = 1L;
14. /**
15. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
16. */
17. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
18. // 将session对象中的user对象移除
19. request.getSession().removeAttribute("user");
20. response.sendRedirect("/login/IndexServlet");
21. }
22.
23. /**
24. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
25. */
26. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
27. // TODO Auto-generated method stub
28. doGet(request, response);
29. }
30.
31.}
Login.html
1.<!DOCTYPE html>
2.<html>
3.<head>
4.<meta charset="UTF-8">
5.<title>login</title>
6.</head>
7.<body>
8. <!-- form的action属性:必需的 action 属性规定当提交表单时,向何处发送表单数据 -->
9. <form name="reg" action="login.LoginServlet" method="post">
10. 用户名:<input name = "username" type = "text" /><br />
11. 密码:<input name = "PSW" type = "password" /><br />
12. <input type = "submit" value = "提交" id = "bt" />
13. </form>
14.</body>
15.</html>
五. 实验结果(截图)
此处对上述所有实验内容最终呈现的网页或操作界面进行截图展示
1.购物车实现:
2.实现用户登录
六.心得与体会(不少于100字)
-
找到了在word里插入好看的代码的方法:highlight不管用我秃了,好像highlight只能导出来HTML然后再粘贴。我直接用PlanetB网站一键生成代码,舒服多了。
-
Session和Cookie的区别:
1). cookie数据存放在客户的浏览器上,session数据放在服务器上。
2). cookie主要用于登录网站:今天输入用户名密码登录了,第二天也可以直接打开。
3). 而session主要是购物车:服务器端需要用session储存一些信息来判别。
可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。有关session的使用方法https://www.cnblogs.com/xdp-gacl/p/3855702.html
-
之前跟着视频做完一直都不知道为什么我那个点击购买的链接做不出来,后来跟着书改完代码发现可以做出来:
把ListBookServlet.java里那个url去掉<a href></a>
标签,放到out.Print里直接用”<a href = ‘”+url+”’>
点击购买</a>。
-
关于点击购买后404页面的问题:ListBookServlet.java里的Url填错了我吐了。
-
关于购买第二本书的时候页面不显示cookie出错的问题:
PurchaseServlet.java里的if(cart==null)的 } 缺失,导致首次创建完session后没有后续指令。(相当于只有if没有else) -
关于login页面点击提交用户名密码后404,且登录IndexServlet可以正常跳转到login的问题(未解决):
★ 猜测1:login.html的action有问题,不知道post到哪了。检测action的url可以正常连接到LoginServlet.java
解决1:尝试更改form的method,get、post、删除都试过了没用。
★ 猜测2:绝壁是LoginServlet出问题了!不能正常检测和链接到IndexServlet
解决2:逐字逐句的对着书看了一遍,没有错误(疯狂挠头)。response的重定向链接也可以正常跳转。不懂为什么
上一篇: 统一认证 - Apereo CAS 小试
下一篇: JUC - Lock接口