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交互【重定向 与 请求分派】详解
转载于:https://www.cnblogs.com/nm666/p/7904566.html
Servlet交互【重定向 与 请求分派】详解相关推荐
- 通过CURL请求示例详解HTTPS协议
通过CURL请求示例详解HTTPS协议 基于HTTPS通信是当前互联网最通用便捷的通信方式,简单理解来看可以视为HTTP协议 + SSL/TLS协议,通过一个curl的示例阐述一下HTTPS协议. 特 ...
- 转: Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)
转自: Springboot - 用更优雅的方式发HTTP请求(RestTemplate详解) - Java知音号 - 博客园RestTemplate是Spring提供的用于访问Rest服务的客户端, ...
- java ajax同步请求,成都汇智动力-java ajax实现异步同步请求全面详解
原标题:成都汇智动力-java ajax实现异步同步请求全面详解 对象 var request=new () //兼容IE5 IE6 if (window.) {// code for IE7+, F ...
- python headr方法_对Python发送带header的http请求方法详解
简单的header import urllib2 request = urllib2.Request('http://example.com/') request.add_header('User-A ...
- javaweb_笔记2(Servlet源码分析;request详解;请求域;转发和重定向;WebServlet注解;jsp基础语法,JavaBean。)
1.HttpServlet源码分析 HttpServlet类是专门为HTTP协议准备的.比GenericServlet更加适合HTTP协议下的开发. HttpServlet在哪个包下? jakarta ...
- $.post把表单对象传递过去_第二章 第三节 Request请求对象详解
Request对象和Response对象是必须熟悉的. Request对象负责请求的构造和处理 Response对象负责返回资源的解析和处理 一.Request对象参数 Request(url[, c ...
- NETGEAR拒绝连接请求_详解 Tomcat 的连接数与线程池
点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料视频 点击此链接:多套SpringCloud/SpringBoot实 ...
- postman请求参数详解
1. Authorization 身份验证,主要用来填写用户名密码,以及一些验签字段,postman有一个helpers可以帮助我们简化一些重复和复杂的任务.当前的一套helpers可以帮助你解决一些 ...
- Nginx 请求压缩详解
一.介绍 请求压缩,是将服务器的结果通过 Nginx 将内容进行压缩后,在发送给客户端,降低网络传输压力,提升传输效率. 常见的两种请求方式是: gzip .brotli(Google),相当于 br ...
最新文章
- android存储器,Android——寄存器和存储器的区别
- 人脸识别未来发展如何更有“面子”?
- 智能车大赛AI视觉组参考答案
- 服务器对搜索引擎有哪些影响,实录:网站换服务器后对搜索引擎的影响
- 阮一峰react demo代码研究的学习笔记 - demo 6 debug - how check works
- 导致集群重启_干货丨如何水平扩展和垂直扩展DolphinDB集群?
- 【转】开机出现 error:file “/boot/grub/i386-pc/normal.mod“ not found 错误提示
- 11.标识符_unicode和GBK_各种字符集的关系
- Onvif开发之代码框架生成篇
- 中国甜叶菊乳制品市场趋势报告、技术动态创新及市场预测
- Generator的异步编程
- 丹琦女神的对比学习新SOTA,在中文表现如何?我们补充实验后,惊了!
- 1-csv文件,解决数字不全或者数组+e的显示的问题
- 【Codeforces Round #422 (Div. 2) C】Hacker, pack your bags!(hash写法)
- Excel任务该如何在FineReader 12中设置
- gtp6 linux 启动_glibc.i686安装
- java调用第三方短信接口 本地能发送短信,服务器却发不了,直到超时
- Excel公式中的LookUp三剑客(可以取代Vlookup的神秘公式)
- 企业微信4.0:上下游功能上线,用一款APP连接所有企业组织和用户
- 崇明东平森林公园一日游