• 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
  • 相关阅读:
    bzoj1178/luogu3626 会议中心 (倍增+STL::set)
    suoi31 最近公共祖先2 (倍增lca)
    luogu4155/bzoj4444 国旗计划 (倍增)
    [BZOJ1864][Zjoi2006]三色二叉树
    [Luogu3070][USACO13JAN]岛游记Island Travels
    [Luogu2458][SDOI2006]保安站岗
    [BZOJ1191][HNOI2006]超级英雄Hero
    [BZOJ1050][HAOI2006]旅行
    [Luogu2973][USACO10HOL]赶小猪Driving Out the Piggi…
    [BZOJ1833][ZJOI2010]数字计数
  • 原文地址:https://www.cnblogs.com/xichji/p/11704513.html
Copyright © 2020-2023  润新知