本文探索利用HttpRequestServlet从浏览器获取用户输入的参数,并进行请求转发的过程。
例如,我们在首页要求用户输入用户名、密码和其兴趣爱好,然后点击提交到 /login,后台程序将请求转发到 /success。
首页index.jsp如下:
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<html>
<body>
<h1>登录</h1>
<form action="${pageContext.request.contextPath}/login" method="post">
用户名:<input type="text" name="username"> <br>
密码:<input type="password" name="password"> <br>
爱好:<input type="checkbox" name="hobbies" value="唱歌"> 唱歌
<input type="checkbox" name="hobbies" value="读书"> 读书
<input type="checkbox" name="hobbies" value="电影"> 电影
<input type="checkbox" name="hobbies" value="画画"> 画画
<input type="checkbox" name="hobbies" value="舞蹈"> 舞蹈 <br>
<input type="submit">
</form>
</body>
</html>
LoginServlet类对应 /login,代码如下:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置请求和响应的编码格式
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
// 获取单值参数的赋值
String username = req.getParameter("username");
String password = req.getParameter("password");
// 获取多值参数的赋值
String[] hobbies = req.getParameterValues("hobbies");
System.out.println("Username: " + username);
System.out.println("Password: " + password);
System.out.println("Hobbies: " + Arrays.toString(hobbies));
// 消息转发至 /success 进行处理
req.getRequestDispatcher("/success").forward(req, resp);
}
}
SuccessServlet类对应 /success,代码如下:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SuccessServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
resp.getWriter().println("<h1>Success</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
在LoginServlet类中需要特别注意的有两点:
1. 从HttpServletRequest中获取参数时主要有两种方式:
- 若参数值仅为1个,如username和password,则使用req.getParameter(),其返回值为String
- 若参数值为多个,如hobbies,则使用req.getParameterValues(),其返回值为String[]
2. 利用HttpServletRequest进行请求转发的写法为:
req.getRequestDispatcher("要转发到的路径").forward(req, resp);
上面程序的运行结果如下:
注意到,用户点击提交后,页面URL显示的是/login,而非/success。这是请求转发和重定向的最明显区别。