zoukankan      html  css  js  c++  java
  • Spring MVC之数据绑定和模型数据解析

    Spring MVC数据绑定

    数据绑定:在后端的业务方法中直接获取客户端HTTP请求中的参数,将请求参数映射到业务方法的形参中。

    Spring MVC 中的数据绑定的工作是由HandlerAdatper来弯沉的

    • 基本数据类型

        1 @RequestMapping("/baseType")

        2         @ResponseBody // 不会把返回值当视图地址来解析,将返回值以本身形式进行返回

        3         public String baseType(int id){

        4                 return id+"";

        5         

    @ResponseBody表示Spring MVC会直接将业务方法的返回值响应给客户端,但是基本数据类型返回值必须有赋值才能访问

    • 包装类

         

        1   @RequestMapping(value = "/packageType")

        2         @ResponseBody // 不会把返回值当视图地址来解析,将返回值以本身形式进行返回

        3         public String packageType(@RequestParam(value = "num",required = false,defaultValue = "111") Integer id){

        4                 return id+"";

        5         

    包装类可以接受null,当HTTP请求参数为空时,直接返回为null。

    @RequestParam(value="num",required=false,defaultValue="111")

    value="num"表示请求参数名;

    required=True表示参数必须填写,默认为false

    defaultValue="111"表示参数默认值。

    • 数组

        1 @RequestMapping(value = "/array")

        2 public String array(String[] name){

        3         String str = Arrays.toString(name);

        4         return str;

        5 }

    @RestController表示该控制器会直接将业务方法的返回值响应给客户端,不进行视图解析

    • List

      Spring MVC不支持List类型的直接转换,需要对List集合进行包装

        1 package com.wiggin.entity;

        2 

        3 import lombok.AllArgsConstructor;

        4 import lombok.Data;

        5 import lombok.NoArgsConstructor;

        6 

        7 import java.util.List;

        8 @Data

        9 @AllArgsConstructor

       10 @NoArgsConstructor

       11 public class UserList {

       12         private List<User> users;

       13 }

    JSP

        1 <%--

        2     Created by IntelliJ IDEA.

        3     User: Administrator

        4     Date: 2020/8/4

        5     Time: 0:13

        6     To change this template use File | Settings | File Templates.

        7 --%>

        8 <%@ page contentType="text/html;charset=UTF-8" language="java" %>

        9 <html>

       10 <head>

       11         <title>Title</title>

       12 </head>

       13 <body>

       14         <form action="/data/list" method="post">

       15                 用户1id:<input type="text" name="users[0].id"></br>

       16                 用户1:<input type="text" name="users[0].name"></br>

       17                 用户2id:<input type="text" name="users[1].id"></br>

       18                 用户2:<input type="text" name="users[1].name"></br>

       19                 用户3id:<input type="text" name="users[2].id"></br>

       20                 用户3:<input type="text" name="users[2].name"></br>

       21                 <input type="submit" value="注册">

       22         </form>

       23 </body>

       24 </html>

    业务方法

        1 @RequestMapping(value = "/list")

        2 public String list(UserList userList){

        3 

        4         StringBuffer str = new StringBuffer();

        5         for (User user:userList.getUsers()){

        6                         str.append(user);

        7         }

        8         return str.toString();

        9 

       10 }

    处理中文乱码,在springmvc.xml中配置

        1 <mvc:annotation-driven>

        2         <mvc:message-converters register-defaults="true">

        3                 <bean class="org.springframework.http.converter.StringHttpMessageConverter">

        4                         <property name="supportedMediaTypes" value="text/html;charset=UTF-8"></property>

        5                 </bean>

        6         </mvc:message-converters>

        7 </mvc:annotation-driven>

    • Map

      自定义封装类

        1 package com.wiggin.entity;

        2 

        3 import lombok.Data;

        4 

        5 import java.util.Map;

        6 

        7 @Data

        8 public class UserMap {

        9         private Map<String,User> users;

       10 }

    业务方法

        1 @RequestMapping(value = "/map")

        2 public String list(UserMap userMap){

        3 

        4         StringBuffer str = new StringBuffer();

        5         for (String key:userMap.getUsers().keySet()){

        6                 User user = userMap.getUsers().get(key);

        7                 str.append(user);

        8         }

        9         return str.toString();

       10 

       11 }

    JSP

        1 <%--

        2     Created by IntelliJ IDEA.

        3     User: Administrator

        4     Date: 2020/8/4

        5     Time: 17:17

        6     To change this template use File | Settings | File Templates.

        7 --%>

        8 <%@ page contentType="text/html;charset=UTF-8" language="java" %>

        9 <html>

       10 <head>

       11         <title>Title</title>

       12 </head>

       13 <body>

       14         <form action="/data/map" method="post">

       15                 用户1id:<input type="text" name="users['a'].id"></br>

       16                 用户1:<input type="text" name="users['a'].name"></br>

       17                 用户2id:<input type="text" name="users['b'].id"></br>

       18                 用户2:<input type="text" name="users['b'].name"></br>

       19                 用户3id:<input type="text" name="users['c'].id"></br>

       20                 用户3:<input type="text" name="users['c'].name"></br>

       21                 <input type="submit" value="注册">

       22         </form>

       23 </body>

       24 </html>

    • JSON

      客户端发送json格式的数据,通过Spring MVC绑定到业务方法的形参中。

      处理Spring MVC无法加载静态资源,在web.xml配置

        1     <!-- 单独处理js文件 -->

        2     <servlet-mapping>

        3         <servlet-name>default</servlet-name>

        4         <url-pattern>*.js</url-pattern>

        5     </servlet-mapping>

    JSP

        1 <%--

        2     Created by IntelliJ IDEA.

        3     User: Administrator

        4     Date: 2020/8/4

        5     Time: 17:27

        6     To change this template use File | Settings | File Templates.

        7 --%>

        8 <%@ page contentType="text/html;charset=UTF-8" language="java" %>

        9 <html>

       10 <head>

       11         <title>Title</title>

       12 

       13         <script src="static/jquery-3.5.1.min.js"></script>

       14         <script type="text/javascript">

       15                 $(function () {

       16                         var user = {

       17                                 "id" : 1,

       18                                 "name" : "张三";

       19 

       20                         }

       21                         $.ajax({

       22                                 url:"/data/json",

       23                                 data:Json.stringify(user),

       24                                 type:"POST",

       25                                 contentType:"application/json;charset=UTF-8",

       26                                 success:function (data) {

       27                                                 alert(data.id+"----"+data.name);

       28                                 }

       29                         })

       30                 })

       31         </script>

       32 </head>

       33 <body>

       34 

       35 </body>

       36 </html>

    业务方法

        1 // @RequestBody 接受json数据

        2 @RequestMapping("/json")

        3 public User json(@RequestBody User user){

        4         System.out.println(user);

        5         user.setId(6);

        6         user.setName("wiggin");

        7         return user;

        8 }

    在Spring MVC中JSON和javaBean的转换需要借助fastjson,pom.xml引入相关依赖

        1 <dependency>

        2     <groupId>com.alibaba</groupId>

        3     <artifactId>fastjson</artifactId>

        4     <version>1.2.32</version>

        5 </dependency>

    在springmvc.xml中配置

        1 <mvc:annotation-driven>

        2         <mvc:message-converters register-defaults="true">

        3                 <bean class="org.springframework.http.converter.StringHttpMessageConverter">

        4                         <property name="supportedMediaTypes" value="text/html;charset=UTF-8"></property>

        5                 </bean>

        6                 <!-- 配置fastjson -->

        7                 <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4"></bean>

        8         </mvc:message-converters>

        9 </mvc:annotation-driven>

       

    Spring MVC模型数据解析

    JSP四大作用域对应的内置对象:pageContext、request、session、application

    模型数据的绑定是由VIewResolver来完成的,实际开发中,我们需要先添加模型的数据,再交给ViewResolver来绑定

    Spring MVC提供了以下几种方式来添加模型数据

    • Map
    • Model
    • ModelAndView
    • HttpServletRequest
    • @ModelAttribute

       

    将模型数据绑定到Request对象

    1.Map

        1 import com.wiggin.entity.User;

        2 import org.springframework.stereotype.Controller;

        3 import org.springframework.web.bind.annotation.RequestMapping;

        4 

        5 import java.util.Map;

        6 

        7 @Controller

        8 @RequestMapping("/view")

        9 public class ViewHandler {

       10 

       11         @RequestMapping("/map")

       12         public String map(Map<String,User> map){

       13                 User user = new User();

       14                 user.setId(1);

       15                 user.setName("wiggin");

       16                 map.put("user",user);

       17                 return "view";

       18         }

       19 }

       

    JSP

        1 <%--

        2     Created by IntelliJ IDEA.

        3     User: Administrator

        4     Date: 2020/8/4

        5     Time: 20:51

        6     To change this template use File | Settings | File Templates.

        7 --%>

        8 <%@ page contentType="text/html;charset=UTF-8" language="java" %>

        9 <!-- 是否忽略EL表达式 -->

       10 <%@ page isELIgnored="false" %>

       11 <html>

       12 <head>

       13         <title>Title</title>

       14 </head>

       15 <body>

       16         ${requestScope.user}

       17 </body>

       18 </html>

    2.Model

        1 @RequestMapping("/model")

        2 public String map(Model model){

        3         User user = new User();

        4         user.setId(1);

        5         user.setName("wiggin");

        6         model.addAttribute("user",user);

        7         return "view";

        8 }

    3.ModelAndView

        1 @RequestMapping("/modelAndView")

        2 public ModelAndView modelAndView(){

        3         User user = new User();

        4         user.setId(1);

        5         user.setName("wiggin");

        6         ModelAndView modelAndView = new ModelAndView();

        7         modelAndView.addObject("user",user);

        8         modelAndView.setViewName("view");

        9         return modelAndView;

       10 }

       11 @RequestMapping("/modelAndView2")

       12 public ModelAndView modelAndView2(){

       13         User user = new User();

       14         user.setId(1);

       15         user.setName("wiggin");

       16         ModelAndView modelAndView2 = new ModelAndView();

       17         modelAndView2.addObject("user",user);

       18         View view = new InternalResourceView("/view.jsp");

       19         modelAndView2.setView(view);

       20         return modelAndView2;

       21 }

       22 @RequestMapping("/modelAndView3")

       23 public ModelAndView modelAndView3(){

       24         User user = new User();

       25         user.setId(1);

       26         user.setName("wiggin");

       27         ModelAndView modelAndView3 = new ModelAndView("view");

       28         modelAndView3.addObject("user",user);

       29         return modelAndView3;

       30 }

       31 @RequestMapping("/modelAndView4")

       32 public ModelAndView modelAndView4(){

       33         User user = new User();

       34         user.setId(1);

       35         user.setName("wiggin");

       36         View view = new InternalResourceView("/view.jsp");

       37         ModelAndView modelAndView4= new ModelAndView(view);

       38         modelAndView4.addObject("user",user);

       39         return modelAndView4;

       40 }

       41 @RequestMapping("/modelAndView5")

       42 public ModelAndView modelAndView5(){

       43         User user = new User();

       44         user.setId(1);

       45         user.setName("wiggin");

       46         Map<String,User> map = new HashMap<>();

       47         map.put("user",user);

       48         ModelAndView modelAndView5= new ModelAndView("view",map);

       49 

       50         return modelAndView5;

       51 }

       52 @RequestMapping("/modelAndView6")

       53 public ModelAndView modelAndView6(){

       54         User user = new User();

       55         user.setId(1);

       56         user.setName("wiggin");

       57         ModelAndView modelAndView6= new ModelAndView("view","user",user);

       58 

       59         return modelAndView6;

       60 }

    4.HttpServletRequest

        1 @RequestMapping("/request")

        2         public String request(HttpServletRequest request){

        3                 User user = new User();

        4                 user.setId(1);

        5                 user.setName("wiggin");

        6                 request.setAttribute("user",user);

        7 

        8                 return "view";

        9         }

    5.@ModelAttribute

    • 定义一个 方法,该方法专门用来返回要填充到模型数据中的对象
    • 业务方法无需再处理视图,只要返回视图就可以

        1 @ModelAttribute

        2 public User getUser(){

        3         User user = new User();

        4         user.setId(1);

        5         user.setName("wiggin");

        6         return user;

        7 }

        8 // 上面的模型数据已经返回,只要处理视图就行了

        9 @RequestMapping("/modelAttribute")

       10 public String modelAttribute(){

       11         return "view";

       12 }

    将模型数据绑定到session对象

    1.直接用原生的Servlet API

        1 public String session(HttpServletRequest request){

        2         HttpSession session = request.getSession();

        3         User user = new User();

        4         user.setId(1);

        5         user.setName("wiggin");

        6         session.setAttribute("user",user);

        7         return "view";

        8 }

        9 @RequestMapping("/session2")

       10 public String session2(HttpSession session){

       11         User user = new User();

       12         user.setId(1);

       13         user.setName("wiggin");

       14         session.setAttribute("user",user);

       15         return "view";

       16 }

    2.通过@sessionAttribute

        1 @Controller

        2 @RequestMapping("/view")

        3 // @SessionAttributes(value = "user") // 根据value添加,只要方法里有user对象就直接加到view中的session

        4 //@SessionAttributes(value = {"user","address"}) // 根据value添加,只要方法里有user以及address对象就直接加到view中的session

        5 //@SessionAttributes(types = User.class) // 根据types添加,只要方法里有User类就直接加到view中的session

        6 //@SessionAttributes(types = {User.class,Address.class}) // 根据types添加,只要方法里有UserAddress类就直接加到view中的session

        7 public class ViewHandler

    全局作用域

       

    将模型数据绑定到application对象

        1 @RequestMapping("/application")

        2 public String application(HttpServletRequest request){

        3         ServletContext application = request.getServletContext();

        4         User user = new User();

        5         user.setId(1);

        6         user.setName("wiggin");

        7         application.setAttribute("user",user);

        8         return "view";

        9 }

       

  • 相关阅读:
    Neoj4安装使用教程
    毕业设计每日博客——第五周3
    毕业设计每日博客——第五周2
    不知道为什么,我就是被这个冒号迷惑了
    对items函数的理解
    关于运算符+的一点想法
    请使用迭代查找一个list中最小和最大值,并返回一个tuple
    Python中最常见括号()、[]、{}的区别
    ping和telnet的区别
    SQL注入原理
  • 原文地址:https://www.cnblogs.com/wigginess/p/13447421.html
Copyright © 2011-2022 走看看