2024-04-11
大学课程
00

目录

1 创建 Servlet 项目
2 处理并展示请求信息
3 请求转发实践
4 重定向实践
5 包含实践
6 Cookie实践
7 Session 实践

记录实验2过程及代码。

注意Tomcat10 -> jakarta.servlet-api,Tomcat9以下 -> javax.servlet-api

1 创建 Servlet 项目

java
package org.example.webstructure.experiment2; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(value = "/FirstServlet") public class FirstServlet extends HttpServlet { // 继承HttpServlet @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 重写doGet super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 重写doPost super.doPost(req, resp); } }

2 处理并展示请求信息

java
package org.example.webstructure.experiment2; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet(value = "/SecondServlet") public class SecondServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String parameter1 = req.getParameter("parameter1"); // 获取请求参数 String header = req.getHeader("parameter2"); // 获取http头信息 ServletContext context = getServletContext(); context.log(parameter1); // 输出到log里 context.log(header); PrintWriter out = resp.getWriter(); out.println(parameter1); // 输出到响应体里 out.println(header); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }

实际效果:

ApiFox需要先设置好前置URL:

image.png

image.png

image.png

(要达到上图这个效果,需要先在运行配置里的log部分显示所有的log,然后在右侧筛选处选择all)

3 请求转发实践

java
// ThirdServlet_1.java package org.example.webstructure.experiment2; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(value = "/ThirdServlet_1") public class ThirdServlet_1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getRequestDispatcher("/ThirdServlet_2").forward(req, resp); // 转发 log("Request Forwarded"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } } // ThirdServlet_2.java package org.example.webstructure.experiment2; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(value = "/ThirdServlet_2") public class ThirdServlet_2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { log(req.getParameter("parameter")); // 收到请求 输出log log("Request Received"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }

效果:

image.png

image.png

4 重定向实践

java
// FourthServlet_1.java package org.example.webstructure.experiment2; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(value = "/FourthServlet_1") public class FourthServlet_1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setStatus(302); // 设置状态码 resp.setHeader("Location", "/WebStructure/FourthServlet_2"); // 重定向 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } } // FourthServlet_2.java package org.example.webstructure.experiment2; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(value = "/FourthServlet_2") public class FourthServlet_2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { log("Request Received"); // 收到请求 打印log super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }

效果:

image.png

image.png

5 包含实践

java
// FifthServlet_1.java package org.example.webstructure.experiment2; import com.google.gson.Gson; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet(value = "/FifthServlet_1") public class FifthServlet_1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { RequestDispatcher requestDispatcher = req.getRequestDispatcher("/FifthServlet_2"); // 设定目标资源路径 requestDispatcher.include(req, resp); // 包含 PrintWriter printWriter = resp.getWriter(); printWriter.write("Wrote from FifthServlet_1\n"); // 写入 } @Override protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPut(req, resp); } } // FifthServlet_2.java package org.example.webstructure.experiment2; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet(value = "/FifthServlet_2") public class FifthServlet_2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter printWriter = resp.getWriter(); printWriter.write("Wrote from FifthServlet_2\n"); // 写入 } }

效果:

image.png

6 Cookie实践

java
package org.example.webstructure.experiment2; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.time.LocalDateTime; @WebServlet(value = "/SixthServlet") public class SixthServlet extends HttpServlet { LocalDateTime time = null; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.addCookie(new Cookie("parameter1", "value1")); if (this.time == null) { this.time = LocalDateTime.now(); } else { resp.addCookie(new Cookie("lastLoginTime", this.time.toString())); this.time = LocalDateTime.now(); } } }

效果:

第一次请求:

image.png

第二次请求:

image.png

7 Session 实践

java
// SeventhServlet_1.java package org.example.webstructure.experiment2; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import java.util.Objects; @WebServlet(value = "/SeventhServlet_1") public class SeventhServlet_1 extends HttpServlet { Map<String, String> userInfo = new HashMap<String, String>(); // 假装这是数据库 @Override public void init() throws ServletException { this.userInfo.put("user1", "123456"); // 数据库里有用户user1 密码是123456 } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("userName"); // 获取参数 String password = req.getParameter("userPassword"); PrintWriter out = resp.getWriter(); if (Objects.equals(this.userInfo.get(name), password)) { // 登录验证 HttpSession httpSession = req.getSession(); httpSession.setAttribute("user", new UserEntity(name, password)); // 用户信息存储到 HttpSession 对象中 out.write("Login Success!\n"); } else { out.write("UserName or UserPassword is Incorrect!\n"); } } } // SeventhServlet_2.java package org.example.webstructure.experiment2; import com.google.gson.Gson; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; @WebServlet(value = "/SeventhServlet_2") public class SeventhServlet_2 extends HttpServlet { Gson gson = new Gson(); // 生成Json字符串用的 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { UserEntity user = (UserEntity) req.getSession().getAttribute("user"); // 先尝试获取用户信息 if (user == null) { // 这就说明还没登录 resp.getWriter().write("User is not Logged In!"); return; } int operation = Integer.parseInt(req.getParameter("operation")); // 获取操作 PrintWriter out = resp.getWriter(); switch (operation) { case 1: { user.addGood(req.getParameter("goodName")); // 增 break; } case 2: { user.deleteGood(req.getParameter("goodName")); // 删 break; } case 3: { user.setGoodNumber(req.getParameter("goodName"), Integer.parseInt(req.getParameter("goodNumber"))); // 改 break; } default: { out.write("Operation not recognized"); return; } } out.write(gson.toJson(user.shoppingCart)); // 查 } } // UserEntity.java package org.example.webstructure.experiment2; import java.util.ArrayList; import java.util.Objects; // 用户数据类 public class UserEntity { String userName; String password; ArrayList<Good> shoppingCart = new ArrayList<>(); // 购物车信息 public UserEntity(String userName, String password) { this.userName = userName; this.password = password; } // 增加商品 public void addGood(String goodName) { for (Good good : this.shoppingCart) { if (Objects.equals(good.name, goodName)) { good.number += 1; return; } } this.shoppingCart.add(new Good(goodName, 1)); } // 删除商品 public boolean deleteGood(String goodName) { for (Good good : this.shoppingCart) { if (Objects.equals(good.name, goodName)) { this.shoppingCart.remove(good); return true; } } return false; } // 修改商品数量 public void setGoodNumber(String goodName, int goodNumber) { for (Good good : this.shoppingCart) { if (Objects.equals(good.name, goodName)) { good.number = goodNumber; return; } } this.shoppingCart.add(new Good(goodName, goodNumber)); } // 查询商品数量 public int getGoodNumber(String goodName) { for (Good good : this.shoppingCart) { if (Objects.equals(good.name, goodName)) { return good.number; } } return -1; } } // 商品数据类 class Good { String name; int number; public Good(String name, int number) { this.name = name; this.number = number; } }

效果:

登录失败:

image.png

登录成功:

image.png

image.png

登录后对购物车进行操作:

增加商品(goodNumber参数不必要):

image.png

删除商品(goodNumber参数不必要):

image.png

修改商品数量:

image.png

没登录时直接对购物车进行操作:

image.png

本文作者:御坂19327号

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!