Servlet交互【重定向 与 请求分派】详解
Servlet交互
在serlvet中,需要调用另外一个资源来对浏览器的请求进行响应,两种方式实现:
调用HttpServletResponse.sendRedirect 方法实现 重定向
调用RequestDispatcher.forward 方法来实现请求分派 (转发)
1.reponse.sendRedirect("目标URL")
原理:
Servlet执行重定向的时候向客户端返回302 ,把“目标URL”作为请求头Location的值发送给客户端
客户端浏览器接收到302,会自动发送location请求头指向新的地址
web容器针对这个请求作出响应
特征:
两次请求和响应
最终请求地址会显示在地址栏中
第一次请求中的数据会在以后的请求中丢失
2.RequestDispatcher.forward(request,response)
原理:
Servlet执行请求分派,在容器内部 调用其他的servle程序,同时通过forward方法将请求和响应传递给被调用Servlet。
客户端浏览器接收到200 ,获取容器的响应
特征:
一次请求和响应
请求地址不会发生变化
响应是从其他servlet中响应的
具体如图:

两者之间的区别:
1.重定向由客户端来完成工作,请求分派服务器端来完成任务
2.重定向会丢失请求对象中的数据,分派不会
注意:
重定向和请求分派中的新路径如果以 / 开头 意义不同
重定向中, / 代表服务器根路径
http://localhost:8080
请求分派中, / 代表Web应用根路径
http://localhost:8080/WebContextRoot
- 那么重定向的路径加上“/”怎样才能和不加“/”所表示的路径一样呢?
response.sendRedirect("info.do");
//等价于
response.sendRedirect("http://localhost"+request.getContextPath()+"/info.do");
代码
重定向:
提交界面
<!--find.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>serevlet重定向</h1><hr/>
<form action="find.do" method="post">
搜索:<input type="text" name="find" />
<input type="submit" value="提交"/>
</form>
</body>
</html>
发起重定向代码:
public class FindServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String info = request.getParameter("find");
System.out.println("第一个servlet中的信息:"+info);
response.sendRedirect("info.do");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
重定向页面:
public class InfoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String info = request.getParameter("find");
System.out.println("第二个servlet中的信息:"+info);
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("第二个servlet中的信息:"+info);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
结果如图:
在这里数据丢失的原因:
因为重定向是通过目标路径来请求的,也就是我们所说的 “get”方式,而“get”方式是没有消息体的,因此重定向之后数据会丢失。
如何能让数据能够不丢失呢?
分析:“get”方式的请求数据的提交是以键值对的形式跟在URL后面的 其格式为:
http://localhost:8080/XXX/XXX/index.html?key1=value1&key2=value2......
那么我们就可以,通过对发起重定向的servlet进行如下修改:
//原来的代码
response.sendRedirect("info.do");
//修改改后
response.sendRedirect("info.do?find="+info);
请求分派:
其他代码和上面相同,发起重定向的代码改为请求分派的代码,带码如下:
public class FindServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String info = request.getParameter("find");
System.out.println("第一个servlet中的信息:"+info);
// response.sendRedirect("info.do?find="+info);
request.getRequestDispatcher("info.do").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
结果如下:

以上就是Servlet交互【重定向 与 请求分派】详解
Servlet交互【重定向 与 请求分派】详解的更多相关文章
- Servlet、ServletContext与ServletConfig的详解及区别
Servlet.ServletContext与ServletConfig的详解及区别 一.Servlet详解 Servlet是一个interface,全局限定名:javax.servlet.Servl ...
- HTTP请求方法详解
HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源] GET方法用来请求已被URI识别的资源.指定 ...
- 在ASP.NET 5应用程序中的跨域请求功能详解
在ASP.NET 5应用程序中的跨域请求功能详解 浏览器安全阻止了一个网页中向另外一个域提交请求,这个限制叫做同域策咯(same-origin policy),这组织了一个恶意网站从另外一个网站读取敏 ...
- Spring RestController 请求参数详解
Spring RestController 请求参数详解 引用作者jpfss 在阅读之前,最好先了解http请求的get,post,以及各种head头类型,请求参数类型. 无参数,设置RestCont ...
- AJAX(XMLHttpRequest)进行跨域请求方法详解
AJAX(XMLHttpRequest)进行跨域请求方法详解(三) 2010年01月11日 08:48:00 阅读数:24213 注意:以下代码请在Firefox 3.5.Chrome 3.0.Saf ...
- JS JSOP跨域请求实例详解
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题.这篇文章主要介绍了JS JSOP跨域请求实例详解的相关资料,需要的朋友可以参考下 ...
- 转:Servlet的url匹配以及url-pattern详解
Servlet是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜.估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,servlet中的u ...
- HTTP协议请求信息详解
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息.客户端向服务器发送一个请求,请求头包含请求的方法.URI.协议版本.以及包含请求修饰符.客户信息和内容的类似于MIME的消息结构 ...
- 网络HTTP请求状态详解
HTTP状态码大全 完整的 HTTP 1.1规范说明书来自于RFC 2616,你可以在http://www.talentdigger.cn/home/link.php?url=d3d3LnJmYy1l ...
随机推荐
- 关于VRTK的使用(一)—— VR开发环境搭建
首先在Hierarchy窗口中添加GameEmpty,并重命名为VRTK.然后给VRTK添加一个子容器命名为SteamVR.从Asset Store导入SteamVR Plugin: 然后分别选中预制 ...
- Java基础总结--泛型总结
-----泛型------JDK1.5出现的机制1.泛型出现的原因--简化书写,提高安全性技术的由来是为了解决问题,现在存在该问题,所有的容器定义类型为Object,所以任何对 象均可以放入容器--进 ...
- 快速部署Telegraf & Influxdb
是什么? Telegraf 是一个用 Go 编写的代理程序,可收集系统和服务的统计数据,并写入到 InfluxDB 数据库.Telegraf 具有内存占用小的特点,通过插件系统开发人员可轻松添加支持其 ...
- Java 设计模式原则
1. 找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起. 换句话说,如果每次新的需求一来,都会使某方面的代码发生变化,那么你就可以确定,这部分的代码需要抽出来,和其 ...
- 用ajax的同步请求解决登陆注册需要根据服务器返回数据判断是否能提交的问题
最近在写www.doubilaile.com的登陆注册.需要用ajax请求服务器判断用户名是否存在,用户名和密码是否匹配,进而提交数据.碰到的问题是异步请求都能成功返回数据,但是该数据不能作为紧接着的 ...
- Problem S
Problem Description Nowadays, we all know that Computer College is the biggest department in HDU. Bu ...
- Grunt打包seajs项目
在使用seajs时,常常将若干脚本分为多次require进来,这样开发中比较方便,但是,会增加http请求次数,在生产环境中需要进行打包合并.压缩等操作. 以Grunt构建工具为例,对一个seajs项 ...
- 基于QEMU的ARM Cortex-A9开发板Vexpress-ca9的Linux内核的编译和运行
宿主机:Ubuntu16.04 x64(Linux内核4.4.0) 交叉编译工具链:gcc-arm-linux-gnueabiarm-linux-gcc:4.4.3QEMU:2.5.0Linux ke ...
- 【Tesseract】Tesseract 的训练流程
在泰迪杯A题中,我刚刚接触了Tesseact,其中训练字库中遇到了较多的问题.所以在此记录一下,也当做一个笔记,省得以后忘记. 为了方便 ,将tif命名格式设为[lang].[fontname].ex ...
- Spring+Spring MVC+MyBatis框架集成
目录 一.新建一个基于Maven的Web项目 二.创建数据库与表 三.添加依赖包 四.新建POJO实体层 五.新建MyBatis SQL映射层 六.JUnit测试数据访问 七.完成Spring整合My ...