SpringMVC请求响应数据

本文介绍SpringMVC框架中如何获取请求数据及响应数据的方法。包括自动获取与手动获取请求数据的方式,并展示了如何通过配置编码过滤器解决POST请求中的乱码问题。此外,还详细介绍了使用ModelAndView、Model及Map等不同方式返回数据到前端。

请求数据:

SpringMVC提供了从请求对象中获取请求数据的方式: 自动获取和手动获取。
注意:
1.若注入的数据乱码或类型不匹配,会导致注入失败.[性别乱码,年龄非数字]
2.被注入数据的对象,无需装入Spring容器[无需@Component标注].

自动获取:
在这里插入图片描述

示例:
jsp页面

  <a href="test?data=张三">自动获取数据</a>
    <form action="test1" method="post">
      姓名:<input type="text" name="name"><br/>
    性别:<input type="radio" name="sex"><input type="radio" name="sex"><br/>
    年龄:<input type="text" name="age"><br/>
    地址:<input type="text" name="address"><br/>
    <input type="submit" value="提交">
  </form>

controller方法:

    @RequestMapping("/test")
    public String test(String data){ 参数与请求参数同名
        System.out.println("test()执行");
        System.out.println(data);
        return "test";
    }
    //对象类型数据入参
        @RequestMapping("/test1")
    public String test1(User user){
        System.out.println("test1()执行");
        System.out.println(user);
        return "test1";
    }

在这里插入图片描述

在这里插入图片描述

POST请求编码处理:

<!-- 配置编码过滤器,防止请求数据类型转换失败: 只对POST请求有效 -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

手动获取:
在这里插入图片描述

备注: @RequestParam/@RequestHeader/@CookieValue/@PathVariable用法和参数完全相同,区别在于获得数据的来源不同。

示例:

  <%--手动获取数据 RequestParam--%>
  <a href="test2?data=李四">@RequestParam</a>

controller方法

    @RequestMapping("/test2")
    public String test2(@RequestParam(value = "data1",required = false) String data1){
        System.out.println("test2()执行");
        System.out.println(data1);
        return "test2";
    }

请求参数与方法参数名不相同时可以使用RequestMapping注解的value属性来指定赋值,required 默认值为true表示如果没有传过来数据则会报错,false表示没有传过来数据的话参数data的参数值就为null。
在这里插入图片描述

PathVariable注解

示例:

  <%--手动获取数据 PathVariable--%>
  <a href="test3/abc/test?data=李四">@PathVariable</a><br>

controller方法

    @RequestMapping("/test3/{myView}/test")
    public String test3(@PathVariable("myView") String data){
        System.out.println("test3()执行");
        System.out.println(data);
        return "test3";
    }

打印结果为abc。

Servlet API类型参数:
在这里插入图片描述

如果IDEA引用不到Servlet的话:
在这里插入图片描述

  <%--手动获取数据 Servlet API--%>
  <a href="test4">Servlet API</a><br>

controller方法

    @RequestMapping("/test4")
    public String test4(HttpServletRequest request){
        System.out.println("test4()执行");
        request.setAttribute("name","张三");
        return "test4";
    }

响应数据

响应方式
在这里插入图片描述
在这里插入图片描述

响应方式:
解析ModelAndView时,判断"视图名"是以"forward:"或"redirect:“开头或"逻辑视图名”,然后以转发或重定向方式响应.

return "路径A/视图名":
    说明:
    1.作为逻辑视图名,交给视图解析器,加上前缀和后缀,然后访问该视图文件
    2.响应方式为转发
return "forward或redirect:/路径A/视图名":
    说明:
    1."/"表示"http://localhost:8080/项目名/".参考Web进行搜索文件
    2.forward和redirect只能与"/"开头的资源路径配合使用.
    3.forward和redirect支持URL传参
    4.forward或redirect响应时,不会经过视图解析器的处理,而是直接根据路径到相关位置寻找资源并返回.

示例:

  视图解析器和响应方式测试 <br>
  <!-- 视图名: return 视图名; [默认为转发方式] -->
  <a href="test">return 视图名;</a><br>

controller方法:

    @RequestMapping("/test")
    public String test(HttpServletRequest request){
        System.out.println("test()执行");
        request.setAttribute("msg","test中的数据");
        return "test";//转发
        //return 逻辑视图名-->ModelAndView对象{模型,视图数据}--->前端控制器: Model对象[存入Request容器],View对象[视图解析器处理,生成真实文件的路径]--->在视图文件中渲染Model数据-->浏览器:展示网页
    }

测试页面:

<html>
<head>
    <title>test</title>
</head>
<body>
test.jsp
${requestScope.msg}
</body>
</html>

示例:

  <!-- 视图名: return "forward或redirect:/路径A/视图名" [手动设置响应方式]-->
  <a href="test1">return "forward:/路径A/视图名";</a><br>
  <a href="test2">return "redirect:/路径A/视图名";</a><br>

controller方法:

    @RequestMapping("/test1")
    public String test1(){
        System.out.println("test1()执行");
        return "forward:/WEB-INF/jsp/test1.jsp";//转发:不会交给视图解析器进行拼接前缀和后缀
        //return "forward:/..."-->ModelAndView对象{模型,视图数据}--->前端控制器:Model对象[存入Request容器],View对象--->在视图文件中渲染Model数据-->浏览器:展示网页
    }
    @RequestMapping("/test2")
    public String test2(){
        System.out.println("test2()执行");
        return "redirect:/jsp/test5.jsp"; //重定向:相当于直接在地址栏中输入地址访问,不能重定向到WEB-INF目录下
        //return "forward:/..."-->ModelAndView对象{模型,视图数据}--->前端控制器:Model对象[存入Request容器],View对象--->在视图文件中渲染Model数据-->浏览器:展示网页
    }

返回数据

在这里插入图片描述
示例:

  <a href="test">ModelAndView返回数据</a>

controller方法

    @RequestMapping("/test")
    public ModelAndView test(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("name","张三");//添加模型数据
        modelAndView.setViewName("test");//要返回的视图名称
        System.out.println("test()执行");
        return modelAndView;
    }

展示页面:

${requestScope.name}

在这里插入图片描述
示例:

<a href="test2">Model返回数据</a>

controller方法

    @RequestMapping("/test2")
    public String test2(Model model){
        model.addAttribute("name","李四");
        model.addAttribute("sex","女");
        System.out.println("test2()执行");
        return "test2";
    }

展示页面

${requestScope.name}
${requestScope.sex}

在这里插入图片描述
示例:

  <a href="test1">Map返回数据</a>

controller方法

    @RequestMapping("/test1")
    public String test1(Map<String,Object> map){
        map.put("name","张三");
        map.put("sex","男");
        System.out.println("test1()执行");
        return "test1";
    }

展示页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${requestScope.name}
${requestScope.sex}
</body>
</html>

在这里插入图片描述
示例:

  <a href="test">test</a>
  <a href="test1">test1</a>

controller方法

    @RequestMapping("/test")
    public String test(){
        System.out.println("test()执行");
        return "test";
    }
    @RequestMapping("/test1")
    public String test1(@ModelAttribute User user){//从Request,Session中寻找user,找到则赋给参数.找不到,则反射机制创建,并赋给参数.最后,将创建的对象存入Request容器.
        System.out.println("test1()执行");
        return "test1";
    }
    @ModelAttribute("msg")
    public String data1(){
        System.out.println("data1()");
        return "哈哈哈";
    }
    @ModelAttribute("msg2")
    public String data2(Map<String,Object> map){
        map.put("name","笑话");
        map.put("sex","男");
        System.out.println("data2()执行");
        return "哈哈哈";
    }

展示页面:

<body>
test1.jsp
${user}
${msg}
${msg2}
${name}
${sex}
</body>

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值