请求转发

解释

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

别的资源是指: 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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部