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 

从上面的示例可以看出:虽然浏览器上的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 

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

3.异同

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

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

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值