博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java RequestDispatcher 详解
阅读量:6707 次
发布时间:2019-06-25

本文共 2525 字,大约阅读时间需要 8 分钟。

RequestDispatcher 让两个servlet相互通信成为可能,就像是浏览器发送request请求一样。所以我们可以从HttpRequest中获取到RequestDispatcher对象

protected void doPost(HttpServletRequest request, HttpServletResponse response)        throws ServletException, IOException {  RequestDispatcher dispatcher=request.getRequestDispatcher("/servlet2");}复制代码

通过上面的代码,我们能获取到一个映射到/servlet2(URI) 的Servlet的 RequestDispatcher。

然后可以使用include()或者forward()方法来调用RequestDispatcher

dispatcher.forward(request, response);dispatcher.include(request, response);复制代码

###request.getRequestDispatcher和response.sendRedirct区别

  • getRequestDispatcher是服务器内部跳转,地址栏信息不变,只能跳转到web应用内的网页。
  • sendRedirect是页面重定向,地址栏信息改变,可以跳转到任意网页。 ######getRequestDispatcher实例:
request.setAttribute("lover", "fantj");     request.getSession().setAttribute("lovered", "fantj");       request.getRequestDispatcher("/third?name=fantj").forward(request, response);     或     request.getRequestDispatcher("third?name=fantj").forward(request, response);     或     this.getServletContext().getRequestDispatcher("/third?name=fantj").forward(request, response);  复制代码
//ThirdServlet     PrintWriter out = response.getWriter();     String name = request.getParameter("name");     out.println(request.getContextPath()+"

"); out.println("name="+name+"

"); out.println("lover="+request.getAttribute("lover")+"

"); out.println("lovered="+request.getSession().getAttribute("lovered")+"

"); 复制代码

结果显示,地址栏信息仍为http://localhost:8080/Test/second(不变),这三种方式都可以传值到第二个Servlet。

#####sendRedirct实例

//SecondServlet   request.setAttribute("lover", "fantj");     request.getSession().setAttribute("lovered", "fantj");       response.sendRedirect("third?name=fantj");     或     response.sendRedirect(request.getContextPath()+"/third?name=fantj");  复制代码
//ThirdServlet     PrintWriter out = response.getWriter();     String name = request.getParameter("name");     out.println(request.getContextPath()+"

"); out.println("name="+name+"

"); out.println("lover="+request.getAttribute("lover")+"

"); out.println("lovered="+request.getSession().getAttribute("lovered")+"

"); 复制代码

结果显示,地址栏信息变为http://localhost:8080/Test/third?name=fantj(发生改变),只有request.getAttribute("lover")获取不到值,session范围及url路径后的传值在第二个Servlet都可以获取到值。

######总结 其实我们好好想想,他们需要建立的对象不同,一个是request一个是response。

request处理可以想象成帮用户再补充一些请求(根据自己项目的业务逻辑),所以它应该要获取到所有request发送过来的数据,并且让用户感觉不到我们有帮他处理一些事情(因为地址栏信息不变)。

response可以说是响应给用户一个新的东西,它不会在意request给它发送了什么参数,除非request把数据写在同一个容器下的session中或者url中。这也是response.sendRedirct可以给用户返回容器以外的URL(比如www.baidu.com)的原因。

转载地址:http://bcdlo.baihongyu.com/

你可能感兴趣的文章
算法的时间复杂度
查看>>
iOS独立开发者使用Bmob第三方后台服务初探
查看>>
共享适合移动端的“拾色器”插件
查看>>
《Java编程思想》笔记09------异常处理
查看>>
CPU发生异常到生成Crash Log的过程
查看>>
pyqt5中动画的使用
查看>>
[译]用 Java 创造你的第一个区块链之第二部分 —— 交易
查看>>
vuex 源码:如何实现一个简单的 vuex
查看>>
Thymeleaf的基本语法
查看>>
theos的Tweak创建的dylib怎么安装到非越狱机上详解
查看>>
Picasso-源码解析(三)
查看>>
深入理解 RxJava2:揭秘 subscribeOn(3)
查看>>
到底什么才是业务架构?
查看>>
基础设施即代码:Terraform和AWS无服务器
查看>>
Atlassian发布事故管理解决方案Jira Ops
查看>>
书评 —— 《Go语言编程》
查看>>
Apache HBase的现状和发展
查看>>
反模式的经典 - Mockito设计解析
查看>>
Zip Slip目录遍历漏洞已影响多个Java项目
查看>>
独家揭秘:微博深度学习平台如何支撑4亿用户愉快吃瓜?
查看>>