SpringMVC的数据绑定:

在后端直接得到前端的HTTP中的数据。

HTTP请求中的传输的参数都是String类型,Handler业务方法中的参数是开发者指定的数据类型,int Integer,,因此要进行数据类型的绑定

由HabderAdapter完成参数的绑定:

  • 基本数据类型:

    @RequestMapping("/baseType")
    @ResponseBody
    public String baseType(int id){ return "id="+id;
    }

请求必须由id参数,否则500错误,同时id的值 , 必须为数值不然为400异常。

  • 包装类

    @RequestMapping("/baseType1")
    @ResponseBody
    public String baseType(Integer id){ return "id="+id;
    }

请求必须由id参数,否则500错误,同时id的值 , 必须为数值不然为400异常。不传为null。

  • 利用@RequestParam处理参数(设置默认值)

    @RequestMapping("/baseType1")
    @ResponseBody
    public String baseType(@RequestParam(value = "id",required = true,defaultValue = "0") Integer id){ return "id="+id;
    }
  • 数组

    @RequestMapping("/arrayType")
    @ResponseBody
    public String arrayType(String[] names){
    StringBuffer stringBuffer =new StringBuffer();
    for(String str:names){
    stringBuffer.append(str).append(" ");
    }
    return "names: "+stringBuffer.toString();
    }
  • POJO

    package com.southwind.entity;
    
    import lombok.Data;
    
    @Data
    public class User {
    private Integer id;
    private String name;
    private Address address;
    }
    @RequestMapping("/add")
    public String add(User user){
    System.out.println(user);
    return "redirect:/addUser.jsp";
    }

乱码;

<mvc:annotation-driven>
<!-- 消息转换器-->
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=utf-8"></property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

List

SpringMVC不支持直接转换Lis类型,需要包装成Object

List的自定义包装类

控制类:

@RequestMapping("/listType")
@ResponseBody
public String listType(UserList users){
StringBuffer stringBuffer =new StringBuffer();
for(User user:users.getList()){
stringBuffer.append(user);
}
return "用户"+stringBuffer.toString();
}

实体类:

package com.southwind.entity;

import lombok.Data;

import java.util.List;
@Data
public class UserList {
private List<User> list;
}

jsp

<%--
Created by IntelliJ IDEA.
User: 郝泾钊
Date: 2022-04-06
Time: 17:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/listType">
<input type="text" name="list[0].id">
<input type="text" name=" list[0].name">
<input type="text" name="list[1].id">
<input type="text" name=" list[1].name">
<input type="submit" value=" 提交">
</form>
</body>
</html>

注意;User要有无参构造

JSON

1.对于返回是text:

<script type="text/javascript">
$(function () {
var user= {
"id":1,
"name":"张三"
}
$.ajax({
url:"/jsonType",
data:JSON.stringify(user),
type:"POST",
contentType:"application/json;charset=UTF-8",
dataType:"text",
success:function (data) {
// console.log(data);
var obj=eval("("+data+")")
alert(obj.id)
alert(obj.name)
}
})
})
</script>

2.直接是json

页面:

<%--
Created by IntelliJ IDEA.
User: 郝泾钊
Date: 2022-04-06
Time: 17:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript" src="js/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
$(function () {
var user= {
"id":1,
"name":"张三"
}
$.ajax({
url:"/jsonType",
data:JSON.stringify(user),
type:"POST",
contentType:"application/json;charset=UTF-8",
dataType:"JSON",
success:function (data) {
// console.log(data);
// var obj=eval("("+data+")")
alert(data.id)
alert(data.name)
}
})
})
</script>
</head>
<body>
</body>
</html>

controller:业务方法:

@RequestMapping("/jsonType")
@ResponseBody
public User jsonType(@RequestBody User user){
System.out.println(user);
user.setId(2);
return user;
}

配置:

<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--json依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.32</version>
</dependency>
</dependencies>
<mvc:annotation-driven>
<!-- 消息转换器-->
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=utf-8"></property>
</bean>
<!-- fastjson-->
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4"> </bean>
</mvc:message-converters>
</mvc:annotation-driven>

注意;

  • JSON数据必需用JSON。stringify()妆化成字符串
  • contentType:"application/json;charset=UTF-8"不能省略

Spring mvc 的视图层解析

调用web资源给域对象传值

page

request

session

application

业务数据的绑定是指将业务的数据绑定给jsp对象,业务数据的绑定是由ViewResolver来完成,开发时,我们先添加业务数据,在交给ViewResolve来绑定数据,因此学习的重点在于如何的添加数据,Springmvc提供了一下几中的方式来添加业务:

  • Map
  • Model
  • ModelAndView
  • @SessionAttribute
  • @ModelAttribute
  • Servlet API

业务绑定到request对象

Map

springmvc 在调用业务方法之前会创建一个隐含的对象作为业务的数据的容器,设置业务方法的入参为Maq类型,springmvc会将隐含的对象的引用传递格入参(默认是给Request)

@RequestMapping("/map")
public String map(Map<String,Object> map) {
User user =new User();
user.setId(1);
user.setName("张三");
map.put("user",user);
return "show";
}

Model

@RequestMapping("/model")
public String model(Model model) {
User user =new User();
user.setId(1);
user.setName("张三");
model.addAttribute("user",user);
return "show";
}

Mo'delAndView

Mo'delAndView不但包含业务数据也包括了视图信息,如果用Mo'delAndView来处理业务数据,业务数据的返回值必需是Mo'delAndView对象

操作;

1.填充业务数据

2.绑定业务信息

  • @RequestMapping("/modelAndView1")
    public ModelAndView modelAndView1() {
    ModelAndView modelAndView =new ModelAndView();
    User user =new User();
    user.setId(1);
    user.setName("张三");
    modelAndView.addObject("user",user);
    modelAndView.setViewName("show");
    return modelAndView; }

    完整路径

  • @RequestMapping("/modelAndView2")
    public ModelAndView modelAndView2() {
    ModelAndView modelAndView =new ModelAndView();
    User user =new User();
    user.setId(1);
    user.setName("张三");
    modelAndView.addObject("user",user);
    View view =new InternalResourceView("/show.jsp");
    modelAndView.setView(view);
    return modelAndView; }

    直接给视图

  • @RequestMapping("/modelAndView3")
    public ModelAndView modelAndView3() {
    ModelAndView modelAndView =new ModelAndView("show");
    User user =new User();
    user.setId(1);
    user.setName("张三");
    modelAndView.addObject("user",user);
    return modelAndView; }

    传递view对象

  • @RequestMapping("/modelAndView4")
    public ModelAndView modelAndView4() {
    View view =new InternalResourceView("/show.jsp");
    ModelAndView modelAndView =new ModelAndView(view);
    User user =new User();
    user.setId(1);
    user.setName("张三");
    modelAndView.addObject("user",user);
    return modelAndView; }

使用Map集合

  • @RequestMapping("/modelAndView5")
    public ModelAndView modelAndView5() {
    Map<String,Object> map =new HashMap<>();
    User user =new User();
    user.setId(1);
    user.setName("张三");
    map.put("user",user);
    ModelAndView modelAndView =new ModelAndView("show",map);
    return modelAndView; }

直接map和view

 @RequestMapping("/modelAndView6")
public ModelAndView modelAndView6() {
Map<String,Object> map =new HashMap<>();
User user =new User();
user.setId(1);
user.setName("张三");
map.put("user",user);
View view =new InternalResourceView("/show.jsp");
ModelAndView modelAndView =new ModelAndView(view,map);
return modelAndView; }

...

HttpServletRequest

Spring mvc 在业务方法中直接得到Servlet的原生web资源,只需要在方法的定义时添加HttpServletRequest入参即可,在方法体中直接使用request

<!--导入servlet的api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
@RequestMapping("/request")
public String request(HttpServletRequest request) {
User user =new User();
user.setId(1);
user.setName("张三");
request.setAttribute("user",user);
return "show";
}

@ModelAttribute

  • 定义一个方法来要填充到业务数据中的对线

  • 给方法添加@ModelAttribute,只是添加对象,不做业务

    @ModelAttribute
    public User getUser(){
    User user =new User();
    user.setId(1);
    user.setName("张三");
    return user;
    }
    @RequestMapping("/modelAttribute")
    public String ModelAttribute() {
    return "show";
    }

@ModelAttribute,当Handler无论接受到哪格方法都会先调用@ModelAttribute修饰的方法,并将返回值作为业务数据,此时业务方法只需要返回试图即可。

假如返回数据,还是会被@ModelAttribute的数据据覆盖。

而如果没有返回值,要手动填充Map或Model

直接给Model的优先级更高

key-value

key值默认是:对应类的小写首字母

业务数据绑定到Session

  • HttpSession

    @RequestMapping("/session")
    public String session(HttpSession httpSession){
    User user =new User();
    user.setId(1);
    user.setName("张三");
    httpSession.setAttribute("user",user);
    return "show";
    }
    }
  • @SessionAttributes注解

    默认都是在request下添加,但是注解了@SessionAttributes都会自动的添加到Session中

    @SessionAttributes(value = "user")
    @SessionAttributes(type = User.Class)

多个:

@SessionAttributes(value = {"user","students"})

SpringMVC的数据绑定与视图解析的更多相关文章

  1. SSM-SpringMVC-12:SpringMVC中BeanNameViewResolver这种视图解析器

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 视图解析器,这个很熟悉啊,之间就用过,就是可以简写/和.jsp的InternalResourceViewRes ...

  2. SpringMVC中支持多视图解析

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/suo082407128/article/details/70173301 在SpringMVC模式当 ...

  3. SpringMVC什么时候配置 视图解析器

    当Action返回的是一个真实路径的时候,视图解析器可不进行配置 当Action返回的是逻辑路径的时候,我们必须要在配置文件中注册视图解析器并为该逻辑路径添加前缀和后缀

  4. springMVC源码解析--ViewResolverComposite视图解析器集合(二)

    上一篇博客springMVC源码分析--ViewResolver视图解析器(一)中我们介绍了一些springMVC提供的很多视图解析器ViewResolver,在开发的一套springMVC系统中是可 ...

  5. SpringMVC系列(七)视图解析器和视图

    在springmvc.xml里面配置视图解析器 <!-- 配置视图解析器: 如何把 handler 方法返回值解析为实际的物理视图 --> <bean class="org ...

  6. [刘阳Java]_InternalResourceViewResolver视图解析器_第6讲

    SpringMVC在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器 InternalResourceViewResolver是SpringMVC中比较常用视图解析器. 网 ...

  7. day04-视图和视图解析器

    视图和视图解析器 1.基本介绍 在SpringMVC中的目标方法,最终返回的都是一个视图(有各种视图) 注意,这里的视图是一个类对象,不是一个页面!! 返回的视图都会由一个视图解析器来处理(视图解析器 ...

  8. SpringMVC框架——视图解析

    SpringMVC视图解析,就是将业务数据绑定给JSP域对象,并在客户端进行显示. 域对象: pageContext.request.session.application 业务数据绑定是有ViewR ...

  9. SpringMVC视图解析器

    SpringMVC视图解析器 前言 在前一篇博客中讲了SpringMVC的Controller控制器,在这篇博客中将接着介绍一下SpringMVC视 图解析器.当我们对SpringMVC控制的资源发起 ...

  10. 学习SpringMVC——说说视图解析器

    各位前排的,后排的,都不要走,咱趁热打铁,就这一股劲我们今天来说说spring mvc的视图解析器(不要抢,都有位子~~~) 相信大家在昨天那篇如何获取请求参数篇中都已经领略到了spring mvc注 ...

随机推荐

  1. Seata 1.5.2 源码学习(事务执行)

    关于全局事务的执行,虽然之前的文章中也有所涉及,但不够细致,今天再深入的看一下事务的整个执行过程是怎样的. 1. TransactionManager io.seata.core.model.Tran ...

  2. vite安装使用流程

    安装vite 使用npm npm create vite@latest 使用yarn yarn create vite 使用pnpm pnpm create vite 还有一些选择配置比如使用那种框架 ...

  3. Forest + IDEA = 双倍快乐!ForestX 隆重登场

    Forest + IDEA = 双倍快乐!ForestX 隆重登场 Forest 是一款声明式的 Java 开源 HTTP 框架,相比它的前辈 Httpclient 和 OkHttp 更简明易懂.也更 ...

  4. 【SQL真题】SQL3:每类视频近一个月的转发量/率

    题目: https://www.nowcoder.com/practice/a78cf92c11e0421abf93762d25c3bfad?tpId=268&tqId=2285068& ...

  5. 异构混排在vivo互联网的技术实践

    作者:vivo 互联网算法团队- Shen Jiyi 本文根据沈技毅老师在"2022 vivo开发者大会"现场演讲内容整理而成. 混排层负责将多个异构队列的结果如广告.游戏.自然量 ...

  6. 用了这么多年的 SpringBoot 你知道什么是 SpringBoot 的 Web 类型推断吗?

    用了这么多年的 SpringBoot 那么你知道什么是 SpringBoot 的 web 类型推断吗? 估计很多小伙伴都不知道,毕竟平时开发做项目的时候做的都是普通的 web 项目并不需要什么特别的了 ...

  7. JavaScript 深拷贝的循环引用问题

    如果说道实现深拷贝最简单的方法,我们第一个想到的就是 JSON.stringify() 方法,因为JSON.stringify()后返回的是字符串,所以我们会再使用JSON.parse()转换为对象, ...

  8. 希腊字母表及latex代码

    希腊字母表及latex代码 字母大写 字母小写 英文名称 latex大写代码 latex小写代码 \(\Alpha\) \(\alpha\) alpha \Alpha \alpha \(\Beta\) ...

  9. [R语言] R语言快速入门教程

    本文主要是为了从零开始学习和理解R语言,简要介绍了该语言的最重要部分,以快速入门.主要参考文章: R-Tutorial R语言程序的编写需要安装R或RStudio,通常是在RStudio中键入代码.但 ...

  10. 从最简单的线性DP开始

    导读 ^ _ ^ 线性DP可以说是最常见的DP问题. 从本期开始,我们将从最简单的线性DP开始学起. 后面同时更新一些经典的面试题带大家更加深入的学习线性DP 如何计算动态规划的时间复杂度? 状态数 ...