0x00前言
Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。
Spring MVC 是结构最清晰的 Servlet+JSP+JavaBean 的实现,是一个典型的教科书式的 MVC 构架,不像 Struts 等其它框架都是变种或者不是完全基于 MVC 系统的框架。
Spring MVC 角色划分清晰,分工明细,并且和 Spring 框架无缝结合。Spring MVC 是当今业界最主流的 Web 开发框架,以及最热门的开发技能。
在 Spring MVC 框架中,Controller 替换 Servlet 来担负控制器的职责,用于接收请求,调用相应的 Model 进行处理,处理器完成业务处理后返回处理结果。Controller 调用相应的 View 并对处理结果进行视图渲染,最终客户端得到响应信息
0x01springmvc介绍
- SpringMVC一种基于Java实现MVC模型的轻量级Web框架
- 使用简单方便开发,是简化版的servlt
- 用于表现层开发的一种框架
- 现在都采用注解开发更加方便
0x02SpringMVC简单入门
是属于sping容器的spring又是ioc模式的所要把所有都配置成bean
写一个配置类
//springmvc配置类,本质上还是一个spring配置类
@Configuration
@ComponentScan(\"com.itheima.controller\")
public class SpringMvcConfig {
}
写加载类去加载spring容器里的bean
package com.itheima.config;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//加载springmvc配置类,产生springmvc容器(本质还是spring容器)
protected WebApplicationContext createServletApplicationContext() {
//初始化WebApplicationContext对象
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
//加载指定配置类
ctx.register(SpringMvcConfig.class);
return ctx;
}
//设置由springmvc控制器处理的请求映射路径
protected String[] getServletMappings() {
return new String[]{\"/\"};
}
//加载spring配置类
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
控制器
package com.itheima.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
//定义表现层控制器bean
@Controller
public class UserController {
//设置映射路径为/save,即外部访问路径
@RequestMapping(\"/save\")
//设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
@ResponseBody
public String save(){
System.out.println(\"user save ...\");
return \"{\'info\':\'springmvc\'}\";
}
//设置映射路径为/delete,即外部访问路径
@RequestMapping(\"/delete\")
@ResponseBody
public String delete(){
System.out.println(\"user save ...\");
return \"{\'info\':\'springmvc\'}\";
}
}
- 简单配置就说的是用@@RequestMapping作为访问的路径
- @ResponseBody写在函数上面就可以用该函数的返回值作为响应值,也可以设置请求方式
0x03MVC常用注解
0x1配置简化开发
package com.itheima.config;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
//web配置类简化开发,仅设置配置类类名即可
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{\"/\"};
}
}
/*
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
protected WebApplicationContext createRootApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return ctx;
}
protected String[] getServletMappings() {
return new String[]{\"/\"};
}
}
*/
0x2路径配置
@Controller
//类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径
@RequestMapping(\"/user\")
public class UserController {
//请求路径映射
@RequestMapping(\"/save\")
@ResponseBody
public String save(){
System.out.println(\"user save ...\");
return \"{\'module\':\'user save\'}\";
}
//请求路径映射
@RequestMapping(\"/delete\")
@ResponseBody
public String delete(){
System.out.println(\"user delete ...\");
return \"{\'module\':\'user delete\'}\";
}
}
- 访问第一个方法的路径是/user/save
- 第二个方法的路径是/user/delete
0x3请求方式和注解
//请求参数
@Controller
public class UserController {
//普通参数:请求参数与形参名称对应即可完成参数传递
@RequestMapping(\"/commonParam\")
@ResponseBody
public String commonParam(String name ,int age){
System.out.println(\"普通参数传递 name ==> \"+name);
System.out.println(\"普通参数传递 age ==> \"+age);
return \"{\'module\':\'common param\'}\";
}
//普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系
@RequestMapping(\"/commonParamDifferentName\")
@ResponseBody
public String commonParamDifferentName(@RequestParam(\"name\") String userName , int age){
System.out.println(\"普通参数传递 userName ==> \"+userName);
System.out.println(\"普通参数传递 age ==> \"+age);
return \"{\'module\':\'common param different name\'}\";
}
//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping(\"/pojoParam\")
@ResponseBody
public String pojoParam(User user){
System.out.println(\"pojo参数传递 user ==> \"+user);
return \"{\'module\':\'pojo param\'}\";
}
//嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递
@RequestMapping(\"/pojoContainPojoParam\")
@ResponseBody
public String pojoContainPojoParam(User user){
System.out.println(\"pojo嵌套pojo参数传递 user ==> \"+user);
return \"{\'module\':\'pojo contain pojo param\'}\";
}
//数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
@RequestMapping(\"/arrayParam\")
@ResponseBody
public String arrayParam(String[] likes){
System.out.println(\"数组参数传递 likes ==> \"+ Arrays.toString(likes));
return \"{\'module\':\'array param\'}\";
}
//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping(\"/listParam\")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
System.out.println(\"集合参数传递 likes ==> \"+ likes);
return \"{\'module\':\'list param\'}\";
}
//集合参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
@RequestMapping(\"/listParamForJson\")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){
System.out.println(\"list common(json)参数传递 list ==> \"+likes);
return \"{\'module\':\'list common for json param\'}\";
}
//POJO参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
@RequestMapping(\"/pojoParamForJson\")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
System.out.println(\"pojo(json)参数传递 user ==> \"+user);
return \"{\'module\':\'pojo for json param\'}\";
}
//集合参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
@RequestMapping(\"/listPojoParamForJson\")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){
System.out.println(\"list pojo(json)参数传递 list ==> \"+list);
return \"{\'module\':\'list pojo for json param\'}\";
}
//日期参数
//使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
@RequestMapping(\"/dataParam\")
@ResponseBody
public String dataParam(Date date,
@DateTimeFormat(pattern=\"yyyy-MM-dd\") Date date1,
@DateTimeFormat(pattern=\"yyyy/MM/dd HH:mm:ss\") Date date2){
System.out.println(\"参数传递 date ==> \"+date);
System.out.println(\"参数传递 date1(yyyy-MM-dd) ==> \"+date1);
System.out.println(\"参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> \"+date2);
return \"{\'module\':\'data param\'}\";
}
}
- 请求方式的配置是在路径也就是@RequestMapping后面配上method=request.get/post/put/delete
- 当输入的参数和获取的参数不同时候用,@RequestParam(\"name\")这种类似的标签给形参绑定值,如果形参和传入值相同的话可以不用谢注解
0x4JSON传输
package com.itheima.controller;
import com.itheima.domain.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
//请求参数
@Controller
public class UserController {
//普通参数:请求参数与形参名称对应即可完成参数传递
@RequestMapping(\"/commonParam\")
@ResponseBody
public String commonParam(String name ,int age){
System.out.println(\"普通参数传递 name ==> \"+name);
System.out.println(\"普通参数传递 age ==> \"+age);
return \"{\'module\':\'common param\'}\";
}
//普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系
@RequestMapping(\"/commonParamDifferentName\")
@ResponseBody
public String commonParamDifferentName(@RequestParam(\"name\") String userName , int age){
System.out.println(\"普通参数传递 userName ==> \"+userName);
System.out.println(\"普通参数传递 age ==> \"+age);
return \"{\'module\':\'common param different name\'}\";
}
//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping(\"/pojoParam\")
@ResponseBody
public String pojoParam(User user){
System.out.println(\"pojo参数传递 user ==> \"+user);
return \"{\'module\':\'pojo param\'}\";
}
//嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递
@RequestMapping(\"/pojoContainPojoParam\")
@ResponseBody
public String pojoContainPojoParam(User user){
System.out.println(\"pojo嵌套pojo参数传递 user ==> \"+user);
return \"{\'module\':\'pojo contain pojo param\'}\";
}
//数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
@RequestMapping(\"/arrayParam\")
@ResponseBody
public String arrayParam(String[] likes){
System.out.println(\"数组参数传递 likes ==> \"+ Arrays.toString(likes));
return \"{\'module\':\'array param\'}\";
}
//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping(\"/listParam\")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
System.out.println(\"集合参数传递 likes ==> \"+ likes);
return \"{\'module\':\'list param\'}\";
}
//集合参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
@RequestMapping(\"/listParamForJson\")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){
System.out.println(\"list common(json)参数传递 list ==> \"+likes);
return \"{\'module\':\'list common for json param\'}\";
}
//POJO参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
@RequestMapping(\"/pojoParamForJson\")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
System.out.println(\"pojo(json)参数传递 user ==> \"+user);
return \"{\'module\':\'pojo for json param\'}\";
}
//集合参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
@RequestMapping(\"/listPojoParamForJson\")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){
System.out.println(\"list pojo(json)参数传递 list ==> \"+list);
return \"{\'module\':\'list pojo for json param\'}\";
}
//日期参数
//使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
@RequestMapping(\"/dataParam\")
@ResponseBody
public String dataParam(Date date,
@DateTimeFormat(pattern=\"yyyy-MM-dd\") Date date1,
@DateTimeFormat(pattern=\"yyyy/MM/dd HH:mm:ss\") Date date2){
System.out.println(\"参数传递 date ==> \"+date);
System.out.println(\"参数传递 date1(yyyy-MM-dd) ==> \"+date1);
System.out.println(\"参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> \"+date2);
return \"{\'module\':\'data param\'}\";
}
}
public String listPojoParamForJson(@RequestBody List<User> list)
- 这个方法中注解代表的意思是形参接受的是请求头中的流量
- 在config文件里面加上//开启json数据类型自动转换 @EnableWebMvc
- json是以后很常用的传输方式
0x5响应
@Controller
public class UserController {
//响应页面/跳转页面
//返回值为String类型,设置返回值为页面名称,即可实现页面跳转
@RequestMapping(\"/toJumpPage\")
public String toJumpPage(){
System.out.println(\"跳转页面\");
return \"page.jsp\";
}
//响应文本数据
//返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解
@RequestMapping(\"/toText\")
@ResponseBody
public String toText(){
System.out.println(\"返回纯文本数据\");
return \"response text\";
}
//响应POJO对象
//返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
@RequestMapping(\"/toJsonPOJO\")
@ResponseBody
public User toJsonPOJO(){
System.out.println(\"返回json对象数据\");
User user = new User();
user.setName(\"itcast\");
user.setAge(15);
return user;
}
//响应POJO集合对象
//返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
@RequestMapping(\"/toJsonList\")
@ResponseBody
public List<User> toJsonList(){
System.out.println(\"返回json集合数据\");
User user1 = new User();
user1.setName(\"传智播客\");
user1.setAge(15);
User user2 = new User();
user2.setName(\"黑马程序员\");
user2.setAge(12);
List<User> userList = new ArrayList<User>();
userList.add(user1);
userList.add(user2);
return userList;
}
}
- 想返回一个页面直接把方法的返回值写成String然后返回那个页面的名字写在哪里
- 响应文本数据
返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解 - 响应POJO对象
//返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解 - 响应POJO集合对象
返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
0x04总结
SpringMvc相较于Servlet开发简单了很多只需要常用的注解,我们需要记住的是它用了那些方式去传输数据和验证数据,方便以后对java框架的审计,mvc有很多内容是和Servlet重复的我只需要大概的复习一遍,解下来还有最后一点mvc的只是就是拦截器。
来源:https://www.cnblogs.com/0x3e-time/p/16446710.html
本站部分图文来源于网络,如有侵权请联系删除。