五、Spring MVC 接收请求参数以及数据回显、乱码问题




一、Spring MVC 接收请求参数


客户端或者前端通过 URL 请求传递过来的参数,在控制器中如何接收?

  • 1、当参数和 Controller 中的方法参数一致时,无需做处理,可以正常接收

    • 代码示例以及对应 URL

      • http://localhost:8080/user?name=sys

            @RequestMapping("/user")
            public String getUser(Model model, String name) {
                model.addAttribute("msg", "name为" + name);
                return "test";
            }
        
    • 测试结果

  • 2、当参数和 Controller 中的方法参数不一致时,需要通过 @RequestParam 控制

    • 代码示例以及对应 URL

      • http://localhost:8080/user2?username=sys

            @RequestMapping("/user2")
            public String getUser2(Model model, @RequestParam("username") String name) {
                model.addAttribute("msg", "name为" + name);
                return "test";
            }
        
    • 测试结果

  • 3、当提交的参数与实体类中的属性一致,可以直接使用实体类接收即可

    • 代码示例以及对应 URL

      • http://localhost:8080/user?name=sys&age=99

      • 实体类

        @Data
        public class User {
            private String id;
            private String name;
            private int age;
        }
        
      • controller

        @RequestMapping("/user3")
        public String getUser3(Model model, User user) {
            model.addAttribute("msg", "id为" + user.getId()+"\n\t"+"name为" + user.getName()+"\n\t"+"age为" + user.getAge());
            return "test";
        }
        
    • 测试结果

    • 注:如果客户端传递的参数和实体类属性不一致,则默认给个 null




二、Spring MVC 数据回显


数据显示到前端有三种方式:ModelAndView、ModelMap、Model

  • 通过 ModelAndView 将数据返回给前端,需要搭配 Servlet API 使用。ModelAndView指模型和视图的集合,既包含模型 又包含视图;ModelAndView其实就是两个作用,一个是指定返回页面,另一个是在返回页面的同时添加属性(也就是返回的数据);

    public class ModelAndViewController implements Controller {
    
       public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse ref) throws Exception {
           //返回一个模型视图对象
           ModelAndView mv = new ModelAndView();
           // 获取要返回给客户端的数据,这里默认给个 ModelAndViewController 
           mv.addObject("msg","ModelAndViewController ");
           // 获取视图名称
           mv.setViewName("test");
           // 返回模型和视图
           return mv;
      }
    }
    
  • 通过 ModelMap 将数据返回给前端。ModelMap继承LinkedHashMap,spring框架自动创建实例并作为controller的入参,用户无需自己创建

    @RequestMapping("/hello")
    public String hello(@RequestParam("username") String name, ModelMap model){
       //封装要显示到视图中的数据
       //相当于req.setAttribute("name",name);
       model.addAttribute("name",name);
       // 返回视图名称
       return "test";
    }
    
  • 通过 Model 将数据返回给前端。Model是一个接口,它的实现类为ExtendedModelMap,继承ModelMap类

    @RequestMapping("/hello")
    public String hello(@RequestParam("username") String name, Model model){
       //封装要显示到视图中的数据
       //相当于req.setAttribute("name",name);
       model.addAttribute("msg",name);
       // 返回视图名称
       return "test";
    }
    




三、SpringMVC 返回中文乱码问题


  • 方法一:在 web.xml 文件中对乱码问题进行了配置,配置代码如下:

    <!-- 配置过滤器 -->
    <filter>
        <filter-name>encodingFilter</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>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

  • 方法二:在 @RequestMapping 中添加 produces 参数,但是有着较大的局限性

    • 局限性一:需要在每一个接口中都加上 "produces=“text/json;charset=utf-8” 这段代码,太过麻烦且代码质量不高

    • 局限性二:不知有着 text/json,还有着其他不同种类的数据,而配置只能选一种


  • 方法三: 在Spring-mvc.xml配置文件统一处理

    • 在< mvc:annotation-driven/ >中添加如下内容:

      <mvc:message-converters>
          <bean class="org.springframework.http.converter.StringHttpMessageConverter">
              <property name="supportedMediaTypes">
                  <list>
                      <value>application/json;charset=UTF-8</value>
                      <value>text/plain;charset=UTF-8</value>
                      <value>text/html;charset=UTF-8</value>
                      <value>text/json;charset=UTF-8</value>
                  </list>
              </property>
          </bean>
      </mvc:message-converters>
      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值