9.17JavaWeb之Servlet请求转发

9.17JavaWeb之Servlet请求转发

为什么需要Servlet请求转发

原因:

  • Web 应用在处理客户端的请求时,经常需要多个 Web 资源共同协作才能生成响应结果。

  • Serlvet 对象无法直接调用其他 Servlet 的 service() 方法

解决办法:

  • 请求转发

  • 请求包含(了解即可)

请求转发

什么是请求转发?

  • 容器接收请求后,Servlet 会先对请求做一些预处理,然后将请求传递给其他 Web 资源,来完成包括生成响应在内的后续工作

  • 属于服务器行为

RequestDispatcher 接口

特点:

  • RequestDispatcher 对象由 Servlet 容器创建

作用:

  • 装由路径所标识的 Web 资源

  • 把请求转发给其他的 Web 资源

请求转发的工作原理:

 

由工作原理图可知请求转发的关键点:

  • 获取RequestDispatcher对象

  • 调用RequestDispatcher对象当中的方法

Servlet获取RequestDispatcher对象的方式
  1. getRequestDispatcher(String path) 方法,参数 path 指定目标资源的路径,必须为绝对路径;--->绝对路径是指以符号“/”开头的路径,“/”表示当前 Web 应用的根目录。相对路径是指相对当前 Web 资源的路径,不以符号“/”开头。

  2. getRequestDispatcher(String path) 方法,参数 path 指定目标资源的路径,可以为绝对路径,也可以为相对路径。

RequestDispatcher接口提供的方法:

返回值类型方法功能描述
void forward(ServletRequest request,ServletResponse response) 用于将请求转发给另一个 Web 资源。该方法必须在响应提交给客户端之前被调用,否则将抛出 IllegalStateException 异常
void include(ServletRequest request,ServletResponse response) 用于将其他的资源作为当前响应内容包含进来

request域对象

什么是request域对象?

request 是 Servlet 的三大域对象之一,它需要与请求转发配合使用,才可以实现动态资源间的数据传递

Context域对象和Request域对象的区别:

  • 从单词就可以看出Request域对象是Context域对象的子集。

具体的不同点:

  1. 生命周期不同

  2. 作用域不同

  3. Web应用中数量不同

  4. 实现数据共享的方式不同

    1. Context 域对象可以独立完成动态资源之间的数据共享;

    2. Request 域对象需要与请求转发配合使用才能实现动态资源之间的数据共享。

示例代码:

需求:

  • 创建一个Serlvet类,在该类内部转发请求给第二个Serlet类

  • 创建一个表单,模拟登录

第一个Servlet类:

package com.example.HttpServletRequestDemo;

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;

/**
* 这是直接与表单交互的Servlet动态资源类,表单的数据直接提交到该类当中
* @since JDK 1.8
* @date 2021/09/17
* @author Lucifer
*/
@WebServlet(name = "DispatcherServlet", value = "/DispatcherServlet")
public class DispatcherServlet extends HttpServlet {
   //定义UID
   private static final long serialVersionUID = 1L;

   //Get
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
       //设置响应字符集
       resp.setContentType("text/html;charset=UTF-8");
       //向页面输出
       PrintWriter writer = resp.getWriter();
       //尝试在请求转发前向response缓冲区写入内容,最后在页面查看是否展示
       writer.write("<h1>这是转发前在响应信息内的内容!</h1>");
       //向request请求域中添加属性,传递给下一个Web资源
       req.setAttribute("webName", "JunkingBoy");
       req.setAttribute("url", "www.Jun.com");
       req.setAttribute("welcome", "欢迎欢迎,热烈欢迎!");
       //转发请求域对象
       req.getRequestDispatcher("/DoServlet").forward(req, resp);
  }

   //Post
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
       doGet(req, resp);
  }
}

接收转发请求的Servlet类:

package com.example.HttpServletRequestDemo;

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;
import java.util.Arrays;

/**
* 接收上一个Servlet类转发的请求的接受类
* @since JDK 1.8
* @date 2021/09/17
* @author Lucifer
*/
@WebServlet(name = "DoServlet", value = "/DoServlet")
public class DoServlet extends HttpServlet {
   //定义UID
   private static final long serialVersionUID = 1L;

   //Get
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
       //设置响应字符集
       resp.setContentType("text/html;charset=UTF-8");
       //输出内容
       PrintWriter writer = resp.getWriter();
       //接收转发请求当中的属性
       String webName = (String) req.getAttribute("webName");
       String url = (String) req.getAttribute("url");
       String welcome = (String) req.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 = req.getParameter("username");
       // 获取密码
       String password = req.getParameter("password");
       // 获取性别
       String sex = req.getParameter("sex");
       // 获取城市
       String city = req.getParameter("city");
       // 获取使用语言返回是String数组
       String[] languages = req.getParameterValues("language");
       writer.write(
       "用户名:" + username + "<br/>"
           + "密码:" + password + "<br/>"
           + "性别:" + sex + "<br/>"
           + "城市:" + city + "<br/>"
           + "使用过的语言:" + Arrays.toString(languages) + "<br/>"
      );
  }

   //Post
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
       doGet(req, resp);
  }
}

登录表单:

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Login</title>
</head>
<body>
 <form action="/HttpServletRequestDemo_war_exploded/DispatcherServlet" method="get">
     <table border="1" width="80%">
         <tr>
             <td colspan="2" align="center">JunkingBOy</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="Go" />Go
             </td>
         </tr>
         <tr>
             <td>
                 <select name="city">
                     <option value="none">---请选择---</option>
                     <option value="柳州">柳州</option>
                     <option value="南宁">南宁</option>
                     <option value="桂林">桂林</option>
                 </select>
             </td>
         </tr>
         <tr>
             <td colspan="2" align="center">
                 <input type="submit" value="提交" />
             </td>
         </tr>
     </table>
 </form>
</body>
</html>

 

It's a lonely road!!!
原文地址:https://www.cnblogs.com/JunkingBoy/p/15308481.html