当前位置:   article > 正文

RequestDispatcher的forward和include_requestdispatcher中的forward和include方法

requestdispatcher中的forward和include方法

RequestDispatcher

1.RequestDispatcher是请求的派发者。它有两个动作:include和forward。

2.主要作用:让其它的资源参与进来,协同完成响应。

3.特点:浏览器上的url不会因为使用了forward或者include而改变,因此forward和include的调用对于用户来说是透明的。

1.RequestDispatcher.forward(request,response)

这个方法将请求从一个servlet或jsp目标资源转发到另一个资源,由该资源来产生响应数据。这个方法允许目标资源在做一些准备工作之后,

再将请求转发给另一资源。需要注意的是,在forward的前后,都不应出现响应输出的语句。

//1.jsp
<form action="userServlet" method="get">
        用户名:<input type="text" name="username"/><br/>
        密码:<input type="password" name="password"/><br/>
        <input type="submit" value="登录"/>
</form>
//userServlet
 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理乱码,设置请求编码
        req.setCharacterEncoding("UTF-8");
        //打印请求url
        System.out.println(req.getRequestURL());//http://localhost:8081/JavaWeb01/userServlet
        //转发
        req.getRequestDispatcher("2.jsp").forward(req, resp);
 } 
//2.jsp
<%=request.getRequestURL()%>  //http://localhost:8081/JavaWeb01/2.jsp 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

从上面的示例可以看出:虽然浏览器上的url地址不会改变,但是请求url是不同的,也就说有两个不同的request对象,那么为什么我们可以从后者取到

前者的数据呢(getParameter)?呃,我也不晓得,估计是中间做了啥交接工作吧,希望有大神可以教教小弟!阿里嘎头扣杀伊马斯!不过想想其实也容易理解,就类似于我们将qq聊天的内容转发给其它的好友一样,转发的和被转发的内容是一样的对吧,但是这又的的确确是两条聊天记录!

2.RequestDispatcher.include(request,response)

此方法用于包含响应中的某一个资源的内容,什么意思呢?就是说,我们把请求发送给目标资源,目标资源中使用include包含另一个资源,这个

被包含的资源会对请求产生响应数据,这份响应数据会被包含在目标资源的响应数据之中。需要注意的是:

被包含的资源不能设置ServletResponse的响应状态和响应头,因为这些事是包含者(目标资源)做的事,它只需要提供响应数据就行了。

//1.jsp
<form action="userServlet" method="get">
        用户名:<input type="text" name="username"/><br/>
        密码:<input type="password" name="password"/><br/>
        <input type="submit" value="登录"/>
</form>
//userServlet
 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理乱码,设置请求编码
        req.setCharacterEncoding("UTF-8");
        //打印请求url
        System.out.println(req.getRequestURL());//http://localhost:8081/JavaWeb01/userServlet
        //转发
        req.getRequestDispatcher("2.jsp").forward(req, resp);
 } 
//2.jsp
<%=request.getRequestURL()%>  //http://localhost:8081/JavaWeb01/userServlet 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

这个示例可以发现:两个请求url是一样的,也就是只有一个request对象。

3.异同

相同点:二者都不会使浏览器的url地址发生变化。

不同点:forward过程中会出现两个不同的request对象(不同的请求url),并且由转发的资源进行响应;

而include过程中只出现了一个request对象(相同的请求url),并且转发的资源的响应数据会被包含在目标资源的响应中,

也就是由目标资源进行响应而不是转发资源。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/431237
推荐阅读
相关标签
  

闽ICP备14008679号