servlet转发·重定向·包含常见问题

来源:互联网 发布:严蔚敏 算法2.3 编辑:程序博客网 时间:2024/05/18 03:08

 1、字节输出流和字符输出流的共存问题---不能共存(跟get或post方式没关系)。即:在同一个servlet响应中,不能同时采两种输出流。
                   另外:如果要用字节流输出中文,用write(byte[])方法
 2、转发时,两个servlet都输出信息的问题
            out.print("晚上好....");//下面如果不执行flush或close,那么该句不会输出,因为到下一个servlet会把缓存清空
            out.flush();

       Tomcat对于同response,只输出一次(把缓存中的内容刷出去)。由源组件转发到目标组件时,容器会清空源组件输出的数据。响应头信息是不清空的,客户端地址栏URL不变。

        刷了(close也一样),流就关闭了,下面的转发就无法进行了,因为此时response已经提交了(整个转发链只会响应一次,即提交了)
         
 3、转发:传参,访问顺序(doGet还是doPost) ---转发是共享同一个request和同一个response对象的(整个转发链只会响应一次,即上一个servlet的缓存不会输出)
         1)第一个是doGet,第二个走的也是doGet
         2)第一个是doPost,第二个走的也是doPost
         3)传参:可以通过request.setAttribute()设置,通过request.getAttribute()获取 ---doGet或doPost都一样
      
 4、重定向:传参,访问顺序(doGet还是doPost)
         1)无论第一个是doGet还是doPost,第二个走的都是doGet
         2)传参:第二个servlet中的request和第一个是完全不同的对象,因此无法通过:request.setAttribute()和request.getAttribute() 实现传参。
         3)第二个servlet中是无法通过request.getParameter()的方式获取页面提交的参数数据(因为二个request和第一个servlet是完全不同的对象)
         4)重定向方式下,如果要进行传参,可采用:在地址栏的url后添加类似如下的格式传参:?name=Jack&age=23
                       注意,采用地址栏url传参的方式,在浏览器地址栏是能够看到的,因此要注意隐私(安全)问题---如果有隐私参数,那么要加密!!!
         5)转发只能在站内进行(路径默认在项目内,即路径不用带项目名),重定向可以在站外进行(如果是站外路径要带“http://”开头,站内路径要带项目名)。如果非要项目之间(站外)进行跳转,那么必须要选择重定向。
      
  5、请求包含:传参,访问顺序(doGet还是doPost)
         1)两个servlet的输出都有效!---中途调用flush,流不会关闭,后续的输出都会执行。如果在第一个servlet中执行了out.close(),那么后续的输出(无论是第一还是第二个servlet)都不会执行,但程序不会出异常!!!!
         2)第一个是doGet,第二个走的也是doGet
         3)第一个是doPost,第二个走的也是doPost


        RequestDispatcher rd = request.getRequestDispatcher("/servlet/Include2Servlet");
        rd.include(request, response);//它的机制可理解成函数调用。相当于把第二个servlet的doGet()方法中的代码拷到这里来运行。
        out.println("<br/>Include1111111..doGet...请求包含之后");        

       4)对于请求包含,第二个servlet在执行完之后,还会回到第一个servlet的rd.include()这行代码之后。
         5)传参方面,和转发是完全一样的,因为都是共享同一个request和同一个response.
         6)页面输出时,注意html标签不要输出冲突,如:在第一个servlet中输出了“<html><body>”和“</body></html>”,同时在第二个servlet中也输出这些标记。这样会出现html标记嵌套冲突!!
     ※重定向和转发:跳转之后不会回到原来的那个servlet中。
         而“请求转发”在跳转之后会回到原来servlet的“rd.include()”这句代码之后继续执行。

0 0
原创粉丝点击