RequestDispatcher分派请求

      
1 、RequestDispatcher说明

        分派请求RequestDispatcher,相对于重定向 sendReadirect()来说,它是不进行url改变的。如有a、b两个servlet,a的servlet使用了RequestDispatcher分派到b,对于用户来说地址输入栏还是a的地址,但是内部来说是a到b进行了一个分派的处理;
2、获得一个RequestDispatcher

     ServletContext。getRequestDispatcher
     ServletContext。getNamedDispatcher
     ServletContext。getRequestDispatcher是通过url形式获得,符合url匹配规则来找servlte,然后包装成RequestDispatcher返回。如果找不到对应的servlte,则会出现404.
     ServletContext。getNamedDispatcher是通过servlte的名字来查找的。

     为了方便相对于当前的servlte请求的url来获取一个servlte,ServletRequest 有一个getRequestDispatcher来获取,如当前请求url是/c2/index.html,ServletRequest.
getRequestDispatcher("header .html"),相当于ServletRequest.getRequestDispatcher("/c2/header .html")

3、参数

    ServletContext ServletRequest 的RequestDispatcher是可以附加参数的,如果和原来的相同参数将被替换。
    如:String str="/c2?p=1";
           RequestDispatcher rd = context.getRequestDispatcher(path);
          当进行分派的时候,p参数会传到下一个的Request

4、使用Include方法  

          include什么时候都可以调用,但是它有一定的限制,能访问所有的request的所有方法,但是对于response对象来说,不能设置所有响应头部信息的方法,无论是分派前后。只能调用写入数据流,如Writer或者flushBuffer
          如果servlet是通过RequestDispatcher得到的,那么它必然有如下几个属性,通过request对象的getAttribute 获取,这些属性是分派到的servlet的对应值。
如果之后自己设置了这些属性,那么会被替换掉。但是如果getNamedDispatcher获得的servlet则没有这些信息。
             javax.servlet.include.request_uri  被包含 servlet的请求 RUI
             javax.servlet.include.context_path   上下文路径
             javax.servlet.include.servlet_path    servlet路径
             javax.servlet.include.path_info       路径信息
             javax.servlet.include.query_string   查询字符串

5、使用Forward 
方法
    
         调用forward方法,有限制。
                1、必须是响应内容为空的时候调用,如果分派前的response有响应已经提交部署将会报错 , 未提交的将会被忽略。
                2、设置响应头有效
                3、如果是RequestDispatcher获得servlet,分派到的servlet会有如下属性,通过request的getAttribute获得,和include不同的是,这是永远是分派前的servlet的信息,即便后面再次分派和使用includes

                javax.servlet.forward.request_uri     HttpServletRequestgetRequestURI

                javax.servlet.forward.context_path   getContextPath

                javax.servlet.forward.servlet_path    getServletPath

                javax.servlet.forward.path_info        getPathInfo

                javax.servlet.forward.query_string    getQueryString

6、跨应用访问

       req.getServletContext().getContext("/web5").getRequestDispatcher("/rdd");

        


     
   
           


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值