请求转发
解释
请求转发,将前端发送的请求转发到别的资源
别的资源是指: servlet,页面
即: 请求转发,可以将请求转发值另外一个servlet;也可以是将请求转发至页面
1、 请求转发演示
1.1 请求转发跳转页面
实战: 之前注册练习,修改: 实现注册完跳转到登录页面
1.2 请求转发跳转servlet
前端发请求/forward , Demo1Servlet接收到后,又将请求转发到/forward2 所对应的Demo2Servlet中
实战: 修改之前的代码 ,要求完成 登录成功后,查询全部,在页面展示全部用户信息
思考: 将来完善项目,设置了添加功能,更新功能,删除功能,这些功能做完后都需要重新再查一遍全部数据 ; 但是现在查询全部的代码在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让其查询全部
2、 请求域(存取数据)
-
是什么?域,就是区域,就是一个容器,存储数据,其实理解为map集合
-
什么时候用? 在两个servlet请求转发时,会存在A类(LoginServlet)的数据需要传递给B类(ListServlet)此时就需要使用请求对象的请求域功能
-
怎么用? req.setAttribute(key,value),这样就可以将数据存储在请求对象
再另外一个servlet使用请求对象取出值req.getAttribute("key")
-
请求域中的数据: 只在一次请求中有效!!!
在一个servlet中存入请求域
在另外一个servlet中取出
实战: 修改之前练习,将LoginServlet中,登录成功后,将登录的用户对象User存入请求域,请求转发后,ListServlet中取出,这样的话就可以再ListServlet中使用用户对象
3、 总结
请求转发其实两个功能
利用请求对象可以发请求
跳转
页面或者servlet
req.getRequestDispatcher("路径").forward(req,resp);
利用请求对象
存取
数据
req.setAttribute(key,value)
req.getAttribute(key)
特点
-
请求转发: 地址栏不变,这是
一次
浏览器请求 -
请求转发: 是服务器内部行为
-
当做域对象使用,即相当于容器,可以存取数据
-
两个servlet中请求域数据在一次请求转发中==共享==
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 什么是请求转发?
发表评论 取消回复