【JavaWeb】Servlet中HttpServletRequest 类和HttpServletResponse 类

本文详细介绍了HTTP请求和响应的工作原理。重点讲解了HttpServletRequest和HttpServletResponse类的使用方法,包括如何处理请求参数、解决乱码问题、实现请求转发与重定向等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、HttpServletRequest 类

1、HttpServletRequest

客户端请求进入Tomcat服务器后,服务器会把把请求过来的 HTTP 协议信息解析好封装到 Request 对象中然后传递到 service 方法( doGet 和 doPost) 中给我们使用。 我们可以通过 HttpServletRequest 对象, 获取到所有请求的信息。

2、HttpServletRequest 常用方法

方法名称作用
getRequestURI()获取请求的资源路径
getRequestURL()获取请求的统一资源定位符(绝对路径),加上了主机信息
getRemoteHost()获取客户端的 ip 地址
getParameter()获取请求参数
getParameterValues()获取多个请求参数
getMethod()获取请求的方式 GET 或 POST
setAttribute(; 设置域数据
getAttribute(key);获取域数据
getRequestDispatcher();获取请求转发对象

3、乱码问题

doGet 请求的中文乱码解决:

/ 获取请求参数
String username = req.getParameter("username");
//1 先以 iso8859-1 进行编码
//2 再以 utf-8 进行解码
username = new String(username.getBytes("iso-8859-1"), "UTF-8");

POST 请求的中文乱码解决

// 设置请求体的字符集为 UTF-8, 从而解决 post 请求的中文乱码问题, 一定写在最前面
req.setCharacterEncoding("UTF-8");

4、请求转发

请求转发是指, 服务器收到请求后, 从一次资源跳转到另一个资源的操作叫请求转发。
在这里插入图片描述
总结:
转发的特点:1、浏览器地址无变化;2、一次请求;3、共享request中数据;4、可以转发到WEB-INF目录下;5、不可以访问工程外资源。

5、xml中base标签

base标签可以设置当前页面跳转时候,参照跳转的路径。

<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--base 标签设置页面相对路径工作时参照的地址
href 属性就是参数的地址值
-->
<base href="http://localhost:8080/07_servlet/a/b/">
</head>
<body>
这是 a 下的 b 下的 c.html 页面<br/>
<a href="../../index.html">跳回首页</a><br/>
</body>
</html>

6、路径

在这里插入图片描述
web 中 / 斜杠的不同意义
如果被浏览器解析,就是 http://ip:port/
如果被服务器解析,得到地址 http://ip:port/工程路径

二、HttpServletResponse 类

1、HttpServletResponse

浏览器每次发送请求后, Tomcat 服务器也会创建一个 Response 对象传递给 Servlet 程序去使用。来传递服务器对浏览器请求的响应信息。需要返回给浏览器的信息,都可以通过HttpServletResponse 对象来设置。

2、常用两个输出

httpServletResponse.getWriter();  // 常用于回传字符串(常用)
httpServletResponse.getOutputStream(); // 常用于下载(传递二进制数据)

两个不能同时使用,同时使用会报错。

在浏览器页面,通过响应流打印hello。

PrintWriter writer = httpServletResponse.getWriter(); // 响应流
        writer.print("hello");

3、响应乱码问题

方法一:
先设置服务器

httpServletResponse.setCharacterEncoding("UTF-8");

再设置浏览器

 httpServletResponse.setHeader("Content-Type", "text/html; charset=UTF-8");

方法二:
同时设置

httpServletResponse.setContentType("text/html; charset=UTF-8");

4、请求重定向

请求重定向:浏览器向服务器发送请求,服务器返回给浏览器一些新的地址,让其在新的地址进行访问。这就是重定向。
在这里插入图片描述
特点:1、地址改变;2、两次请求,3、不共享resquest域数据;4、不能访问web-INF;5、可以访问外部资源。

public class DemoServlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("/demo02");
    }
}
### 如何在 Java Web 开发中使用 Servlet 封装实体Java Web 应用程序开发中,Servlet 是处理 HTTP 请求的核心组件之一。通过将请求中的数据封装到实体中,可以提高代码的可读性维护性。以下是关于如何在 Java Web 开发中使用 Servlet 封装实体的具体实现方法。 #### 实体定义 首先,创建一个简单的实体 `User` 来表示用户的属性: ```java public class User { private String name; private int age; // 构造函数 public User() {} public User(String name, int age) { this.name = name; this.age = age; } // Getter Setter 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } ``` #### 使用 Servlet 封装实体 接下来,在 Servlet 中获取请求参数并将其封装到 `User` 对象中: ```java package com.servlet03; 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 java.io.IOException; import java.io.PrintWriter; @WebServlet("/user") public class UserServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置字符编码 req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=UTF-8"); // 获取请求参数 String name = req.getParameter("name"); String ageStr = req.getParameter("age"); // 参数校验 if (name == null || name.isEmpty() || ageStr == null || ageStr.isEmpty()) { PrintWriter writer = resp.getWriter(); writer.write("Invalid input parameters."); return; } try { // 转换年龄为整数 int age = Integer.parseInt(ageStr); // 创建 User 对象并将参数赋值给它 User user = new User(name, age); // 输出结果 PrintWriter writer = resp.getWriter(); writer.write("<html><body>"); writer.write("Name: " + user.getName() + "<br/>"); writer.write("Age: " + user.getAge()); writer.write("</body></html>"); } catch (NumberFormatException e) { resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid age format."); } } } ``` 在这个例子中,`doPost` 方法用于接收 POST 请求,并从请求中提取 `name` `age` 参数。这些参数被用来初始化一个新的 `User` 对象[^1]。 #### 编译运行 为了确保 Servlet 正常工作,需要编译项目时引入 Tomcat 的 `servlet-api.jar` 文件。可以通过以下命令完成编译操作[^4]: ```bash javac -encoding utf-8 -cp ./tomcat/lib/servlet-api.jar:. HelloServlet.java ``` 其中 `-cp` 参数指定了路径,包含了 `servlet-api.jar` 所需的依赖库。 --- ### 注意事项 1. **异常处理**:在实际应用中应增加更多的输入验证逻辑来防止潜在的安全隐患。 2. **线程安全**:由于多个客户端可能同时访问同一个 Servlet 实例,因此需要注意共享资源的同步问题。 3. **日志记录**:建议集成日志框架(如 Log4j 或 SLF4J),以便更好地跟踪应用程序的行为。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值