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交互【重定向 与 请求分派】详解相关推荐

  1. 通过CURL请求示例详解HTTPS协议

    通过CURL请求示例详解HTTPS协议 基于HTTPS通信是当前互联网最通用便捷的通信方式,简单理解来看可以视为HTTP协议 + SSL/TLS协议,通过一个curl的示例阐述一下HTTPS协议. 特 ...

  2. 转: Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)

    转自: Springboot - 用更优雅的方式发HTTP请求(RestTemplate详解) - Java知音号 - 博客园RestTemplate是Spring提供的用于访问Rest服务的客户端, ...

  3. java ajax同步请求,成都汇智动力-java ajax实现异步同步请求全面详解

    原标题:成都汇智动力-java ajax实现异步同步请求全面详解 对象 var request=new () //兼容IE5 IE6 if (window.) {// code for IE7+, F ...

  4. python headr方法_对Python发送带header的http请求方法详解

    简单的header import urllib2 request = urllib2.Request('http://example.com/') request.add_header('User-A ...

  5. javaweb_笔记2(Servlet源码分析;request详解;请求域;转发和重定向;WebServlet注解;jsp基础语法,JavaBean。)

    1.HttpServlet源码分析 HttpServlet类是专门为HTTP协议准备的.比GenericServlet更加适合HTTP协议下的开发. HttpServlet在哪个包下? jakarta ...

  6. $.post把表单对象传递过去_第二章 第三节 Request请求对象详解

    Request对象和Response对象是必须熟悉的. Request对象负责请求的构造和处理 Response对象负责返回资源的解析和处理 一.Request对象参数 Request(url[, c ...

  7. NETGEAR拒绝连接请求_详解 Tomcat 的连接数与线程池

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料视频 点击此链接:多套SpringCloud/SpringBoot实 ...

  8. postman请求参数详解

    1. Authorization 身份验证,主要用来填写用户名密码,以及一些验签字段,postman有一个helpers可以帮助我们简化一些重复和复杂的任务.当前的一套helpers可以帮助你解决一些 ...

  9. Nginx 请求压缩详解

    一.介绍 请求压缩,是将服务器的结果通过 Nginx 将内容进行压缩后,在发送给客户端,降低网络传输压力,提升传输效率. 常见的两种请求方式是: gzip .brotli(Google),相当于 br ...

最新文章

  1. android存储器,Android——寄存器和存储器的区别
  2. 人脸识别未来发展如何更有“面子”?
  3. 智能车大赛AI视觉组参考答案
  4. 服务器对搜索引擎有哪些影响,实录:网站换服务器后对搜索引擎的影响
  5. 阮一峰react demo代码研究的学习笔记 - demo 6 debug - how check works
  6. 导致集群重启_干货丨如何水平扩展和垂直扩展DolphinDB集群?
  7. 【转】开机出现 error:file “/boot/grub/i386-pc/normal.mod“ not found 错误提示
  8. 11.标识符_unicode和GBK_各种字符集的关系
  9. Onvif开发之代码框架生成篇
  10. 中国甜叶菊乳制品市场趋势报告、技术动态创新及市场预测
  11. Generator的异步编程
  12. 丹琦女神的对比学习新SOTA,在中文表现如何?我们补充实验后,惊了!
  13. 1-csv文件,解决数字不全或者数组+e的显示的问题
  14. 【Codeforces Round #422 (Div. 2) C】Hacker, pack your bags!(hash写法)
  15. Excel任务该如何在FineReader 12中设置
  16. gtp6 linux 启动_glibc.i686安装
  17. java调用第三方短信接口 本地能发送短信,服务器却发不了,直到超时
  18. Excel公式中的LookUp三剑客(可以取代Vlookup的神秘公式)
  19. 企业微信4.0:上下游功能上线,用一款APP连接所有企业组织和用户
  20. 崇明东平森林公园一日游

热门文章

  1. ASCII码、HEX、字符、BCD 等等 基础知识思考
  2. AppFabric Caching Admin Tool
  3. 为什么要用TypeScript - 肉猪 - 博客园
  4. css -- 两种方法实现流式布局
  5. 算法 --- 归并排序的js实现
  6. JavaScript --- 渲染数据量大的数组
  7. 阿里云ecs实例中创建数据库
  8. Linux 下实现普通用户只能写入某个目录
  9. 递推-练习2--noi3525:上台阶
  10. 深入理解并行编程-分割和同步设计(四)