什么是请求转发?

请求转发

解释

请求转发,将前端发送的请求转发到别的资源

别的资源是指: servlet,页面

即: 请求转发,可以将请求转发值另外一个servlet;也可以是将请求转发至页面

1、 请求转发演示

1.1 请求转发跳转页面

image-20240627093904931

实战: 之前注册练习,修改: 实现注册完跳转到登录页面

image-20240627094340991

1.2 请求转发跳转servlet

前端发请求/forward , Demo1Servlet接收到后,又将请求转发到/forward2 所对应的Demo2Servlet中

image-20240627095145075

image-20240627095155760

实战: 修改之前的代码 ,要求完成 登录成功后,查询全部,在页面展示全部用户信息

思考: 将来完善项目,设置了添加功能,更新功能,删除功能,这些功能做完后都需要重新再查一遍全部数据 ; 但是现在查询全部的代码在LoginServlet, 那么更新/删除/添加后想要查询全部就得重写一遍,太麻烦

解决: 将查询全部这个功能,单独抽成一个sevlet,叫ListServlet,这个servlet只做查询全部,以后哪个功能需要查询全部,发请求找他(ListServlet)即可 ---> 请求转发

ListServlet.java

@WebServlet("/list")
public class ListServlet extends HttpServlet {
​
    private UserService userService = new UserServiceImpl();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 0 设置编码格式
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
​
        List<User> all = userService.findAll( );
        // 3做出响应
        PrintWriter writer = resp.getWriter( );
        writer.write("<html>");
        writer.write("<head>");
        writer.write("<title>首页</title>");
        writer.write("</head>");
        writer.write("<body>");
        writer.write("<table border='2'>");
        writer.write("<thead>");
        writer.write("<td>编号</td>");
        writer.write("<td>用户名</td>");
        writer.write("<td>密码</td>");
        writer.write("<td>手机号</td>");
        writer.write("<td>注册时间</td>");
        writer.write("<td>余额</td>");
        writer.write("<td>性别</td>");
        writer.write("</thead>");
        for (User user : all) {
            writer.write("<tr>");
            writer.write("<td>"+user.getId()+"</td>");
            writer.write("<td>"+user.getUsername()+"</td>");
            writer.write("<td>"+user.getPassword()+"</td>");
            writer.write("<td>"+user.getPhone()+"</td>");
            writer.write("<td>"+user.getCreateTime()+"</td>");
            writer.write("<td>"+user.getMoney()+"</td>");
            writer.write("<td>"+(user.getSex() == 1 ? "男":"女")+"</td>");
            writer.write("</tr>");
        }
        writer.write("</table>");
        writer.write("</body>");
        writer.write("</html>");
    }
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

登录成功后,请求转发到ListServlet让其查询全部

image-20240627101656865

2、 请求域(存取数据)

  • 是什么?域,就是区域,就是一个容器,存储数据,其实理解为map集合

  • 什么时候用? 在两个servlet请求转发时,会存在A类(LoginServlet)的数据需要传递给B类(ListServlet)此时就需要使用请求对象的请求域功能

  • 怎么用? req.setAttribute(key,value),这样就可以将数据存储在请求对象

    再另外一个servlet使用请求对象取出值req.getAttribute("key")

  • 请求域中的数据: 只在一次请求中有效!!!

在一个servlet中存入请求域

image-20240627105309249

在另外一个servlet中取出

image-20240627105327857

实战: 修改之前练习,将LoginServlet中,登录成功后,将登录的用户对象User存入请求域,请求转发后,ListServlet中取出,这样的话就可以再ListServlet中使用用户对象

image-20240627110013938

image-20240627110035665

3、 总结

请求转发其实两个功能

  • 利用请求对象可以发请求跳转页面或者servlet

    • req.getRequestDispatcher("路径").forward(req,resp);

  • 利用请求对象存取数据

    • req.setAttribute(key,value)

    • req.getAttribute(key)

特点

  • 请求转发: 地址栏不变,这是一次浏览器请求

  • 请求转发: 是服务器内部行为

  • 当做域对象使用,即相当于容器,可以存取数据

  • 两个servlet中请求域数据在一次请求转发中==共享==

image-20231121112508700

### 回答1: 实现请求转发可以使用中间件或者路由器。中间件可以在请求到达目标处理程序之前对请求进行处理,而路由器可以将请求转发到不同的处理程序。在请求对象中共享数据可以使用中间件或者全局变量。中间件可以将数据添加到请求对象中,而全局变量可以在整个应用程序中共享数据。 ### 回答2: 请求转发是指将请求从一个Servlet转发给另一个Servlet进行处理。实现请求转发可以通过以下步骤: 1. 在第一个Servlet中,通过获取请求转发的目标路径,并创建一个RequestDispatcher对象: ``` String targetPath = "/目标Servlet路径"; // 目标Servlet的URL路径 RequestDispatcher dispatcher = request.getRequestDispatcher(targetPath); ``` 2. 调用RequestDispatcher对象的forward方法,将请求和响应传递给目标Servlet: ``` dispatcher.forward(request, response); ``` 3. 目标Servlet接收到请求后进行处理,并将处理结果发送回客户端。 在请求对象中共享数据可以通过以下方式: 1. 使用request.setAttribute方法存储数据: ``` String data = "要共享的数据"; request.setAttribute("key", data); ``` 2. 在目标Servlet中,可以通过request.getAttribute方法获取之前存储的数据: ``` String data = (String) request.getAttribute("key"); ``` 3. 可以在转发之前或转发过程中,将数据传递给目标Servlet: ``` request.setAttribute("key", data); dispatcher.forward(request, response); ``` 4. 在目标Servlet中,可以通过request.getAttribute方法获取之前存储的数据: ``` String data = (String) request.getAttribute("key"); ``` 需要注意的是,请求转发时,共享的数据只在转发的过程中有效,一旦请求转发完成,数据将无法再次使用。如果需要在多个Servlet之间共享数据,可以考虑使用会话(Session)对象或其他适当的机制。 ### 回答3: 请求转发是指将请求从一个Servlet转发给另一个Servlet,以实现不同Servlet之间的协作处理。 要实现请求转发,首先需要使用RequestDispatcher对象,它可以通过HttpServletRequest对象的getRequestDispatcher()方法获取。然后,调用RequestDispatcher对象的forward()方法,将请求转发到指定的Servlet或JSP页面。例如: ```java RequestDispatcher dispatcher = request.getRequestDispatcher("/servletName"); dispatcher.forward(request, response); ``` 其中,"/servletName"是需要转发的Servlet或JSP页面的相对路径。注意,可以在转发的路径中使用绝对路径或相对路径,以根据实际情况选择。 在请求转发过程中,请求对象HttpServletRequest和响应对象HttpServletResponse是共享的,可以在转发的Servlet或JSP页面中继续使用。可以通过请求对象HttpServletRequest的setAttribute()方法,将需要共享的数据存储在请求对象中,然后在转发的Servlet或JSP页面中通过请求对象的getAttribute()方法获取这些数据。例如: ```java request.setAttribute("dataName", dataValue); ``` 其中,"dataName"是数据名,dataValue是数据值。需要注意的是,数据值可以是任何类型的Java对象。 在转发的Servlet或JSP页面中,可以通过以下方式获取共享的数据: ```java dataType dataName = (dataType) request.getAttribute("dataName"); ``` 其中,dataType是数据类型,dataName是数据名。 通过存储在请求对象中的数据,不同的Servlet或JSP页面可以实现共享数据的交互和共同处理,从而实现请求转发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值