request和response的区别!!!-程序员宅基地

技术标签: java  tomcat  servlet  http  服务器运维:监控、优化和故障排除  



在这里插入图片描述


一、request和response介绍


request是代表HTTP请求信息的对象,response是代表HTTP响应信息的对象。

当浏览器发请求访问服务器中的某一个Servlet时,服务器将会调用Servlet中的service方法来处理请求。在调用service方法之前会创建出request和response对象。

其中request对象中封装了浏览器发送给服务器的请求信息(请求行、请求头、请求实体等),response对象中将会封装服务器要发送给浏览器的响应信息(状态行、响应头、响应实体),在service方法执行完后,服务器再将response中的数据取出,按照HTTP协议的格式发送给浏览器。

每次浏览器访问服务器,服务器在调用service方法处理请求之前都会创建request和response对象。(即,服务器每次处理请求都会创建request和response对象)

在请求处理完,响应结束时,服务器会销毁request和response对象。


二、request对象


(一)获取请求参数

  • 问题1、什么是请求参数?

所谓的请求参数,就是浏览器发送给服务器的数据(不区分请求方式),例如:通过表单向服务器提交的用户名、密码等,或者在超链接后面通过问号提交的数据,都是请求参数。

http://localhost/day10_res/RequestDemo1?user=李四&like=篮球&like=足球
  • 问题2、如何获取请求参数?
(1)request.getParameter(String paramName)
-- 根据请求参数的名字获取对应的参数值,返回值是一个字符串;
-- 如果一个参数有多个值,该方法只会返回第一个值。
-- 如果获取的是一个不存在的参数,返回值为null
(2)request.getParameterValues(String paramName)
-- 根据请求参数的名字获取该名字对应的所有参数值组成的数组,返回值是一个字符串数组,其中包含了这个参数名对应的所有参数值
-- 如果获取的是一个不存在的参数,返回值为null

代码示例:

//1.获取请求参数中的用户名(user)
String user = request.getParameter("user");
System.out.println( "user="+user );

//2.获取请求参数中的爱好(like)
String[] like = request.getParameterValues( "like" );
System.out.println( "like="+Arrays.toString( like ) );
  • 问题3、获取请求参数时的中文乱码问题?

在获取中文的请求参数时,可能会出现乱码问题(和请求方式、tomcat服务器版本有关),具体可以分为以下三种情况:

  1. 如果请求是GET提交,并且tomcat是8.0及以后的版本,GET提交的中文参数,在获取时不会出现乱码问题!(8.0以后的tomcat包括8.0在获取GET提交的中文参数时,已经处理中文乱码问题。)

  2. 如果请求是POST提交,不管是哪个版本的tomcat服务器,在获取中文参数时,都会出现乱码问题。因为tomcat底层在接收POST提交的参数时,默认会使用iso8859-1编码接收,而这个编码中没有中文字符,所以在接收中文参数时,一定会出现中文乱码问题!

解决方法是:通知服务器 m ,在接收POST提交的参数时,使用utf-8编码来接收!

request.setCharacterEncoding("utf-8");

注意:

这行代码不会影响GET提交,只对POST提交有效!
这行代码要放在任何获取参数的代码之前执行!

  1. 如果请求是GET提交,并且tomcat是7.0及以前的版本,GET提交的中文参数,在获取时会出现乱码问题!

解决方法: 在[tomcat安装目录]/ conf/server.xml文件的(修改端口的)Connector标签上,添加一个 URIEncoding=“utf-8” 属性,如下:

<Connector port="80" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="utf-8" />

同时在[Eclipse]/Servers/[当前tomcat服务器对应的配置目录]/server.xml文件中,在Connector标签上,添加一个 URIEncoding=“utf-8” 属性,同上!

(二)实现请求转发

请求转发是服务器内部资源的一种跳转方式,即当浏览器发送请求访问服务器中的某一个资源(A)时,该资源将请求转交给另外一个资源(B)进行处理并且由资源B做出响应的过程,就叫做请求转发。

请求转发和重定向都是资源的跳转方式,但是跳转的过程有所不同。

在这里插入图片描述

  • 请求转发的特点:

    • (1)转发是一次请求,一次响应
    • (2)请求转发前后,浏览器的地址栏地址不会发生变化。(浏览器–访问–> A --转发–> B,地址栏地址始终指向A的地址)
    • (3)请求转发前后的request对象是同一个(转发前在A中的request和转发到B后,B中的request对象和A中的request对象是同一个。基于这一点,可以通过request从A带数据到B)
    • (4)请求转发前后的两个资源必须属于同一个Web应用,否则将无法进行转发。(A–转发–>B,A和B必须属于同一个Web应用!)
  • 请求转发实现:

request.getRequestDispatcher(url地址/转发到资源的地址).forward(req, res);
  • 代码示例:
//从当前Servlet转发到index.jsp(http://localhost/day10/index.jsp)
//request.getRequestDispatcher("/index.jsp").forward(request, response);
request.getRequestDispatcher("index.jsp").forward(request, response);

在这里插入图片描述

(三)作为域对象使用

request在实现转发时,通过request.setAttribute方法和request.getAttribute方法带数据到目的地时,就是通过request对象中的map集合带数据,这个requ est对象上的map集合以及request对象所在的范围即称之为是一个域对象。

如果一个对象具备可以被访问的范围,通过这个对象上的map集合可以在整个范围内实现数据的共享。这样的对象就叫做域对象。

在request对象上提供了往域对象(map)中存数据的方法以及取数据的方法:

request.setAttribute(String attrName, Object attrValue);
-- 往request域中存入一个域属性,属性名(key)只能是字符串,属性值(value)可以是任意类型。
request.getAttribute(String attrName);
-- 根据属性名(key)获取对应的属性值(value)。返回的是一个Object类型的对象。

request域对象所具备的三大特征:

  • 生命周期: 在服务器调用Servlet程序的service方法之前,会创建代表请求的request对象,在请求处理完,响应结束时,会销毁request对象。

  • 作用范围: 在一次请求范围内,都可以获取到同一个request对象。

  • 主要功能: 和请求转发配合使用,从Servlet带数据到JSP(带数据到目的地)

  • 扩展内容: request对象的getParametergetAttribute方法有什么区别?

    • getParameter()方法是用于获取(从浏览器发送过来的)请求参数的,请求参数不能设置,只能是浏览器发送给服务器,在服务器端再通过getParameter方法获取请求中的参数
    • getAttribute()方法是用于从request域中获取域属性时用的,域属性得先存入到域中(即得先通过setAttribute方法将数据存入request域中),再通过getAttribute()方法从域中获取。

(四)案例:模拟查询所有门店功能

1、创建一个Servlet程序,用于处理查询所有门店信息请求

public class DoorListServlet extends HttpServlet {
    
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
    
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //1.模拟查询数据库, 查询所有门店集合
        List<String> doorList = new ArrayList();
        doorList.add("01, 永和北三环西路店, 010-67676767");
        doorList.add("02, 永和西直门店, 010-68976347");
        doorList.add("03, 永和东直门店, 010-78397647");
        doorList.add("04, 永和北京西店, 010-78764397");
        doorList.add("05, 永和天安门店, 010-78769743");
        //2.将数据存入request域中
        request.setAttribute( "list", doorList );
        //3.将请求转发到 door_list.jsp 中, 取出所有门店显示在页面中
        request.getRequestDispatcher("door_list.jsp")
        .forward(request, response);
    }
}

2、创建一个JSP,用于显示所有门店信息

<body>
<h3>显示所有门店信息</h3>
    <%
        //获取request域中的门店信息集合
        List<String> list =(List<String>)request.getAttribute("list");
        //遍历门店集合, 将门店信息输出在网页上
        for( String door : list ){
        	out.write( door +"<br/>");
        }
    %>
</body>

三、response对象


response是代表HTTP响应信息的对象。

(一)向客户端发送数据

PrintWriter out = response.getWriter();

由于服务器在通过response获取的流发送数据时,默认使用iso8859-1编码,而这个编码中没有中文字符,所以在通过response获取的流发送中文数据时,会出现乱码问题。

解决方法是:在响应数据之前,通知服务器使用utf-8发送数据。

/*  通知服务器在响应数据时,使用utf-8编码
 * 也能通知浏览器使用utf-8接收服务器发送的数据 */
response.setContentType( "text/html;charset=utf-8" );
PrintWriter out = response.getWriter();
out.write( "你好" );

(二)实现重定向

当浏览器向服务器发请求访问某一个资源A,资源A在响应时通知浏览器需要再进一步请求才能获取到对应的资源,浏览器再次发请求访问服务器中的资源B,最终由资源B响应浏览器要获取的资源,这个过程叫做重定向。

在这里插入图片描述

  • 重定向的特点:

    • (1)重定向是两次请求、两次响应
    • (2)重定向前后,浏览器的地址栏地址会发生变化。(因为两次请求都是通过浏览器发起,浏览器知道这个跳转的过程,因此地址栏地址会变化)
    • (3)重定向前后的request对象不是同一个(因为重定向是两次请求,服务器会根据两次请求创建两个不同的request对象,request对象不是同一个,也就不能在重定向时通过request带数据到目的地。)
    • (4)重定向前后的两个资源可以是来自不同的web应用,甚至可以是来自不同的服务器。(进行跳转的两个资源之间没有限制)
  • 实现代码:

response.sendRedirect(所重定向到资源的URL地址);
  • 代码示例:
//测试1: 从当前Servlet(day10/TestRedirect)重定向到day10/index.jsp
// http://localhost/day10/TestRedirect
// http://localhost/day10/index.jsp
response.sendRedirect( "http://localhost/day10/index.jsp" );
response.sendRedirect( "/day10/index.jsp" );
response.sendRedirect( "/index.jsp" ); //错误路径
response.sendRedirect( "index.jsp" ); //正确路径

//测试2: 从当前Servlet重定向到day09/index.jsp
response.sendRedirect( "http://localhost/day09/index.jsp" );

//测试3: 从当前Servlet重定向到百度首页
response.sendRedirect( "http://www.baidu.com" );

总结:什么时候用转发(forward)?什么时候用重定向(redirect)?

(1)如果希望跳转前后地址栏地址不会发生变化, 只能使用转发; 如果希望跳转前后地址栏地址会发生变化, 只能使用重定向
(2)如果希望在跳转前后, 能够通过request对象带数据到目的地, 只能使用转发
(3)如果仅仅是做一个跳转,没有其他要求,此时推荐使用转发(转发是一次请求,一次响应,可以减少访问服务器的次数,降低服务器的压力)


在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq1808814025/article/details/106199159

智能推荐

Numpy一维数组-程序员宅基地

文章浏览阅读2.1k次。一维数组的实现pandas:Seriesnumpy:ndarray 2. ndarry和python list的比较相似: 通过位置访问元素,I[0] I[2:5] I[:3] I[2:] 循环:for item in l:xxx不同: python list元素可以任意类型组合,ndarray元素类型必须相同(不同时numpy会自动..._numpy一维数组

汇总onchange、onpropetrychange、和oninput事件的区别_onproperchange-程序员宅基地

文章浏览阅读280次。1、 onchange事件与 onpropertychange 事件的区别:onchange事件在内容改变(两次内容有可能还是相同的)且失去焦点时触发。onpropertychange事件却是实时触发,即每增加一个字符或者减少一个字符就会触发,通过js改变也会触发该事件,但是该事件是IE专有的。2、oninput 事件与onpropertychange 事件的区别:oninput事件是IE之外的大多浏览器支持的事件,在value改变时触发,实时的,即每增加一个或者删除一个字符就会触发,然_onproperchange

pdf转word4.0_java超大pdf转world-程序员宅基地

文章浏览阅读1.9k次。pdf转word4.0前言PDF转换WORD是用java语言编写,只需把PDF文件放置指定的目录下,然后运行java程序,即可实现了PDF文件转换word文件,轻松快捷。1、视频演示链接:https://pan.baidu.com/s/1snqOO1J 密码:n7rv2、源码下载 注意:需要本文源代码可加QQ490647751 回复关键字‘开通vip-pdf转w_java超大pdf转world

iOS混合开发支持横竖屏转换问题汇总_wkwebview怎么实现强制横屏-程序员宅基地

文章浏览阅读1.3k次。1、wkwebview支持横屏单页面支持旋转参考1、参考2、参考3# pragma mark 支持横竖屏幕转换- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ NSLog(@"UIViewController will rotate to Orientation: %ld", toInterface_wkwebview怎么实现强制横屏

xshell密码保存位置_如何用手机修改WIFI密码 用手机修改WIFI密码方法【详解】-程序员宅基地

文章浏览阅读136次。  现在互联网的普及让无线WIFI成了必备品,修改WIFI无疑是防止被蹭网的终极利器,然则很多家庭现在都没有电脑,能不能用手机直接修改WIFI密码呢?答案是当然可以 。  第一步:找到路由器的管理员IP地址  打开手机设置,点击WLAN  如图所示红线标注部分就我进要修改密码的WIFI  点击你要修改密码的WIFI名称  如上图所示  可以看到手机的IP地址为:192.168.0.100  那么我..._xshell修改路由器密码

推动社会可持续发展 华云数据荣获“最具社会责任企业”奖_2022年度“最具品牌影响力、最具创新力、最具成长力、最具社会责任”企业榜单-程序员宅基地

文章浏览阅读974次。​近日,由中华工商时报社发起的2021年度“最具成长力、最具创新力、最具品牌影响力、最具社会责任”获奖企业名单日前隆重出炉!经过层层选拔、激烈角逐,华云数据凭借在践行企业社会责任及可持续发展战略方面的突出表现荣获“最具社会责任企业”奖。本次评选,经过各地工商联、商会组织推荐和企业自荐。评选的发起旨在深入贯彻落实党的十九大和十九届历次全会精神,引导广大民营企业立足新发展阶段、贯彻新发展理念、助力构建新发展格局,把广大民营经济人士紧紧团结在党的周围,更好推动“两个健康”,在高质量发展中扎实推动共同富裕。能够_2022年度“最具品牌影响力、最具创新力、最具成长力、最具社会责任”企业榜单

随便推点

ubuntu22.04下编译安装使用gstreamer指南_ubuntu下meson安装gstreamer-程序员宅基地

文章浏览阅读1.8k次。如果版本还是低的话,可能/usr/bin有原始的meson,/usr/local/bin中是新安装的meson,将/usr/local/bin下面的copy到/usr/bin下面即可。解决方案:更新meson版本,ubuntu18.04会出现这个问题,原因是其meson版本过低,使用pip3来安装meson。系统中搜索g-ir-scanner,然后将其copy到/usr/lib/下,给予执行权限。系统中搜索xgettext,复制到/usr/bin/下,并给予执行权限。下面,我们将插件打通,让数据透传过去。_ubuntu下meson安装gstreamer

matlab 径向偏振光,径向偏振光的产生与应用..docx-程序员宅基地

文章浏览阅读1k次。径向偏振光的产生与应用.摘 要相比于其他具有传统偏振模式的光束,径向偏振光拥有更为优秀的轴向中心对称性(这种特征在传输过程中保持不变)。人们投向径向偏振光的关注越来越多。径向偏振光在高数值孔径条件下的聚焦特性在纳微级制造、操控中得到很多且正变得越来越多的应用。在这篇论文中,我们首先试图理清径向偏振光的数学理论基础,仔细地阐述径向偏振光的光束特性和紧聚焦特性,并展示一些径向偏振光在紧聚焦条件下的示..._matlab 径向偏振光束

CMKAE编译出现对“XXX”未定义的引用_cmake -- the following optional packages have not -程序员宅基地

文章浏览阅读159次。public2/users/lwang1/MetOffice/build/eccodes-2.26.0-Source/tools/grib_to_netcdf.c:3074:对‘nc_def_var_chunking’未定义的引用。/public2/users/lwang1/MetOffice/build/eccodes-2.26.0-Source/tools/grib_to_netcdf.c:3078:对‘nc_def_var_deflate’未定义的引用。本人非计算机类学生,不理解是什么意思。_cmake -- the following optional packages have not been found:

Codeforces 1401F 线段树与区间反转_线段树区间翻转-程序员宅基地

文章浏览阅读332次。线段树维护区间反转_线段树区间翻转

时隔两年,盘点ECCV 2018影响力最大的20篇论文_eccv 2018 image inpainting for irregular holes usi-程序员宅基地

文章浏览阅读746次。上周CV君盘点了去年CVPR中引用量最高的 20 篇论文:时隔一年,盘点CVPR 2019影响力最大的20篇论文不少朋友催更ECCV 2018的。同样是计算机视觉领域顶级会议,ECCV ..._eccv 2018 image inpainting for irregular holes using partial convolutions

谷歌接口测试插件类Talend API Tester - Free Edition(restLet)类似于postman-程序员宅基地

文章浏览阅读9.1k次。谷歌接口测试插件类Talend API Tester - Free Edition似于PostMan前言今天分享的内容使用的前提首先你要会科学上网,从谷歌商店获取插件下载并安装。界面如下怎么样是不是和postman很类似,也是一个API测试工具。很香的!Talend API Tester - Free Edition是一款能够帮助编程人员进行网页调试的工具大前提:安装后该插件后..._talend api tester - free edition

推荐文章

热门文章

相关标签