ioc的
mvc的
Archetype Created Web Application
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
dispatcherServlet
/
package com.qf.webmvc.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 排查
*
* 用户功能(一个类相当于一个模块)
* 1. 登录
* 2. 修改密码
* 3. 注册
*/
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping("/login")
public String login(String username, String password) {
System.out.println(username);
System.out.println(password);
return "登录接口";
}
@GetMapping("/test")
public String test() {
System.out.println("测试代码");
return "hello";
}
}
package com.qf.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
/**
* 创建springMvc的配置文件,加载controller对应的bean
*/
@Configuration
@ComponentScan("com.qf.controller")
@EnableWebMvc
public class SpringMvcConfig {
}
package com.qf.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;
/**
* 定义一个servlet容器启动的配置类,在里面加载spring的配置
*/
public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer {
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return (WebApplicationContext) ctx;
}
//设置哪些请求归属springMvc处理
protected String[] getServletMappings() {
return new String[]{"/"};
}
//加载spring容器配置
protected WebApplicationContext createRootApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return (WebApplicationContext) ctx;
}
}
package com.qf.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.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
/**
* 定义一个servlet容器启动的配置类,在里面加载spring的配置
*/
public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
protected Class>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
/**
* 使用@Controller定义Bean
*/
@Controller
public class UserController {
//设置当前操作的访问路径
@RequestMapping("/save")
//设置当前操作的返回值类型
@ResponseBody
public String save(){
System.out.println("user save...");
return "{'module':'springmvc'}";
}
}
主要区别在于搜索范围。classpath
只搜索指定的目录和JAR文件,而classpath*
会搜索整个类路径,包括子目录和JAR文件。
springmvc对内置注解的支持,比如json数据
mvc是web容器,比ioc高一级
7、现在一个controller类就是一个模块(比如用户模块),然后类里面一个方法对应一个功能
8、配置了内置的diapatchServlet之后,tomcat会帮我们创建这个servlet,然后去加载spring mvc.xml那些配置文件
设定核心控制器bean
设置当前控制器方法请求路径
结合了@Controller和@ResponseBody两个注解的功能,使得该类能够处理HTTP请求并返回JSON格式的响应
RestController返回的是JSON数据。RestController注解是Spring4之后新加的注解,它的作用是返回json格式的数据。这个注解实际上是@Controller和@ResponseBody两者的结合,使用这个注解后该controller的所有方法都会返回json格式的数据。因为@ResponseBody的作用就是把返回的对象转换为json格式,并把json数据写入response的body中,前台收到response时就可以获取其body中的json数据了。
package com.qf.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* 创建springMvc的配置文件,加载controller对应的bean
*/
@Configuration
@ComponentScan("com.qf.controller")
public class SpringMvcConfig {
}
package com.qf.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;
/**
* 定义一个servlet容器启动的配置类,在里面加载spring的配置
*/
public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer {
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return (WebApplicationContext) ctx;
}
//设置哪些请求归属springMvc处理
protected String[] getServletMappings() {
return new String[]{"/"};
}
//加载spring容器配置
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
GetMapping增
DeleteMapping删
PutMapping改
PostMapping查
required | 设置必要参数(默认true) |
value | 起别名 |
defaultValue | 设置默认值 |
接收客户端传递的json数据,不要使用get请求
告诉Spring MVC从请求体中解析JSON(或其他格式的数据)并将其映射到 UserQo
类型的对象
@PostMapping("/json")
public String testJson(@RequestBody UserQo userQo){
System.out.println(userQo.getUsername());
return "测试接收json数据";
}
servlet的url-pattern设置为/时, 它仅替换servlet容器的默认内置servlet,用于处理所有与其他注册的servlet不匹配的请求。直白点说就是,所有静态资源(js,css,image,html等)的访问都将交给该servlet处理,而jsp页面则交给servlet容器内置的JSP servlet处理。
servlet的url-pattern设置为/*时,它会覆盖其他所有的servlet,包括servlet容器提供的所有servlet,如缺省servlet和JSP servlet。 无论你发出什么请求,都会在该servlet拦截处理。通常我们不会这么做。如果你只是想使用/*,那么你可以在Filter中使用,它处理完后会将url交给servlet处理。(注意:DispatcherServlet
自己处理不好这些jsp页面(不能对jsp页面进行解析),会直接返回它们的源码信息,并且编码都会变得不可控,编码会由原来的UTF-8
变成GBK
。)
注意:
@GetMapping("/path/{page1}/{size}")
public String testPath(@PathVariable(name = "page1") Integer page,@PathVariable Integer size){
System.out.println(page);
System.out.println(size);
return "从请求路径中获取参数";
}
(1)作用:设置当前控制器方法的请求访问路径
作用:全局异常处理、统一结果集、跨域请求(浏览器安全机制)、参数校验
value/path | 声音请求路径(如果在类上,表示所有请求的前缀) |
method | 请求方式(默认get,只能用于修饰方法) |
prams | 设置请求参数必须包含指定的内容,格式 |
headers | 限制请求头中的参数 |
consumes | 限制ContentType的内容 |
produces | 限制Accept内容 |
注意:如果写了@Configuration,那么这个类也会被扫描同时里面的bean也会被加载
注意:这里的configuration必须取消掉,不然也会扫描到
调用的时候选择对应的
//解决post乱码问题
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
package com.qf.config;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import javax.servlet.Filter;
/**
* 定义一个servlet容器启动的配置类,在里面加载spring的配置
*/
public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
//spring的
protected Class>[] getRootConfigClasses() {
return new Class[0];
}
//springmvc的
protected Class>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
//解决post乱码问题
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
}
绑定请求参数与处理器方法形参间的关系
非法
@RequestMapping("/some-endpoint")
public ResponseEntity handleRequest(@RequestBody MyObject obj1, @RequestBody MyObject obj2) {
// ...
}
@RequestMapping("/toJumpPage")
public String toJumpPage(){
System.out.println("跳转页面");
return "page.jsp";
}
绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应
@RequestBody | @RequestParam | @PathVariable | @Param |
接收json数据(必须配合序列化框架使用) | 接收url地址传参或表单传参 | 接收路径参数,使用{参数名称}描述路径参数 | 用于为Mapper接口方法的参数命名,使得在XML映射文件中可以更容易地引用这些参数 |
应用得多 | 非json数据 | restful开发只有一个参数的时候,传递id值 | |
例如:@RequestMapping("/example") public String example(@RequestBody Person person) ,其中Person是一个Java对象,表示请求体中的JSON数据结构。 |
例如:RequestMapping("/example/{id}") public String example(@PathVariable Long id) |
54、之所以不让mvc扫描重复的包是因为会导致事务失效
56、controller是spring的注解
@RequestBody | @ResponseBody |
形参注解 | 方法注解 |
接收客户端传递的json数据,不要使用get请求 | 返回json数据 |
流程
(1)导入jackson包
com.alibaba
fastjson
1.2.83
优化方法
注意命名空间
这样写的话框架会帮我们转
这样传会报错,因为前端传递的是String,你却用Date去接受了
@PostMapping("/login")
public String login(Date date){
return "login";
}
@DateTimeFormat(pattern = "yyyy-MM-dd") Date date
public Integer register(@RequestBody Brand brand){
实体类里面
@JsonFormat(pattern = "yyyy-MM-dd")
private Date createDate;
注意:@JsonFormat(pattern = "yyyy-MM-dd")优先级高于全局