1.springMVC入门案例制作
springMVC项目的开发采用1+N技术
一次性工作
创建工程,设置服务器,加载工程
导入坐标
创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
springMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)
多次工作
定义处理请求的控制器类
定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody)
(1)导入springMVC技术的坐标
<dependencies>
//servlet的依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
//spring框架的依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
//tomcat服务器
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path></path>
</configuration>
</plugin>
</plugins>
</build>
(2)创建SpringMVC控制器类(等同于Servlet功能),新建一个controller包,放UserController
(这里为N)
/**
* 制作控制器类,等同于servlet
*/
@Controller //1.必须是一个spring管控的bean
public class UserController {
@RequestMapping("/save") //3.设置当前方法的访问路径
@ResponseBody //4.设置响应结果为json数据
public String save() { //2.定义具体处理请求的方法
System.out.println("user save ...");
return "{'moudle':'springmvc'}";
}
@RequestMapping("/delete")
@ResponseBody
public String delete() {
System.out.println("user delete ...");
return "{'moudle':'springmvc delete'}";
}
}
(3)初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean,新建一个config包,下放SpringMvcConfig
/**
* 定义配置类加载controller对应的bean
*/
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
(4)初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求,在config包下新建ServletContainersInitConfig
/**
* 定义servlet容器的配置类
*/
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//加载springMVC配置
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
//设置tomcat接收的请求哪些归springMVC处理
protected String[] getServletMappings() {
return new String[]{"/"};
}
//设置spring相关配置
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
2.能够根据需求设置请求路径
@Controller
@RequestMapping("/user") //设置请求路径的前缀,访问路径为http://localhost/user/save
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'module':'user save'}";
}
}
3.能够完成json格式请求参数的接收
(1)导入jackson坐标,用于将json转为各种类型
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
(2)在springmvc类中加入@EnableWebMvc注解,开启json数据类型自动转换
@Configuration
@ComponentScan("com.itheima.controller")
//开启json数据类型自动转换
@EnableWebMvc
public class SpringMvcConfig {
}
(3)在controller包下的UserController类中加入编写如下方法
//集合参数: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'}";
}
三种json传递与接收的postman测试
普通数据类型集合参数:json格式
GET请求方式
请求路径为http://localhost/listParamForJson
//普通数据类型集合参数: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'}";
}
传递参数
["game","music","travel"]
POJO参数:json格式
POST请求方式
请求路径为http://localhost/pojoParamForJson
//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'}";
}
传递参数
{ //这里是对象里面嵌套对象name和age是普通数据类型,address为引用数据类型需要再封装为一个json对象"name"、"age"、"address"都只是名称,要保证与pojo实体类的类型一致
"name":"itcast",
"age":15,
"address":{
"province":"beijing",
"city":"beijing"
}
}
POJO数据类型集合参数:json格式
POST请求方式
请求路径为http://localhost:80/listPojoParamForJson
//集合参数: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'}";
}
传递参数
[ //首先这是一个数组,数组元素为对象,在json中用[]表示数组,用{}表示对象
{"name":"itcast","age":15},
{"name":"itheima","age":12}
]
日期参数
GET请求方式
请求路径为http://localhost:80/dateParam?date=2088/08/08&date1=2088-08-18&date2=2088/08/28 8:08:08
//日期参数
//使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
@RequestMapping("/dateParam")
@ResponseBody
public String dataParam(Date date, //这里的pattern指的是前面传递参数的格式是否匹配,如果匹配则正确接收并转成一个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'}";
}
4.能够完成json格式数据的响应
响应POJO对象
GET请求,请求路径为http://localhost/toJsonPOJO
//响应POJO对象 HttpMessageConvert接口实现json数据的转换(在jackson中)
//返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的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;
}
响应的数据为
{
"name": "itcast",
"age": 15
}
响应POJO对象集合
GET请求,请求路径为http://localhost/toJsonList
//响应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;
}
响应数据为
[ //首先返回一个数组,数组元素为两个json对象
{
"name": "传智播客",
"age": 15
},
{
"name": "黑马程序员",
"age": 12
}
]
5.能够基于RESTful实现页面数据的交互
(1)制作SpringMVC控制器,并通过PostMan测试接口功能
@RestController
@RequestMapping("/books")
public class BookController {
@PostMapping
public String save(@RequestBody Book book){
System.out.println("book save ==> "+ book);
return "{'module':'book save success'}";
}
@GetMapping
public List<Book> getAll(){
System.out.println("book getAll is running ...");
List<Book> bookList = new ArrayList<Book>();
Book book1 = new Book();
book1.setType("计算机");
book1.setName("SpringMVC入门教程");
book1.setDescription("小试牛刀");
bookList.add(book1);
Book book2 = new Book();
book2.setType("计算机");
book2.setName("SpringMVC实战教程");
book2.setDescription("一代宗师");
bookList.add(book2);
Book book3 = new Book();
book3.setType("计算机丛书");
book3.setName("SpringMVC实战教程进阶");
book3.setDescription("一代宗师呕心创作");
bookList.add(book3);
return bookList;
}
}
(2)设置对静态资源的访问放行,在config包下新建一个SpringMvcSupport,为的是防止所有的资源请求都被MVC拦截,对某些前端资源进行放行
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
//设置静态资源访问过滤,当前类需要设置为配置类,并被扫描加载
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//当访问/pages/????时候,从/pages目录下查找内容
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
}
}
(3)前端页面通过异步提交访问后台控制器
//添加
saveBook () {
axios.post("/books",this.formData).then((res)=>{
});
},
//主页列表查询
getAll() {
axios.get("/books").then((res)=>{
this.dataList = res.data; //将返回值绑定表单显示
});
},