SpringMVC
1.SpringMVC介绍
springMVC是一种基于Java实现MVC模型的轻量级Web框架
优点:
-
使用简单,开发便捷(相较于Servelt)
-
灵活性强
使用SpringMVC技术开发web程序流程
-
创建web工程(Maven结构)
-
设置tomcat服务器,加载web工程(tomcat插件)
-
导入坐标(SpringMVC+Servlet)
-
定义处理请求的功能类(UserController)
-
设置请求映射(配置映射关系)
-
将SpringMVC设定加载到Tomcat容器中
SpringMVC入门案例
-
导入SpringMVC坐标与Servlet坐标
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.5.RELEASE</version> </dependency>
-
初始化SpringMVC环境
@Configuration public class SpringMvcConfig { }
-
创建SpringMVC控制器类(等同于Servlet功能)
@Controller public class UserController { @RequestMapping("/save") @ResponseBody public String save(){ System.out.println("user save ..."); return "{'info':'springmvc'}"; } }
-
设定SpringMVC加载对应的bean
@Configuration @ComponentScan("com.zkw.controller") public class SpringMvcConfig { }
-
初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC请求拦截的路径
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { @Override protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringMvcConfig.class); return ctx; } @Override protected String[] getServletMappings() { return new String[]{"/"}; //所有的请求都归springmvc处理 } @Override protected WebApplicationContext createRootApplicationContext() { return null; } }
部分代码介绍:
-
@RequestMapping:设置当前控制器方法请求访问路径
-
@ResponseBody:设置当前控制器方法响应内容为当前返回值,无需解析
-
createServletApplicationContext
protected WebApplicationContext createServletApplicationContext()//加载容器 { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();//初始化容器对象 ctx.register(SpringMvcConfig.class);//将配置注册到容器中 return ctx; }
-
getServletMappings:设定那些请求归springmvc处理
2.bean的加载控制
因为功能不同,如何避免Spring错误的加载到S平日那个MVC的bean?
A:加载Spring控制的bean的时候,排除掉SpringMVC控制的bean
方式一:设定扫描范围为com.zkw,排除掉controller包内的bean
@Configuration
@ComponentScan({"com.zkw.service","com.zkw.dao"})
public class SpringConfig{
}
方式二:设定扫描范围为精准范围,如service包、dao包等
@Configuration
@ComponentScan(value="com.zkw",
excludeFilters = @ComponentScan.Filter
type = FilterType.ANNOTATION,//排除方法
classes = Controller.class
)
public class SpringConfig{
}
简化开发
public class ServletContainersInitConfig extend AbstractAnnotationConfigDispatcherServeletInitializer{
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings(){
return new String[]{"/"};
}
protected Class<?>[] getRootConfigClasses(){
return new Class[0];
}
}
3.请求与响应
1.请求映射路
@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'}";
}
}
2.参数传递
Get请求传参
普通参数:url地址传参
public class UserController {
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name){
System.out.println("普通参数传递 name==>" + name);
return "{'module':'common param'}";
}
}
Post请求传参
传参汉字会出现乱码问题,添加字符过滤器
//乱码处理
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
普通参数:请求参数名与形参名不同
public class UserController {
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(@RequestParam("name") String userName){
System.out.println("普通参数传递 name ==>" + userName);
return "{'module':'common param'}";
}
}
集合参数
public class UserController {
@RequestMapping("/listParam")
@ResponseBody
public String commonParam(@RequestParam List<String> likes){
System.out.println("集合参数传递 likes ==>" + likes);
return "{'module':'list param'}";
}
}
传递json数据
-
导入JSON坐标
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency>
-
@EnableWebMvc:开启自动转换json对象的支持
-
集合参数:json格式 在方法体里不在RequestParam中
public String listParamForJson(@RequestBody List<String> likes) { System.out.println("list common(json)参数传递 list ==>" + likes); return "{'module':'list common for json param'}"; }
POJO参数:JSON格式
{
"name":"itcast",
"age";"15"
}
@RequestBody和@RequestParam区别
-
区别:
-
@RequestParam用于接收url地址传参,表单传参
-
@RequestBody用于接收json数据
-
-
应用
-
后期开发中,发送json格式数据为主,@RequestBody应用较广
-
如果发送非json格式数据,选用@RequestParam接收请求参数
-
日期类型参数传递
接收形参时,根据不同的日期格式设置不同的接收方式
@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(...);
System.out.println(...);
System.out.println(...);
return "{'module':'data param'}";
}
3.响应
-
响应页面
@RequestMapping("/toPage") public String toPage(){ return "page.jsp"; }
-
响应文本数据
@RequestMapping("/toPage") @ResponseBody public String toPage(){ return "page.jsp"; }
-
响应json数据
@RequestMapping("/toJsonPOJO") @ResponseBody public String toJsonPOJO(){ User user = new User(); user.setName("赵云"); user.setAge(41); return user; }
-
响应json数据,集合
@RequestMapping("/toJsonPOJO") @ResponseBody public String toJsonPOJO(){ User user = new User(); user.setName("赵云"); user.setAge(41); return user; User user2 = new User(); user2.setName("神赵云"); user2.setAge(40); List<User> userList = new ArrayList<User>(); userList.add(user1); userList.add(user2); return userList; }
4.REST风格
REST(Representational State Transfer),表现形式状态转换
可以隐藏资源的访问行为,无法通过地址得知对资源是何种操作
-
设置http请求动作(RequestMethod)
public class UserController { @RequestMapping(value = "/users",method = RequestMethod.POST) @ResponseBody public String save(){ System.out.println("user save ..."); return "{'module':'user save'}"; } @RequestMapping(value = "/users",method = RequestMethod.PUT) @ResponseBody public String update(){ System.out.println("user update ..."); return "{'module':'user update'}"; } @RequestMapping(value = "/users",method = RequestMethod.GET) @ResponseBody public String getAll(){ System.out.println("user getAll ..."); return "{'module':'user getAll'}"; } }
-
设定请求参数("/users/{id}" 和 @PathVariable)
@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE) @ResponseBody public String delete(@PathVariable Integer id){ System.out.println("user delete ..." + id); return "{'module':'user delete'}"; } @RequestMapping(value = "/users/{id}",method = RequestMethod.GET) @ResponseBody public String getById(@PathVariable Integer id){ System.out.println("user getById ..."); return "{'module':'user getById'}";
@PathVariable
用于接收路径参数,使用{参数名称}描述路劲参数
RESTful快速开发
@RestController
@RequestMapping("/books")
public class UserController {
@PostMapping
public String save(){
System.out.println("user save ...");
return "{'module':'user save'}";
}
@PutMapping
public String update(){
System.out.println("user update ...");
return "{'module':'user update'}";
}
@DeleteMapping
public String delete(@PathVariable Integer id){
System.out.println("user delete ..." + id);
return "{'module':'user delete'}";
}
@GetMapping
public String getById(@PathVariable Integer id){
System.out.println("user getById ...");
return "{'module':'user getById'}";
}
@GetMapping
public String getAll(){
System.out.println("user getAll ...");
return "{'module':'user getAll'}";
}
}
@RestController:@Controller和@ResponseBody两个注解组合功能