SpringMVC的数据绑定与视图解析
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的数据绑定与视图解析的更多相关文章
- SSM-SpringMVC-12:SpringMVC中BeanNameViewResolver这种视图解析器
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 视图解析器,这个很熟悉啊,之间就用过,就是可以简写/和.jsp的InternalResourceViewRes ...
- SpringMVC中支持多视图解析
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/suo082407128/article/details/70173301 在SpringMVC模式当 ...
- SpringMVC什么时候配置 视图解析器
当Action返回的是一个真实路径的时候,视图解析器可不进行配置 当Action返回的是逻辑路径的时候,我们必须要在配置文件中注册视图解析器并为该逻辑路径添加前缀和后缀
- springMVC源码解析--ViewResolverComposite视图解析器集合(二)
上一篇博客springMVC源码分析--ViewResolver视图解析器(一)中我们介绍了一些springMVC提供的很多视图解析器ViewResolver,在开发的一套springMVC系统中是可 ...
- SpringMVC系列(七)视图解析器和视图
在springmvc.xml里面配置视图解析器 <!-- 配置视图解析器: 如何把 handler 方法返回值解析为实际的物理视图 --> <bean class="org ...
- [刘阳Java]_InternalResourceViewResolver视图解析器_第6讲
SpringMVC在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器 InternalResourceViewResolver是SpringMVC中比较常用视图解析器. 网 ...
- day04-视图和视图解析器
视图和视图解析器 1.基本介绍 在SpringMVC中的目标方法,最终返回的都是一个视图(有各种视图) 注意,这里的视图是一个类对象,不是一个页面!! 返回的视图都会由一个视图解析器来处理(视图解析器 ...
- SpringMVC框架——视图解析
SpringMVC视图解析,就是将业务数据绑定给JSP域对象,并在客户端进行显示. 域对象: pageContext.request.session.application 业务数据绑定是有ViewR ...
- SpringMVC视图解析器
SpringMVC视图解析器 前言 在前一篇博客中讲了SpringMVC的Controller控制器,在这篇博客中将接着介绍一下SpringMVC视 图解析器.当我们对SpringMVC控制的资源发起 ...
- 学习SpringMVC——说说视图解析器
各位前排的,后排的,都不要走,咱趁热打铁,就这一股劲我们今天来说说spring mvc的视图解析器(不要抢,都有位子~~~) 相信大家在昨天那篇如何获取请求参数篇中都已经领略到了spring mvc注 ...
随机推荐
- 关于Linux mint更换中文字体后全局楷体修改办法
问题描述 linux mint 更新中文字体后,全局都变成了楷体,浏览器里面,终端里(英文字体可以在终端设置里面修改),这里指的是中文字体,而英文字体可以在 linux mint 设置 - 选择字体 ...
- day16 异常处理生成器
day16 异常处理生成器 今日内容概要 异常处理 异常处理实战应用 生成器对象 生成器对象实现range方法 生成器表达式 今日内容详细 一.异常处理 1.异常常见类型 SyntaxError语法错 ...
- 谈谈我的「数字文具盒」 - NextCloud
接下来两篇主要谈论 Nextcloud 和 Obsidian,因为篇幅较长,所以单出罗列出来.本文主要介绍 Nextcloud 以及使用中的技巧和心得体会. Nextcloud Nextcloud 是 ...
- 【每日一题】【动态规划】2022年1月30日-NC127 最长公共子串
描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一. 方法1:dp数组存子串 import java.util.*; public ...
- 干电池升压5V,功耗比较低
干电池升压5V,功耗10uA PW5100干电池升压5V芯片 输出电容: 所以为了减小输出的纹波,需要比较大的输出电容值.但是输出电容过大,就会使得系统的 反应时间过慢,成本也会增加.所以建议使用一个 ...
- SQL语句查询关键字
SQL语句查询关键字前戏 SQL语句中关键字的执行顺序和编写顺序并不是一致的,可能会错乱 eg: select id,name from userinfo;我们先写的select再写的from,但是执 ...
- 聚焦技术,锐意创新,GaussDB给世界一个更优选择
摘要:从整个行业应用层面来看,现在,数据库的国产化时代已经到来. 本文分享自华为云社区<聚焦技术,锐意创新,GaussDB给世界一个更优选择>,作者: GaussDB数据库. 今天,以&q ...
- 第四篇:前端之BOM与DOM
前端基础之BOM和DOM 前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互 ...
- 判断条件为NULL
在ASCII码表里NULL的二进制位0.所以NULL作为判断条件时,表示为假的意思. ASCII表 二进制 字符 ...
- python进阶之路8 字典、元组、集合内置方法 编码理论
内容回顾 作业讲解 1.前期不熟练的情况下一定要先写注释 2.一定要仔细思考每一行代码的含义 3.自己不会的代码或者不熟练的代码一定要多敲多练 数据类型内置方法简介 所有的数据类型基本上都自带了一些操 ...