zoukankan      html  css  js  c++  java
  • SpringMVC参数传递 HttpServletRequest,HttpServletResponse和HttpSession

    SpringMVC参数传递 HttpServletRequest,HttpServletResponse和HttpSession

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

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

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


    HttpServletRequest

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

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

    1.请求行

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

    例子

    @Controller
    public class IndexController {
        @RequestMapping(path={"/request"},method={RequestMethod.GET})
        @ResponseBody
        public String index(HttpServletRequest request) {
            StringBuilder sb = new StringBuilder();
            sb.append(request.getMethod()+"<br>");
            sb.append(request.getQueryString()+"<br>");
            sb.append(request.getRequestURI()+"<br>");
            sb.append(request.getRequestURL()+"<br>");
            return sb.toString();
        }
    }
     
    • 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值

    例子

    @Controller
    public class IndexController {
        @RequestMapping("/request")
        @ResponseBody
        public String index(HttpServletRequest request) {
            StringBuilder sb = new StringBuilder();
            Enumeration<String> headerNames = request.getHeaderNames();
            while (headerNames.hasMoreElements())  {          //读取请求消息头
                String name = headerNames.nextElement();
                sb.append(name + ":" + request.getHeader(name) + "<br>");
            }
            return sb.toString();
        }
    }
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

    获取cookie值

    @Controller
    public class IndexController {
        @RequestMapping("/request")
        @ResponseBody
        public String index(HttpServletRequest request) {
            StringBuilder sb = new StringBuilder();
            if(request.getCookies()!=null){
                for(Cookie cookie :request.getCookies()){
                    sb.append("Cookie: " + cookie.getName()+" value: "+ cookie.getValue());
                }
            }
            return sb.toString();
        }
    }
     
    • 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=服务器端代码错误

    @Controller
    public class IndexController {
        @RequestMapping("/request")
        @ResponseBody
        public String index(HttpServletResponse response) {
            response.setStatus(404);  //我们将状态设置成404
            return "hello";
        }
    }
     
    • 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

    response.setHeader("content-type", "text/html;charset=UTF-8");   //告知浏览器使用什么码表
    //告知客户端不缓存
    response.setHeader("pragma", "no-cache");
    response.setHeader("cache-control", "no-cache");
    response.setDateHeader("expires", 0);
    //添加Cookie
    response.addCookie(new Cookie(String name ,String value))
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.响应正文(主体)

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

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

    4.请求重定向

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

    例子

    @Controller
    public class IndexController {
        @RequestMapping("/request")
        @ResponseBody
        public String index(HttpServletResponse response)throws IOException {
            response.sendRedirect("/home");
            return "hello";  //也可以直接 return "redirect:/home"
        }
    
        @RequestMapping("/home")
        @ResponseBody
        public String home(HttpServletResponse response) {
            return "hahah";
        }
    }
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    页面输出:hahah


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

    文章最后发布于: 2017-11-27 16:44:51
  • 相关阅读:
    PTA —— 基础编程题目集 —— 函数题 —— 61 简单输出整数 (10 分)
    PTA —— 基础编程题目集 —— 函数题 —— 61 简单输出整数 (10 分)
    练习2.13 不用库函数,写一个高效计算ln N的C函数
    练习2.13 不用库函数,写一个高效计算ln N的C函数
    练习2.13 不用库函数,写一个高效计算ln N的C函数
    迷宫问题 POJ 3984
    UVA 820 Internet Bandwidth (因特网带宽)(最大流)
    UVA 1001 Say Cheese(奶酪里的老鼠)(flod)
    UVA 11105 Semiprime Hnumbers(H半素数)
    UVA 557 Burger(汉堡)(dp+概率)
  • 原文地址:https://www.cnblogs.com/xichji/p/11704513.html
Copyright © 2011-2022 走看看