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