SpringMVC中HttpServletHttpRequest与HttpServletResponse详解

 

除了model,@RequestParam @PathVariable可以传递参数外,还有HttpServletRequest和HttpServletResponse也可以进行参数传递。

Web服务器收到一个http请求,会针对每个请求创建一个HttpServletRequest和HttpServletResponse对象,向客户端发送数据找HttpServletResponse,从客户端取数据找HttpServletRequest.


HttpServletRequest

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

主要功能:参数解析,Cookie读取,http请求字段,文件上传

1.请求行

getMethod(); 获得请求方式 
getQueryString() ; 返回请求行中的参数部分。 
getRequestURI(); 返回请求行中的资源名部分。 
getRequestURL();返回客户端发出请求时的完整URL。

例子

 
  1. @Controller

  2. public class IndexController {

  3. @RequestMapping(path={"/request"},method={RequestMethod.GET})

  4. @ResponseBody

  5. public String index(HttpServletRequest request) {

  6. StringBuilder sb = new StringBuilder();

  7. sb.append(request.getMethod()+"<br>");

  8. sb.append(request.getQueryString()+"<br>");

  9. sb.append(request.getRequestURI()+"<br>");

  10. sb.append(request.getRequestURL()+"<br>");

  11. return sb.toString();

  12. }

  13. }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

页面输出: 
这里写图片描述

我们还能获取请求消息头的信息

2.请求消息头

String getHeader(String name) 根据请求消息头名称称得到请求消息头信息值 
Enumeration getHeaderNames() 得到所有请求消息头名称 
Enumeration getHeaders(String name) 根据头名称得到相同名称请求头信息值 
String getCookies() 获取请求消息头中的cookie值

例子

 
  1. @Controller

  2. public class IndexController {

  3. @RequestMapping("/request")

  4. @ResponseBody

  5. public String index(HttpServletRequest request) {

  6. StringBuilder sb = new StringBuilder();

  7. Enumeration<String> headerNames = request.getHeaderNames();

  8. while (headerNames.hasMoreElements()) { //读取请求消息头

  9. String name = headerNames.nextElement();

  10. sb.append(name + ":" + request.getHeader(name) + "<br>");

  11. }

  12. return sb.toString();

  13. }

  14. }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

请求消息头的信息就被全部打印出来了 
这里写图片描述
通过这种方法来获取请求的一系列信息,比如通过user-agent来判断用户是通过手机还是电脑来登陆页面,从而可以实现相对应的跳转。

获取cookie值

 
  1. @Controller

  2. public class IndexController {

  3. @RequestMapping("/request")

  4. @ResponseBody

  5. public String index(HttpServletRequest request) {

  6. StringBuilder sb = new StringBuilder();

  7. if(request.getCookies()!=null){

  8. for(Cookie cookie :request.getCookies()){

  9. sb.append("Cookie: " + cookie.getName()+" value: "+ cookie.getValue());

  10. }

  11. }

  12. return sb.toString();

  13. }

  14. }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

这里写图片描述

3. 获得客户机请求参数(客户端提交的数据)

getParameter(name)方法 获取请求中的参数,该参数是由name指定 
getParameterValues(String name)方法 获取指定名称参数的所有值数组。它适用于一个参数名对应多个值的情况。如页面表单中的复选框,多选列表提交的值。 
getParameterNames() 方法返回一个包含请求消息中的所有参数名的Enumeration对象。通过遍历这个Enumeration对象,就可以获取请求消息中所有的参数名。 
getCharacterEncoding() 返回请求的字符编码方式 
getAttributeNames()返回当前请求的所有属性的名字集合赋值:setAttribute() 
getAttribute(String name) 返回name指定的属性值 
getsession()返回和客户端相关的session,如果没有给客户端分配session,则返回null 
getParameterMap():返回一个保存了请求消息中的所有参数名和值的Map对象。Map对象的key是字符串类型的参数名,value是这个参数所对应的Object类型的值数组 
RequestDispatcher.forward() 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。 
setCharacterEncoding(“utf-8”); 
getReader() 获取请求体的数据流 
getInputStream() 获取请求的输入流中的数据


HttpSerlvetResponse

HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。

主要功能:页面内容返回,cookie下发,Http字段设置,headers 
1.响应行

setStatus(int sc) 设置响应状态码

响应状态码:200=服务器端OK 
404=NOT FOUND 请求资源不存在 
500=服务器端代码错误

 
  1. @Controller

  2. public class IndexController {

  3. @RequestMapping("/request")

  4. @ResponseBody

  5. public String index(HttpServletResponse response) {

  6. response.setStatus(404); //我们将状态设置成404

  7. return "hello";

  8. }

  9. }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

可以看到页面依然正常显示 
这里写图片描述
但是我们通过Restlet Client看其HTTP状态,为404 
这里写图片描述

2.响应头

setHeader(String name,String value) //设置响应头信息 
sendRedirect(String location) //请求重定向 
addHeader(String name,String value) //增加相应头信息 
addCookie(Cookie cookie) //添加Cookie

 
  1. response.setHeader("content-type", "text/html;charset=UTF-8"); //告知浏览器使用什么码表

  2. //告知客户端不缓存

  3. response.setHeader("pragma", "no-cache");

  4. response.setHeader("cache-control", "no-cache");

  5. response.setDateHeader("expires", 0);

  6. //添加Cookie

  7. response.addCookie(new Cookie(String name ,String value))

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.响应正文(主体)

getWrite(); // 字符输出流 
getOutputStream(); //字节输出流 
setCharacterEncoding(String charset) //告知服务器使用什么编码 
setContentType(String type)

比如我们可以通过getOutputStream(); 返回图片,验证码等信息。

4.请求重定向

response.sendRedirect()//请求重定向,让客户端去访问另一个服务器

例子

 
  1. @Controller

  2. public class IndexController {

  3. @RequestMapping("/request")

  4. @ResponseBody

  5. public String index(HttpServletResponse response)throws IOException {

  6. response.sendRedirect("/home");

  7. return "hello"; //也可以直接 return "redirect:/home"

  8. }

  9.  
  10. @RequestMapping("/home")

  11. @ResponseBody

  12. public String home(HttpServletResponse response) {

  13. return "hahah";

  14. }

  15. }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

页面输出:hahah


PS: 
一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为转发 /307 
一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源进行处理,称之为重定向/302

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值