zoukankan      html  css  js  c++  java
  • 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!!!
  • 相关阅读:
    Alpha 冲刺 (7/10)
    Alpha 冲刺 (6/10)
    Alpha 冲刺 (5/10)
    Alpha 冲刺 (4/10)
    福大软工 · BETA 版冲刺前准备(团队)
    福大软工 · 第十一次作业
    Alpha 冲刺 (10/10)
    Alpha 冲刺 (9/10)
    Alpha 冲刺 (8/10)
    Alpha 冲刺 (7/10)
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15308481.html
Copyright © 2011-2022 走看看