赞
踩
目录
Web 应用在处理客户端的请求时,经常需要多个 Web 资源共同协作才能生成响应结果。但由于 Serlvet 对象无法直接调用其他 Servlet 的 service() 方法,所以 Servlet 规范提供了 2 种解决方案:
下面我们主要对请求转发进行介绍。
请求转发属于服务器行为。容器接收请求后,Servlet 会先对请求做一些预处理,然后将请求传递给其他 Web 资源,来完成包括生成响应在内的后续工作。
javax.servlet 包中定义了一个 RequestDispatcher 接口,RequestDispatcher 对象由 Servlet 容器创建,用于封装由路径所标识的 Web 资源。利用 RequestDispatcher 对象可以把请求转发给其他的 Web 资源。
Servlet 可以通过 2 种方式获得 RequestDispatcher 对象:
绝对路径是指以符号“/”开头的路径,“/”表示当前 Web 应用的根目录。相对路径是指相对当前 Web 资源的路径,不以符号“/”开头。
RequestDispatcher 接口中提供了以下方法。
返回值类型 | 方法 | 功能描述 |
---|---|---|
void | forward(ServletRequest request,ServletResponse response) | 用于将请求转发给另一个 Web 资源。该方法必须在响应提交给客户端之前被调用,否则将抛出 IllegalStateException 异常 |
void | include(ServletRequest request,ServletResponse response) | 用于将其他的资源作为当前响应内容包含进来 |
在 Servlet 中,通常使用 forward() 方法将当前请求转发给其他的 Web 资源进行处理。请求转发的工作原理如下图所示。
请求转发具有以下特点:
request 是 Servlet 的三大域对象(HttpServletRequest、HttpSession、ServletContext)之一,它需要与请求转发配合使用,才可以实现动态资源间的数据传递。
在 ServletRequest 接口中定义了一系列操作属性的方法,如下表。
返回值类型 | 方法 | 描述 |
---|---|---|
void | setAttribute(String name, Object o) | 将 Java 对象与属性名绑定,并将它作为一个属性存放到 request 对象中。参数 name 为属性名,参数 object 为属性值。 |
Object | getAttribute(String name) | 根据属性名 name,返回 request 中对应的属性值。 |
void | removeAttribute(String name) | 用于移除 request 对象中指定的属性。 |
Enumeration | getAttributeNames() | 用于返回 request 对象中的所有属性名的枚举集合。 |
Context 域对象和 request 域对象对比,具有以下 4 点差异:
1) 生命周期不同
2) 作用域不同
3) Web 应用中数量不同
4) 实现数据共享的方式不同
下面我们通过一个案例加深大家对转发和 request 域对象的理解。创建一个名为 DispatcherServlet 的类,代码如下。
- @WebServlet("/DispatcherServlet")
- public class DispatcherServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
-
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- // 设置向页面输出内容格式
- response.setContentType("text/html;charset=UTF-8");
- PrintWriter writer = response.getWriter();
- // 尝试在请求转发前向response缓冲区写入内容,最后在页面查看是否展示
- writer.write("<h1>这是转发前在响应信息内的内容!</h1>");
- // 向reuqest域对象中添加属性,传递给下一个web资源
- request.setAttribute("webName", "CSDN博客");
- request.setAttribute("url", "www.csdn.net");
- request.setAttribute("welcome", "welcome to DispatcherServlet");
- // 转发
- request.getRequestDispatcher("/DoServlet").forward(request, response);
- }
-
- protected void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
然后,再创建一个名称为 DoServlet 的类,代码如下。
- @WebServlet("/DoServlet")
- public class DoServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
-
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws IOException {
- //修改request缓冲区的字符集为UTF-8
- request.setCharacterEncoding("utf-8");
- // 设置向页面输出内容格式
- response.setContentType("text/html;charset=UTF-8");
- PrintWriter writer = response.getWriter();
- String webName = (String) request.getAttribute("webName");
- String url = (String) request.getAttribute("url");
- String welcome = (String) request.getAttribute("welcome");
- if (webName != null) {
- writer.write("<h3>" + webName + "</h3>");
- }
- if (url != null) {
- writer.write("<h3>" + url + "</h3>");
- }
- if (welcome != null) {
- writer.write("<h3>" + welcome + "</h3>");
- }
- String username = request.getParameter("username");
- // 获取密码
- String password = request.getParameter("password");
- // 获取性别
- String sex = request.getParameter("sex");
- // 获取城市
- String city = request.getParameter("city");
- // 获取使用语言返回是String数组
- String[] languages = request.getParameterValues("language");
- writer.write("用户名:" + username + "<br/>" + "密码:" + password + "<br/>" + "性别:" + sex + "<br/>" + "城市:" + city
- + "<br/>" + "使用过的语言:" + Arrays.toString(languages) + "<br/>"
- );
- }
-
- protected void doPost(HttpServletRequest request, HttpServletResponse response)
- throws IOException {
- doGet(request, response);
- }
- }
在 webapp 根目录下,创建 web_form.html,代码如下。
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- <form action="/web/DispatcherServlet" method="post">
- <table border="1" width="50%">
- <tr>
- <td colspan="2" align="center">welcome to RequestForm!</td>
- </tr>
- <tr>
- <td>输入姓名</td>
- <td><input type="text" name="username" /></td>
- </tr>
- <tr>
- <td>输入密码</td>
- <td><input type="password" name="password" /></td>
- </tr>
- <tr>
- <td>选择性别</td>
- <td><input type="radio" name="sex" value="male" />男 <input
- type="radio" name="sex" value="female" />女</td>
- </tr>
- <tr>
- <td>选择使用的语言</td>
- <td><input type="checkbox" name="language" value="JAVA" />JAVA
- <input type="checkbox" name="language" value="C" />C语言 <input
- type="checkbox" name="language" value="PHP" />PHP <input
- type="checkbox" name="language" value="Python" />Python</td>
- </tr>
- <tr>
- <td>选择城市</td>
- <td><select name="city">
- <option value="none">--请选择--</option>
- <option value="beijing">北京</option>
- <option value="shanghai">上海</option>
- <option value="guangzhou">广州</option>
- </select></td>
- </tr>
- <tr>
- <td colspan="2"><input type="submit" value="提交" /></td>
- </tr>
- </table>
- </form>
- </body>
- </html>
启动 Tomcat 服务器,在地址栏输入“http://localhost:8080/web/web_form.html”,访问 web_form.html,结果如下图。
填写表单信息,点击提交,结果如下图。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。