SpringMVC简介
SpringMVC概述
SpringMVC是一种基于java实现MVC模型的轻量级Web框架
优点 :
1.使用简单,便捷开发
2.灵活性强
SpringMVC入门案例
先设置SpringConfig容器
package hammer.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
//加载controller对应的bean
@ComponentScan("hammer.Control")
public class SpringMvcConfig {
}
使用@Controller ,使用@Controler定义bean
package hammer.Control;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController {
@RequestMapping("/save")
//设置当前操作的访问路径
@ResponseBody
public String save(){
System.out.println("user save");
return "{'info':'springmvc'}";//json数据
}
@RequestMapping("/delete")
@ResponseBody
public String delete(){
System.out.println("刘芳安帅哥");
return "{刘芳安帅哥}";
}
}
定义一个servlet容器启动的配置类,在里面加载spring 的配置
package hammer.config;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
//4.定义一个servlet容器启动的配置类,在里面加载spring的配置
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//加载springMVC容器配置
@Override
protected WebApplicationContext createServletApplicationContext() {
//创建Web对象
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
//加载对应的SpringMVCConfig加载配置
ctx.register(SpringMvcConfig.class);
return ctx;
}
//设置那些请求归属springMVC处理
@Override
protected String[] getServletMappings() {
//所有请求归springMvc处理
return new String[]{"/"};
}
//加载spring容器配置
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
入门案例工作流程分析
启动服务器初始化过程
1.服务器启动,执行ServletContainersInitConfig类,初始化web容器
2.执行createServletApplicationContext方法,创建了WebApplicationContext对象
3.加载SpringMvcConfig
4.执行@ComponentScan加载对应的bean
5.加载UserController,每个@RequestMapping的名称对应一个具体的方法
6.执行getServletMappings方法,定义所有的请求都通过SpringMVC
再Controller加载控制和业务bean加载控制有一个简化开发的方法
//1.简化开发
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
在这里推荐一个好用的api (不知道为什么postman一直使用不成功)runapi在线版
感觉挺好用的
@Controller
@RequestMapping("book")
public class BookController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("booksave win!");
return "{module:save}";
}
}
这个请求映射路径可以设置在类上面,也可以设置在方法上面,在实际开发的时候,建议按照标准来,因为方法的路径名可能一致,所以在类上面进行一个路径的区分
get请求与post请求发送普通参数
1.普通参数怎么接
外面发送参数,后面直接从形参之中就可以接收
public class BookController {
@RequestMapping( "/save")
@ResponseBody
public String save(String name,int age){
System.out.println("name"+name+","+age);
return "{module:save}";
}
}
但是在测试的时候有中文乱码问题
这个时候就需要在SpringMVC上面编写一个字符过滤器,设置一下编码(但是也没有成功)
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("utf-8");
return new Filter[]{filter};
}
最后是在maven里面修改了tomcat的编码格式,问题得以解决
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
请求与响应
参数种类
pojo类型参数
嵌套pojo类型参数
数组类型参数(传参是几个相同的就可以接受)
集合类型参数
@Controller
@RequestMapping( "book")
public class BookController {
@RequestMapping( "/save")
@ResponseBody
public String save(String name,int age){
System.out.println("name"+name+","+age);
return "{module:save}";
}
//普通参数:请求参数与形参名不同
@RequestMapping( "/save1")
@ResponseBody
public String saved(@RequestParam("name") String username, int age){
System.out.println("name"+username+","+age);
return "{module:save}";
}
//pojo参数
//只要属性名对应,可以直接加载进去
@RequestMapping( "/save2")
@ResponseBody
public String saved(user user){
System.out.println("name"+user.getName()+","+user.getAge());
return "{module:save}";
}
//嵌套pojo参数
//类似以上,就算如果有嵌套的类型,需要加上类似address.xxx 赋值计科
@RequestMapping( "/save3")
@ResponseBody
public String save3(user user){
System.out.println("name"+user.getName()+","+user.getAge());
return "{module:save}";
}
}
传递json数据
名称:@EnableWebMvc
类型:配置类注解
位置:SpringMVC配置类定义上方
作用:开启SpringMVC多项辅助功能 功能之一为根据类型匹配对应的类型转化器
范例:
@Configuration
//加载controller对应的bean
@ComponentScan("hammer.Control")
@EnableWebMvc
public class SpringMvcConfig {
}
名称:@RequestBody
类型:形参注解
位置:SpringMVC控制器方法形参定义前面
作用:将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次
范例:
//集合参数:json格式
@RequestMapping( "/save6")
@ResponseBody
public String save6(@RequestBody List<user> user){
System.out.println("List集合参数传递"+user.toString());
return "{module:save}";
}
日期型参数传递
日期类型数据基于系统不同格式也不尽相同
2008-08-18
2088/08/18
08/18/2088
接受形参时,根据不同的日期格式设置不同的接收方式
@RequestMapping( "/save7")
@ResponseBody
//日期要对上格式
public String datesave(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参数传递"+date1);
return "{module:save}";
}
响应
在做这个案例的时候,发现一直不能进行一个跳转,最后发现是给类加请求映射,不然地址栏返回的类的映射加上资源的名字,导致路径错误,将其去掉可以正常运行
@RequestMapping("/save8")
public String toJump(){
System.out.println("页面跳转");
return "index.jsp";
}
对于SpringMVC他对返回值的要求默认就是一个字符串 ,
@RequestMapping("/save9")
public user toJ(){
System.out.println("页面跳转");
user u = new user();
u.setAge(18);
u.setName("刘芳安");
return u;
}
这样是不行的
必须要加上@ResponseBody注解,会自动给我们进行转json操作
@ResponseBody
类型:方法注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器返回值作为响应体
范例:
//响应pojo对象
@RequestMapping("/save9")
@ResponseBody
public user toJ(){
System.out.println("页面跳转");
user u = new user();
u.setAge(18);
u.setName("刘芳安");
return u;
}