Bootstrap

request和response介绍、实现请求转发、域对象

request和response

Request是代表Http请求信息对象,其中封装了浏览器向服务器发送的请求信息,将request作为参数传递给Servlet的service方法,在service方法处理请求的过程中,可以通过request对象获取请求相关的信息(例如:获取请求头信息、获取请求参数等)

Response是代表Http响应信息的对象,其中将会封装服务器要发送给浏览器的响应信息,将response对象作为参数传递给service方法,在service方法处理请求的过程中,可以将要发送给浏览器的数据,先写入response对象中,在service方法执行完后,服务器负责从response对象中获取到响应信息,再按照http响应信息的格式组织成响应消息,发送给浏览器。

浏览器每次发请求访问服务器,服务器针对每次请求都会创建一个Request对象和一个Response对象,在响应结束时,会销毁Request和Response对象。

request对象
所谓的请求参数,其实就是通过浏览器向服务器发送请求时,在请求中所携带的一些数据。这些数据就称之为请求参数。

问题2、如何获取请求参数?

request.getParameter(String paramName);

– 通过请求参数的名字,获取对应的参数值,返回的是一个字符串。

request.getParameterValues(String paramName);

– 通过请求参数的名字,获取该名字对应的所有参数值组成的数组。返回值是一个数组

因此,以后在获取单值的参数时,推荐使用getParameter方法.

如果获取的是多值的参数(即一个参数名对应多个参数值),推荐使用getParameterValues方法。

代码示例:

//获取请求中所携带的数据(即user和like对应的参数值)

String user = request.getParameter( "user" );

System.out.println( "user="+user );

String[] likes = request.getParameterValues( "like" );

System.out.println( "like="+Arrays.toString( likes ) );

获取请求参数时的中文乱码问题?

(1)如果请求方式是GET提交,并且tomcat服务器是8.0及以后的版本,GET提交的中文参数是没有乱码问题的。(因为tomcat自8.0及以后的版本中已经处理了GET提交的中文参数乱码问题!)

(2)如果请求方式是GET提交,并且tomcat服务器是7.0及以前的版本,GET提交的中文参数也是有乱码问题的!如何处理?

在tomcat服务器的server.xml文件中修改端口的Connector标签上添加一个属性, URIEncoding=“utf-8”,如下:

<Connector connectionTimeout=“20000” port=“80”

        protocol="HTTP/1.1" redirectPort="8443"

        URIEncoding="utf-8"/>

如果是将tomcat整合到了Eclipse中,最好是在Servers项目中的server.xml文件中和tomcat服务器中conf目录下的server.xml文件中同时加上如上属性.

(3)如果是POST提交,无论是哪个版本的tomcat服务器,POST提交的中文参数都会有乱码问题,处理方式如下:

//在任何获取请求参数的代码之前,加上如下代码:

request.setCharacterEncoding(“utf-8”)

//再获取POST提交的中文参数就没有乱码问题了…

实现请求转发

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

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

在这里插入图片描述
请求转发的特点:

(1)请求转发整个过程是一次请求、一次响应;

(2)请求转发前后,浏览器地址栏地址不会发生变化(浏览器–访问–>A–转发–>B,地址栏地址始终指向A的地址);

(3)请求转发前后的request对象是同一个(转发前在A中的request 和 转发到B后,在B中的request 和A中的request对象是同一个;);

(4)转发前后的两个资源必须属于同一个Web应用,否则将无法进行转发(A转发到B,A和B必须属于同一个Web应用!)

请求转发实现:

request.getRequestDispatcher(url地址/转发到资源的路径).forward(req,res);

作为域对象使用
在这里插入图片描述
如果一个对象具备可以被访问的范围,通过这个对象上的map集合可以在整个范围内实现数据的共享。这样的对象就叫做域对象。

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

在request对象上提供了往域对象中存数据的方法以及取数据的方法:
request.setAttribute(String attrName, Object attrValue)

– 往request域中存入一个域属性,属性名(key)只能是字符串,属性值可以是任意类型

request.getAttribute(String attrName)

– 根据属性名获取对应的属性值,返回是一个Object类型的对象。

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

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

作用范围:在一次请求范围内,都可以获取到同一个request对象,都可以基于request域带数据到目的地

主要功能: 和请求转发配合使用,从Servlet带数据到JSP

;