Servlet中的请求转发和重定向
跳转和重定向
有的时候客户端请求到达服务端后需要对请求重新转发到其它Servlet甚至别的服务器,这就需要跳转和重定向。
区别
一般来说,跳转是服务器内部跳转,例如将请求从一个Servlet转发给另外一个Servlet处理,是内部之间的转发。而重定向是告诉客户端去别的地方请求资源。举个例子,某人需要去找人事部门打印收入证明,而收入证明需要去财务部盖章。跳转的处理方式是:人事部门的人告诉你,你等一下,我去把收入证明打印出来,然后我再去找财务部盖章,所有资料准备好后,我再全部交给你。重定向的处理方式是:人事部门把收入流水给你打印出来,然后告诉你说,他们的工作已经做完了,现在需要你自己去找财务部盖章。
这就是跳转和重定向的本质区别,服务器跳转的时候,客户端地址栏不改变,而客户端重定向的时候,地址栏改变。
跳转示例
跳转需要用到RequestDispacher对象,该对象可以从HttpRequest或者ServletContext中获取。
下面是从HttpRequest对象中调用getRequestDispacher()方法获取RequestDispacher并跳转示例代码:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) { RequestDispatcher rd = null; String region = req.getParameter("region"); System.out.println("region: " + region); switch (region) { case "asia": { System.out.println("asia~~~"); rd = req.getRequestDispatcher("/asiaHandler.jsp"); break; } case "emea": { System.out.println("emea~~~"); rd = req.getRequestDispatcher("/emeaHandler.jsp"); break; } case "ams": { System.out.println("ams~~~"); rd = req.getRequestDispatcher("/amsHandler.jsp"); break; } default: { System.out.println("default~~~"); rd = req.getRequestDispatcher("/html/error.html"); break; } } try { rd.forward(req, resp); } catch (ServletException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } |
下面是从ServletContext对象中调用getNamedDispacher()方法获取RequestDispacher对象并跳转示例代码:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) { RequestDispatcher rd = null; ServletContext ctx = this.getServletContext(); String region = req.getParameter("region"); System.out.println("region: " + region); switch (region) { case "asia": { rd = ctx.getNamedDispatcher("AsiaHandler"); break; } case "emea": { rd = ctx.getNamedDispatcher("EmeaHandler"); break; } case "ams": { rd = ctx.getNamedDispatcher("AMSHandler"); break; } } try { rd.forward(req, resp); } catch (ServletException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } |
下面演示了用ServletContext对象调用getRequestDispacher()方法获取RequestDispacher对象,然后实现跳转:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) { RequestDispatcher rd = null; ServletContext ctx = this.getServletContext(); String region = req.getParameter("region"); System.out.println("region: " + region); switch (region) { case "asia": { rd = req.getRequestDispatcher("/asiaHandler.jsp"); break; } case "emea": { rd = req.getRequestDispatcher("/emeaHandler.jsp"); break; } case "ams": { rd = req.getRequestDispatcher("/amsHandler.jsp"); break; } } try { rd.forward(req, resp); } catch (ServletException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } |
请求重定向是服务器发给浏览器一个新的地址,让浏览器去请求新的地址。重定向需要用到HttpResponse对象调用sendRedirect()方法。
重定向示例:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) { try { resp.sendRedirect("http://www.bing.com"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } |
Servlet中的请求转发和重定向的更多相关文章
- JSP中的请求转发与重定向
在说请求转发和重定向之前,得了解下JSP九大内置对象中的response和request response:将服务器端数据发送到客户端,可通过在客户端浏览器中显示,用户浏览页面的重定向以及在客户端创建 ...
- servlet中的请求响应与重定向区别
一.概念 请求响应(转发):将客户端请求转发另一个servlet或者jsp页面------------------------getRequestDispatcher()方法 重定向: 返回一个连接给 ...
- Servlet中的请求转发RequestDispatcher接口的forword与Include的区别
RequestDispatcher接口中具有两个方法: forward() 与 include() 均 可完成请求 的转发.区别如下: forword(): 使用该方法,则当前 的 Servlet 中 ...
- javaweb servlet中使用请求转发乱码
乱码的方式有很多,这里指出一种不容易想到的 *请确保您的页面单独访问正常,经过servlet请求转发时,有PrintWriter out = response.getWriter()不正常,没有正常 ...
- Servlet中的请求转发
请求转发时,传递到下一个servlet的request和response可能内存地址不同,但是里面包含的内容是相同的 // servlet1 RequestDispatcher dispatcher ...
- javaWeb中request请求转发和response重定向
1.访问资源 运用forward方法只能重定向到同一个Web应用程序中的一个资源. 而sendRedirect方法可以让你重定向到任何URL. 2.request.get Forward代码中的&q ...
- HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向
上篇文章我们讲了servlet的基本原理,这章将讲一下剩余的部分. HttpServletRequest 接口 该接口是 ServletRequest 接口的子接口,封装了 HTTP 请求的相关信息, ...
- ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
ServletRequest 基本概念 JavaWeb中的 "Request"对象 实际为 HttpServletRequest 或者 ServletRequest, ...
- 04_web基础(六)之请求转发与重定向
1.交互方式 Web组件之间跳转: 从AServlet 跳转到 BServlet. 三种类型: 1:请求转发(forward) 2:URL重定向(redirect) 3:请求包含(include) 3 ...
随机推荐
- SQL Server取系统当前时间【转】
getdate //获得系统当前日期 datepart //获取日期指定部分(年月日时分表) getdate()函数:取得系统当前的日期和时间.返回值为datetime类型的. 用法:getdate( ...
- 【转】Apache Options Indexes FollowSymLinks详解
禁止显示Apache目录列表-Indexes FollowSymLinks如何修改目录的配置以禁止显示 Apache 目录列表.缺省情况下如果你在浏览器输入地址: http://localhost:8 ...
- Jquary获取页面控件的值
一 Jquery获得服务器控件值的方法由于ASP.NET网页运行后,服务器控件会随机生成客户端id,jquery获取时候不太好操作,google了下,总结有以下3种方法: 服务器控件代码:<as ...
- SQL Server 2008维护计划 出错 无法实现自动备份
,MaintenancePlan.Subplan_1,错误,0,HBZGQ\TESTSQLSERVER,MaintenancePlan.Subplan_1,(作业结果),,该作业失败. 用户 sa 调 ...
- [Hibernate] - Criteria Select
使用Hibernate的Criteria做查询. 参考文档: http://docs.jboss.org/hibernate/orm/3.5/reference/zh-CN/html/querycri ...
- ettercap ARP dns 欺骗
1.arp 这个简单,太熟了.略过1 2.dns 根据arp欺骗的步骤. 多了个etter.dns文件 找到它:locate etter.dns 进入后添加dns正向解析 启动,选 ...
- c#.net 调用BouncyCastle生成PEM格式的私钥和公钥
RsaKeyPairGenerator r = new RsaKeyPairGenerator(); r.Init()); AsymmetricCipherKeyPair keys = r.Gener ...
- 【转】JDBC为什么要使用PreparedStatement而不是Statement
http://www.importnew.com/5006.html PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement.PreparedSta ...
- bzoj4316: 小C的独立集
Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使 ...
- php 查询出来的字段名全是小写或者大写
PHP PDO预定义常量 PDO::CASE_LOWER -- 强制列名是小写PDO::CASE_NATURAL -- 列名按照原始的方式PDO::CASE_UPPER -- 强制列名为大写 修改此参 ...