java dispatcher详解_Servlet关于RequestDispatcher的原理详解

RequestDispatcher简介

RequestDispatcher 代表请求的派发者。它有2个动作:forward 和 include 。客户端对于任何一个请求,可以根据业务逻辑需要,选择不同的处理办法:

1、请求的是谁,谁就自己处理并响应,例如请求的是一个html,则web浏览器显示的就是这个HTML的内容。

2、使用RequestDispatcher让其它的资源参与进来,协同完成的响应,这就是RequestDispatcher的主要作用。

RequestDispatcher 有一个特点,就是浏览器上显示的URL是最先请求的目标资源的URL,不会因为使用了forward、include方法而改变。因此forward和include的调用对于用户来说是透明的。

RequestDispatcher 实质是一个接口,有2个方法分别代表这2个动作。下面一 一介绍。

public interface RequestDispatcher

{

public void forward(ServletRequest request, ServletResponse response)

throws ServletException, IOException;

public void include(ServletRequest request, ServletResponse response)

throws ServletException, IOException;

}

RequestDispatcher.forward(request, response)

这个方法将请求从一个 Servlet or JSP目标资源 上 转发到服务器上的另一个资源(servlet、JSP 文件或 HTML 文件,这些资源必须是当前Web上下文中的),让其它的资源去生成响应数据。

例如用户请求的是目标资源A,A接受到请求后,转发到B,真正产生响应数据是被转发的资源B,而A只是起个引导转发作用。浏览器的地址栏不会变,依然是A的URL。

这个方法可以允许被请求的目标资源做一些准备工作后,再让转发的资源去响应请求。例如下面的例子1。

注意事项:

1、在目标资源中调用forward方法时,必须保证此响应没有提交。也就是不要使用 ServletResponse 对象的输出流对象,因为即便你写入了数据到响应缓冲区,最后也会被清空,如果缓冲区数据被刷新提交(out.flush),还会抛出IllegalStateException异常。

2、对于forward方法传递的request对象:虽然我们从调用上看,好像是将request对象传递给转动的资源上去了,但是我发现目标资源使用的request对象和转发的资源使用的request对象不是同一个request对象,因为分别从这2个request中获取RequestURL,发现是不一样的。但是在目标资源request提取的Paramter 和 Attribute   ,在转发后的资源的request对象中,依然都可以提取到,且是相同的。所以,二者只是在请求路径相关的属性上不同,其它API调用返回的都是一样的。

3、在forward语句的前后,都不应该有响应输出的语句,应该会被忽略。

例子1:一个简单的 MVC演示。Servlet充当控制器,转发到view层的jsp。

User.java

public class User{

private String name;

private int age;

public String getName(){

return name ;

}

public void setName( String name ){

this .name = name ;

}

public int getAge() {

return age ;

}

public void setAge( int age ){

this .age = age ;

}

}

UsersServlet.java

public class UsersServlet extends HttpServlet {

private static final long serialVersionUID = 1L ;

protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException , IOException {

/*****************一般实际开发这些用户数据都是从数据库查出来的*********/

List users = new ArrayList <> ();

User u1 = new User () ;

u1 .setAge ( 20) ;

u1 .setName ( "Bob") ;

User u2 = new User () ;

u2 .setAge ( 21) ;

u2 .setName ( "Tony") ;

users .add ( u1) ;

users .add ( u2) ;

/*********************************************/

request .setAttribute ( "users", users) ; //对request 进制预处理准备工作

request .getRequestDispatcher ( "users.jsp").forward( request , response );//转发到users.jsp,让他去具体响应

}

}

users.jsp

session ="true" %>

< html>

用户列表

-----------------转发到的资源users.jsp产生的响应数据------------------

< c:forEach var ="user" items= " ${users}" >

用户姓名:${user.name} 用户年龄:${user.age}

c:forEach>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值