第三篇:Servlet实战开发:请求响应处理与页面跳转核心指南
·
HttpServletRequest 核心功能
HttpServletRequest 对象封装了客户端请求的所有信息,主要分为以下几类功能:
获取请求行信息
String getMethod():返回请求方法(GET/POST等)String getRequestURI():返回请求URI(不包含协议和主机部分)String getProtocol():返回协议版本(如HTTP/1.1)String getRemoteAddr():返回客户端IP地址
获取请求头信息
String getHeader(String name):获取指定名称的请求头值Enumeration<String> getHeaderNames():返回所有请求头名称的枚举int getIntHeader(String name):获取整型请求头值
获取请求参数
String getParameter(String name):获取单个参数值String[] getParameterValues(String name):获取多个同名参数值Map<String,String[]> getParameterMap():返回所有参数的键值对映射
处理字符编码
request.setCharacterEncoding("UTF-8"); // 必须在获取参数前调用
请求域操作
setAttribute(String name, Object obj):设置请求域属性Object getAttribute(String name):获取请求域属性removeAttribute(String name):移除请求域属性
HttpServletResponse 核心功能
HttpServletResponse 用于构建服务器响应,主要功能包括:
设置响应状态
setStatus(int sc):设置响应状态码sendError(int sc):发送错误状态码
设置响应头
setHeader(String name, String value):设置响应头setContentType(String type):设置内容类型setCharacterEncoding(String charset):设置字符编码
写入响应体
PrintWriter writer = response.getWriter();
writer.write("响应内容");
ServletOutputStream out = response.getOutputStream();
out.write(byteData);
处理重定向
response.sendRedirect("/newLocation");
解决响应乱码
response.setContentType("text/html;charset=UTF-8");
// 或
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "text/html;charset=UTF-8");
用户注册示例代码
注册页面 (register.html)
<form action="register" method="post">
用户名: <input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
性别:
<input type="radio" name="gender" value="male">男
<input type="radio" name="gender" value="female">女<br>
爱好:
<input type="checkbox" name="hobby" value="read">阅读
<input type="checkbox" name="hobby" value="sport">运动<br>
<button type="submit">注册</button>
</form>
Servlet处理类
@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置请求编码
request.setCharacterEncoding("UTF-8");
// 获取表单参数
String username = request.getParameter("username");
String password = request.getParameter("password");
String gender = request.getParameter("gender");
String[] hobbies = request.getParameterValues("hobby");
// 业务处理(模拟)
boolean success = registerUser(username, password, gender, hobbies);
// 设置响应
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
if(success) {
out.println("<h3>注册成功</h3>");
out.println("<p>用户名: " + username + "</p>");
out.println("<p>性别: " + gender + "</p>");
out.println("<p>爱好: " + String.join(",", hobbies) + "</p>");
} else {
out.println("<h3 style='color:red'>注册失败</h3>");
}
}
private boolean registerUser(String user, String pwd, String gender, String[] hobbies) {
// 实际开发中这里会调用Service层
return true; // 模拟成功
}
}
注意事项
- 获取请求参数前必须先设置字符编码
- 设置响应编码必须在获取Writer/OutputStream之前
- 二进制数据使用getOutputStream(),文本数据使用getWriter()
- 重定向是客户端行为,转发是服务器行为
- POST请求体参数通过setCharacterEncoding解决乱码
- GET请求参数乱码需配置Tomcat的URI编码### 请求转发 vs 响应重定向详解
核心概念与类比
请求转发是服务器内部资源跳转,客户端无感知。类比:张三向李四借钱,李四私下找王五解决,张三只接触李四。
响应重定向是服务器引导客户端发起新请求。类比:李四让张三直接找王五,张三需发起第二次请求。
请求转发核心实现
代码示例:
request.getRequestDispatcher("目标路径").forward(request, response);
特点:
- 服务器内部完成,客户端URL不变
- 仅1次请求,共享同一对Request/Response对象
- 可传递请求参数和请求域数据
- 能访问WEB-INF下受保护资源
- 不可跳转外部资源
响应重定向核心实现
代码示例:
response.sendRedirect("目标路径");
特点:
- 客户端发起新请求,URL变化
- 至少2次请求,生成新Request/Response对象
- 无法传递原请求参数和域数据
- 不能访问WEB-INF资源
- 可跳转外部网站
关键区别对比
| 维度 | 请求转发 | 响应重定向 |
|---|---|---|
| 发起方 | 服务器 | 客户端 |
| 请求次数 | 1次 | ≥2次 |
| URL显示 | 不变 | 变为目标地址 |
| 数据传递 | 支持 | 不支持 |
| WEB-INF访问 | 允许 | 禁止 |
| 外部资源跳转 | 不可 | 可以 |
开发选型原则
需要传递请求域数据时选择请求转发。
表单提交后防重复提交用重定向。
需跳转外部资源必须用重定向。
无数据传递的简单跳转可任选。
更多推荐



所有评论(0)