Servlet页面跳转技术--重定向、转发和包含

**

Servlet页面跳转技术(Java)

重定向RequestDispatcher和转发httpServletResponse.sendRedirect是javaEE中很常见的页面跳转技术,当我们在处理一个程序需要在后台跳转页面的时候。我们就要用到页面跳转技术。
两种跳转技术的应用场合:

  • 重定向RequestDispatcher既可以应用于跳转到站外(项目的外面),也可以应用于项目内的跳转。如果非要项目之间(站外)进行跳转,那么必须要选择重定向技术,重定向可以在站外进行(如果是站外路径要带“http://”开头,站内路径要带项目名);
  • 转发只能在站内(项目内跳转),路径默认在项目内,即路径不用带项目名.

请求:类(javax.servlet.RequestDispatcher)

在某种情况下,一个Servlet类可能无法完成全部的工作,为了让各Servlet协同工作,Servlet规范为Web组件之间协同工作提供了两种途径:
请求转发。-源组件将请求转发给目标组件。
请求包含。-源组件将目录组件的结果包含到自身的响应结果中来。

  • 获取RequestDispatcher的两种方法:
         调用ServletContext.getRequestDispatcher(path)
         调用HttpServletRequest.getRequestDispatcher(path)
         以上两者的区别在于 (建议使用第二种并使用/开头)
         前者path参数必须是绝对路径,即必须以/开头。
         后者path即可以是绝对路径,也可以是相对路径。

请求转发的处理流程:rd.forward(request, response)

RequestDispatcher rd=request.getRequestDispatcher("/servlet/TwoServlet");
        rd.forward(request, response);//转发内容仍然保存在改页面中

1、清空用于存放响应正文数据的缓冲区。
也正因此,源组件在转发之前的内容不会被发送的客户端。
2、如果目标组件为Servlet、Jsp就调用它们的Service方法。如果目标组件为html页面,就读取此文本将它发送到客户端。
3、关闭输出流。
也正因此,源组件在调用之后发送的文本不会被发送的客户端。

请求转发知识点:
转发:传参,访问顺序(doGet还是doPost) —转发是共享同一个request和同一个response对象的
1)第一个是doGet,第二个走的也是doGet
2)第一个是doPost,第二个走的也是doPost
3)传参:可以通过request.setAttribute()设置,通过request.getAttribute()获取 —doGet或doPost都一样
4)后面代码不会运行


请求包含的处理特点如下:
相当于一段代码中嵌入一个方法(其他代码)
1、如果目标组件为Servlet或jsp就调用它的service方法。如果是html页面就直接将结果内容添加到源组件的响应结果中。
2、再返回到源组件中继续执行后续的代码。
3、在目标组件中设置的响应头将会被忽略。
4、如果在目录组件中关闭了输出流,则源组件后面的输出将不会输出到客户端。
代码示例:

RequestDispatcher rd=request.getRequestDispatcher("/servlet/Include2Servlet");
rd.include(request, response);

请求包含知识点:
请求包含:传参,访问顺序(doGet还是doPost)
1)两个servlet的输出都有效!—中途调用flush,流不会关闭,后续的输出都会执行。如果在第一个servlet中执行了out.close(),那么后续的输出(无论是第一还是第二个servlet)都不会执行,但程序不会出异常!!!!
2)第一个是doGet,第二个走的也是doGet
3)第一个是doPost,第二个走的也是doPost
4)对于请求包含,第二个servlet在执行完之后,还会回到第一个servlet的rd.include()这行代码之后。
5)传参方面,和转发是完全一样的,因为都是共享同一个request和同一个response.
6)后面代码继续运行

重定向

代码

response.sendRedirect(“somepage”);

重要细节:
重定向是浏览器自动又向服务器发起的新请求。所以不会共享之前的request和response对像。
重定向:传参,访问顺序(doGet还是doPost)
1)无论第一个是doGet还是doPost,第二个走的都是doGet
2)传参:第二个servlet中的request和第一个是完全不同的对象,因此无法通过:request.setAttribute()和request.getAttribute() 实现传参。
3)第二个servlet中是无法通过request.getParameter()的方式获取页面提交的参数数据
4)重定向方式下,如果要进行传参,可采用:在地址栏的url后添加类似如下的格式传参:?name=Jack&age=23response.sendRedirect(request.getContextPath()+"/servlet/Redir2Servlet?name=Jack&age=10");
注意,采用地址栏url传参的方式,在浏览器地址栏是能够看到的,因此要注意隐私(安全)问题—如果有隐私参数,那么要加密!!!
5)转发只能在站内进行(路径默认在项目内,即路径不用带项目名),重定向可以在站外进行(如果是站外路径要带“http://”开头,站内路径要带项目名)。如果非要项目之间(站外)进行跳转,那么必须要选择重定向。


包含

请求包含:传参,访问顺序(doGet还是doPost)
1)两个servlet的输出都有效!—中途调用flush,流不会关闭,后续的输出都会执行。如果在第一个servlet中执行了out.close(),那么后续的输出(无论是第一还是第二个servlet)都不会执行,但程序不会出异常!!!!
2)第一个是doGet,第二个走的也是doGet
3)第一个是doPost,第二个走的也是doPost
4)对于请求包含,第二个servlet在执行完之后,还会回到第一个servlet的rd.include()这行代码之后。
5)传参方面,和转发是完全一样的,因为都是共享同一个request和同一个response.
6)页面输出时,注意html标签不要输出冲突,如:在第一个servlet中输出了“”和“”,同时在第二个servlet中也输出这些标记。这样会出现html标记嵌套冲突!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值