文章目录
一.Spring MVC概述
-
MVC框架,它解决WEB开发中常见的问题(参数接收、文件上传、表单验证、国际化、等等),而且使用简单,与Spring无缝集成。
-
Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架 (更安全,性能更好,更简单)。
支持 RESTful风格的 URL 请求 。 -
采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。
SpringMVC和Struts2对比:
- Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
- Spring MVC 会稍微比 Struts2 快些. Spring MVC 是基于方法设计, 而 Sturts2 是基于类, 每次发一次请求都会实例一个 Action.
- Spring MVC 使用更加简洁, 开发效率Spring MVC确实比 struts2 高:支持 JSR303, 处理AJAX请求更方便
- Struts2 的 OGNL 表达式使页面的功能相比Spring MVC 更高些.
二.入门程序
- 准备环境:
搭建Web项目、拷贝依赖的jar
- 开发步骤:
- 配置前端控制器:DispatcherServlet
- 配置处理器映射器:BeanNameUrlHandlerMapping
- 配置处理器适配器:SimpleControllerHandlerAdapter
- 配置视图解析器:InternalResourceViewResolver
- 开发和配置处理器:HelloController
DispatcherServlet.properties文件中默认已经配置了
处理器映射器/配置处理器适配器/配置视图解析器
Spring MVC前端控制器
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<!-- 前端控制器 -->
<servlet>
<servlet-name>spring mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- Spring MVC配置文件的位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc.xml</param-value>
</init-param>
<!-- 项目启动时创建该servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring mvc</servlet-name>
<!-- 改前端控制器的有效路径 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
配置分支控制器
mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean name="/hello" class="cn.dusk._01_hello.HelloController"/>
</beans>
处理请求断电分支控制器
HelloController
public class HelloController implements Controller{
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
System.out.println("...Hello Controller...");
//请求作用域中共享数据msg并且转发到hello.jsp
ModelAndView mView = new ModelAndView();
mView.addObject("msg", "Dusk");
mView.setViewName("/WEB-INF/views/hello.jsp");
return mView;
}
}
三.SpringMVC执行流程
SpringMVC流程:
- 用户发送出请求到前端控制器DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping(处理器映射器)
- HandlerMapping找到具体的处理器(可查找xml配置或注解配置)生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet
- 请求适配器
- HandlerAdapter经过适配调用具体的处理器(Handler/Controller)
- Controller执行完成返回ModelAndView对象
- HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)
- ViewReslover解析后返回具体View(视图)
- DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
- DispatcherServlet响应用户
涉及组件分析:
-
前端控制器DispatcherServlet(不需要程序员开发),由框架提供,在web.xml中配置。
作用:接收请求,响应结果,相当于转发器,中央处理器。 -
处理器映射器HandlerMapping(不需要程序员开发),由框架提供。
作用:根据请求的url查找Handler(处理器/Controller),可以通过XML和注解方式来映射。 -
处理器适配器HandlerAdapter(不需要程序员开发),由框架提供。
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler。 -
处理器Handler(也称之为Controller,需要工程师开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler。
作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器。 -
视图解析器ViewResolver(不需要程序员开发),由框架提供
作用:进行视图解析,把逻辑视图名解析成真正的物理视图。
SpringMVC框架支持多种View视图技术,包括:jstlView、freemarkerView、pdfView等。 -
视图View(需要工程师开发)
作用:把数据展现给用户的页面
View是一个接口,实现类支持不同的View技术(jsp、freemarker等)
四.对静态资源的访问
我们这样的配置有这样一个问题:
在Web根路径添加index.html,然后不能访问,原因是什么呢?
为什么此时在配置前端控制器的写成 / 就不行呢?
原因:
Tomcat中处理静态资源访问的servlet(default)的映射路径为/.
在启动项目的时候,在Tomcat中的web.xml是先加载的,项目的web.xml是后加载的,如果配置了相同的映射路径,后面的会覆盖前者.
也就是说,SpringMVC中的DispatcherServlet的映射路径覆盖了Tomcat默认对静态资源的处理的路径。
如果SpringMVC要配置为/,那么就得设置Dispatcherservlet对静态资源进行支持。
解决方案:需要在SpringMVC的配置文件中添加对静态资源的访问
<mvc:default-servlet-handler/>
<mvc:default-servlet-handler/>
将在 SpringMVC 上下文中定义一个 DefaultServletHttpRequestHandler,它会对进入 DispatcherServlet 的请求进行筛查,如果发现是没有经过映射的请求,就将该请求交由 Tomcat默认的 Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理
/和/*的区别:
- / 会匹配url请求/index等 ,也会匹配静态资源*.js,.html等, 不会匹配.jsp文件。
- /* 会匹配url请求/index等 ,也会匹配静态资源*.js,.html等, 会匹配.jsp文件。如果使用,JSP直接响应,没有渲染.
五.使用注解开发
Java EE应用程序分为三层:
表现层(Web) @Controller
业务逻辑层(Service) @Service
数据持久层(DAO) @Resposotory
其他组件使用通用注解 @Component
-
注意:
- 四者的功能一模一样,仅仅只是被贴的组件类型不同.
- 作用,就是把被贴的类交给Spring管理,如下.
-
SpringMVC注解的解析器:
<mvc:annotation-driver>
会自动注册RequestMappingHandlerMapping/RequestMappingHandlerAdapter/ExceptionHandlerExceptionResolver三个bean
- 除此之外,还支持:
- 支持使用 ConversionService实例对表单参数进行类型转换.
- 支持使用 @NumberFormat、@DateTimeFormat注解完成数据格式化操作.
- 支持使用 @Valid注解对JavaBean实例进行JSR303验证.
- 支持使用 @RequestBody和@ResponseBody注解读写JSON.
- @RequestMapping注解: 设置Controller方法的访问URL,不能重名.
- URL路径映射
- 窄化请求映射
- 请求方法限定:
@RequestMapping(value="/list",method=RequestMethod.POST)
@Controller
@RequestMapping("dusk")
public class HelloController{
@RequestMapping("Hello")
public ModelAndView test1() {
System.out.println("HelloAnnoController.test1()");
return null;
}
}
六.响应传值方式
- 在Controller方法形参上可以定义request和response,使用request或response指定响应结果:
- 使用request请求转发页面:
request.getRequestDispatcher("页面路径").forward(request, response);
- 通过response重定向页面:
response.sendRedirect("url");
- Controller方法中定义ModelAndView对象并返回,对象中设置模型对象和视图名称:
mvc.xml配置视图解析器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean name="/hello" class="cn.dusk._01_hello.HelloController"/>
<!-- 组件扫描器 -->
<context:component-scan base-package="cn.dusk"></context:component-scan>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 设置所有视图的前缀 -->
<property name="prefix" value="/WEB-INF/views/"/>
<!-- 设置所有视图的后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
如:返回视图名称为resp, 则完整物理视图地址为:/WEB-INF/views/resp.jsp
-
返回String类型和共享数据
- 返回值为String,此时表示逻辑视图名称,完整物理的视图还是:前缀+逻辑视图名+后缀.
- forward前缀:表示请求转发,此时取消默认的前缀+后缀
- redirect前缀:表示重定向,此时取消默认的前缀+后缀
-
返回对象类型和共享数据
这种方式没有返回视图名称,默认使用了被访问的RequestMapping的值作为逻辑视图名称 -
@ModelAttribute作用如下:
- 设置请求参数绑定到Model对象中并传到视图页面的key名.
- 将方法返回值或请求参数绑定到Model对象中并传到视图页面
类RespController
@Controller
public class RespController {
@RequestMapping("test4")
@ModelAttribute("u")
public User handler() {
//此时返回url作为逻辑视图名称:resp/test4
System.out.println("====");
return new User();
}
/**
* 返回逻辑视图名称和共享数据
* @param model
* @return
*/
public String test3(Model model) {
//通过传入的模型对象来共享数据
model.addAttribute("msg","Dusk");
model.addAttribute("真");
//取消默认的前缀和后缀
return "redirect:/hello.jsp";//逻辑视图名称
}
/**
* 返回ModelAndView类型和共享数据
* @return
*/
@RequestMapping("test2")
public ModelAndView test2() {
ModelAndView mView = new ModelAndView();
//设置模型对象
mView.addObject("msg","真.西门");
//默认key为数据类型首字母小写,既${string}
mView.addObject("鸟");
//设置视图名称
mView.setViewName("hello");
return mView;
}
/**
* 返回void类型和共享数据
* 使用出入的servlet的方式
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@RequestMapping("test1")
public void test1(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
//这里操作和servlet的操作一样
req.setAttribute("msg", "Dusk");
req.getRequestDispatcher("hello").forward(req, resp);
}
}
-
多对象封装传参
-
把表单中的数据封装到多个对象中去.
-
由@InitBinder标识的方法,可以对WebDataBinder对象进行初始化
-
WebDataBinder是DataBinder的子类,用于完成由请求参数到JavaBean的属性绑定
-
@InitBinder方法不能有返回值,它必须声明为void
-
@InitBinder方法的参数通常是WebDataBinder
-
当需要把表单数据封装到多个对象中去的时候,如果各个对象中都有相同的属性
如name. 此时请求参数name就不清楚到底该封装到哪一个对象中去。
而默认情况下SpringMVC不支持 对象名.属性名 这种传参方式的。
-
-
RESTfull风格参数
RESTful是一种软件架构风格,严格上说是一种编码风格,其充分利用 HTTP 协议本身语义从而提供了一组设计原则和约束条件
主要用于客户端和服务器交互类的软件,该风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
在后台,RequestMapping标签后,可以用{参数名}方式传参,同时需要在形参前加注解@PathVarable -
解决中文乱码问题
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--配置字符编码过滤器,只对Post请求有效-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--配置使用UTF-8编码-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!--配置强制使用该编码-->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置前端控制器-->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc.xml</param-value>
</init-param>
</servlet>
<!--映射-->
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
Employee类
@Setter
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Employee {
private String name;
private Integer age;
}
User
@Setter
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name = "dusk" ;
private Integer age = 12;
private List<String> hobby;
}
req.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注值</title>
</head>
<body>
<hr/>
test 多对象注值
<form action="/test6.do" method="post">
employee<br>
账号:<input type="text" name="e.name"><br>
年龄:<input type="text" name="e.age"><br>
user<br>
账号:<input type="text" name="u.name"><br>
年龄:<input type="text" name="u.age"><br>
<input type="submit" value="提交"><br>
</form>
<hr/>
test List<>注值
<form action="/test5.do" method="post">
<input type="checkbox" name="hobby" value="java">java
<input type="checkbox" name="hobby" value="js">js
<input type="checkbox" name="hobby" value="c">c<br>
<input type="submit" value="提交"><br>
</form>
<hr/>
test checkbox提交数组
<form action="/test4.do" method="post">
<input type="checkbox" name="hobby" value="java">java
<input type="checkbox" name="hobby" value="js">js
<input type="checkbox" name="hobby" value="c">c<br>
<input type="submit" value="提交"><br>
</form>
<hr/>
test对象注入
<form action="/test3.do" method="post">
账号:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" value="提交"><br>
</form>
<hr/>
test简单类型注入
<form action="/test2.do" method="post">
账号:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" value="提交"><br>
</form>
</body>
</html>
七.日期类型处理
date.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>日期</title>
</head>
<body>
<form action="/getData/test2.do" method="post">
日期:<input type="text" name="date"/><br>
<input type="submit" value="提交">
</form>
<hr>
test3
<form action="/getData/test3.do" method="post">
日期:<input type="text" name="date"/><br>
<input type="submit" value="提交">
</form>
</body>
</html>
GetData
//控制器增强
@Controller
@RequestMapping("getData")
public class GetData {
/*@InitBinder
public void initBinderDateType(WebDataBinder binder){
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.applyPattern("yyyy-MM-dd");
binder.registerCustomEditor(Date.class,new CustomDateEditor(sdf,true));
}*/
@RequestMapping("test3")
public ModelAndView test3(Date date){
System.out.println("日期: "+date);
return null;
}
/*@RequestMapping("test2")
public ModelAndView test2(@DateTimeFormat(pattern = "yyyy-MM-dd") Date date){
System.out.println("日期格式: " + date);
return null;
}*/
@RequestMapping("test1")
public ModelAndView test1(User u){
ModelAndView mv = new ModelAndView();
mv.setViewName("req");
return mv;
}
}
或是使用类
CtrlAdvice
@ControllerAdvice
public class CtrlAdvice {
@InitBinder
public void initBinderDateType(WebDataBinder binder){
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.applyPattern("yyyy-MM-dd");
binder.registerCustomEditor(Date.class,new CustomDateEditor(sdf,true));
}
}
八.文件上传/下载
- SpringMVC的文件上传操作:
- 需要导入fileupload依赖包io的包
- commons.fileupload-1.3.2.jar
- commons.io-2.5.jar
配置文件上传解析器:bean的名字是固定的
使用Spring表达式 #{1024*1024}
上传
upload.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>图片上传</title>
</head>
<body>
<form action="/upload.do" method="post" enctype="multipart/form-data">
头像:<input type="file" name="headImg"><br>
<input type="submit" value="上传">
</form>
</body>
</html>
下载
download.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>下载</title>
</head>
<body>
<a href="/download.do?filename=4aa69d4ea9f64c63.gif">下载</a>
</body>
</html>
FileController控制器
@Controller
public class FileController {
@RequestMapping("download")
public ModelAndView download(String filename, HttpServletRequest req, HttpServletResponse resp) throws IOException {
String dir = req.getServletContext().getRealPath("/fileupload");
//设置下载的相应头信息
resp.setContentType("application/x-msdownload");//一下载的方式打开
resp.setHeader("Content-Disposition","attachment;filename="+filename);//设置下载文件的名称
ServletOutputStream out = resp.getOutputStream();
System.out.println(dir + filename);
Files.copy(Paths.get(dir,filename),out);
return null;
}
@RequestMapping("upload")
public ModelAndView upload(MultipartFile headImg, HttpServletRequest req) throws IOException {
//获取文件的真实名称
String filename = headImg.getOriginalFilename();
//获取上传文件的流数据
InputStream in = headImg.getInputStream();
String dir = req.getServletContext().getRealPath("/fileupload");
Files.copy(in, Paths.get(dir,filename));
return null;
}
}
九.拦截器
Spring MVC 的拦截器类似于Servlet 开发中的过滤器Filter,用于对Controller进行预处理和后处理。
-
使用SpringMVC拦截器步骤:
- 定义拦截器类,实现接口 org.springframework.web.servlet.HandlerInterceptor
- 在mvc.xml中配置拦截器
-
拦截器方法的执行时机:
- preHandle:控制器方法执行之前执行,返回结果为true表示放行,如果返回为false,表示拦截(可以做权限拦截,登录检查拦截).
- postHandle:控制器方法执行后,视图渲染之前执行(可以加入统一的响应信息).
- afterCompletion:视图渲染之后执行(处理Controller异常信息,记录操作日志,清理资源等)
登录控制器LoginController
@Controller
public class LoginController {
@RequestMapping("login")
public String login(String username,String password,HttpSession session){
if ("admin".equals(username) && "123".equals(password)){
session.setAttribute("USER_IN_SESSION",username);
return "forward:/user/list.do";
}
return "forward:/login.jsp";
}
}
登录拦截器CheckLoginInterceptor
public class CheckLoginInterceptor extends HandlerInterceptorAdapter{
/*在controller方法值前做拦截,返回true表示放行*/
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,Object handler) throws IOException {
//从session中获取当前登录成功的对象
Object user = request.getSession().getAttribute("USER_IN_SESSION");
//判断是否为null
if (user == null) {
//没有登录,返回到登录界面
response.sendRedirect("/login.jsp");
return false;
}
return true;//放行
}
}
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form action="/login.do" method="post">
账号:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
配置拦截器mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--配置SpringMVC相关配置-->
<mvc:annotation-driven/>
<!--注册拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--
配置有效路径:
/*:表示所有一级路径
/**:表示任意路径
-->
<mvc:mapping path="/**"/>
<!--不拦截哪些内容-->
<mvc:exclude-mapping path="/login.do"/>
<bean class="cn.dusk.ssm.web.interceptor.CheckLoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/views/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
十.总结
一:执行流程:
- 用户发送出请求到前端控制器DispatcherServlet。
- DispatcherServlet收到请求调用HandlerMapping(处理器映射器)。
- HandlerMapping找到具体的处理器(可查找xml配置或注解配置),生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。
- DispatcherServlet调用HandlerAdapter(处理器适配器)。
- HandlerAdapter经过适配调用具体的处理器(Handler/Controller)。
- Controller执行完成返回ModelAndView对象。
- HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
- DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)。
- ViewReslover解析后返回具体View(视图)。
- DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户。
二:静态资源方式方式:
- 使用springmvc框架自己静态资源处理器
web.xml : <url-pattern>/</url-pattern>
mvc.xml:<mvc:default-servlet-handler/>
- 使用tomcat的(推荐)
web.xml : <url-pattern>*.do</url-pattern>
三:注解开发
- mvc:annotation-driver
- @RequestMapping
四:响应传值
- 返回void类型和共享数据
request.getRequestDispatcher("页面路径").forward(request, response);
- 返回ModelAndView类型和共享数据
ModelAndView mv = new ....
mv.addObject(key, value)
- 返回String类型和共享数据(重点)
public String xxx(Model model){
model.addAttribute(key, value);
}
4:返回对象类型和共享数据
public 对象 xxx(){....}
五:请求传值
- 简单类型参数和RequestParam注解
public xxx xx(String xx, Integer xx)
- 复合类型参数
public xxx xx(User xx)
- 接收数组或集合
public xxx xx(Long[] xx)
- 多对象封装传参(略)