目录


- <dependencies>
-
- <dependency>
- <groupId>javax.servletgroupId>
- <artifactId>javax.servlet-apiartifactId>
- <version>3.1.0version>
- <scope>providedscope>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webmvcartifactId>
- <version>5.2.10.RELEASEversion>
- dependency>
-
- dependencies>
- @Configuration
- @ComponentScan("com.itheima.controller")
- public class SpringMVCConfig {
- }
- @Controller
- public class BookController {
-
- @RequestMapping("/save")
- //将返回的数据转为json格式
- @ResponseBody
- public String save(){
- System.out.println("save run ..");
- return "{'ADASD':'454'}";
- }
- }
-
- //定义一个Servlet容器启动的配置类,在里面加载spring的配置
- public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
- //创建Servlet容器时,初始化Web容器
- @Override
- protected WebApplicationContext createServletApplicationContext() {
- AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
- ctx.register(SpringMVCConfig.class);
- return ctx;
- }
-
- //设置哪些请求归属springMVC管理
- @Override
- protected String[] getServletMappings() {
- return new String[]{"/"};
- }
- @Override
- protected WebApplicationContext createRootApplicationContext() {
- return null;
- }
- }

由于SpringMVC只控制controller层的bean,而Spring在进行包扫描时又会加载到controller层的bean,所以在Spring中要修改包扫描的方式

- @Configuration
- //扫描包中的bean但是排除扫描注解类型的包Controller
- @ComponentScan(value = "com.itheima",
- excludeFilters = @ComponentScan.Filter(
- type = FilterType.ANNOTATION,
- classes = Controller.class
- )
- )
- public class SpringConfig {
- }


- public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
-
- protected Class>[] getRootConfigClasses() {
- //springmvc容器
- return new Class[]{SpringMVCConfig.class};
- }
-
- protected Class>[] getServletConfigClasses() {
- //spring容器
- return new Class[]{SpringConfig.class};
- }
-
- protected String[] getServletMappings() {
- return new String[]{"/"};
- }
- }

- @Controller
- public class BookController {
-
- @RequestMapping("/save")
- @ResponseBody
-
- //声明入参接收前端数据,请求参数的名称必须匹配
- public String save(String name){
- System.out.println("save run .." + name);
- return "{'ADASD':'454'}";
- }
- }
方法参数内部使用了@RequestParam注解将请求参数名称与方法参数名称绑定








要在集合参数前加上@RequestParam注解,将传递的数据作为集合的参数,否则会自动将这个List
作为一个pojo,创建这个pojo的对象,而list是接口不能创建对象,会报错


-
- @RequestMapping("/json")
- @ResponseBody
- //将前端传递的json参数转为pojo对象
- public String json(@RequestBody List
likes) { - System.out.println(likes);
- return "{'ADASD':'454'}";
- }









类型转换内部实现HttpMessageConverter接口









使用@PathVariable注解获取路径中的参数,@GetMapping("/{id}")表示以get方式提交路径参数为id的数据,通过@PathVariable获取这个数据

SpringMVC配置类
- @Configuration
- @ComponentScan("com.itheima")
- //开启json转对象的功能
- @EnableWebMvc
- public class SpringMVCConfig {
- }
Servlet容器
- public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
-
- protected Class>[] getRootConfigClasses() {
- //springmvc容器
- return new Class[]{SpringMVCConfig.class};
- }
-
- protected Class>[] getServletConfigClasses() {
- //spring容器
- return new Class[0];
- }
-
- protected String[] getServletMappings() {
- return new String[]{"/"};
- }
-
- //处理前端传递数据乱码
- @Override
- protected Filter[] getServletFilters() {
- CharacterEncodingFilter filter = new CharacterEncodingFilter();
- filter.setEncoding("UTF-8");
- return new Filter[]{filter};
- }
- }
controller接口
- @RestController
- @RequestMapping("/books")
- public class BookController {
-
- @PostMapping
- public String save(@RequestBody Book book){
- System.out.println(book);
- return "{save..run}";
- }
-
- @GetMapping
- public List
getAll(){ - List
listBook = new ArrayList(); -
- Book book = new Book("计算机","SpringMVC入门","一代宗师");
- Book book2 = new Book("法学","Spring入门","一代宗师");
- listBook.add(book);
- listBook.add(book2);
-
- return listBook;
- }
-
- }
使用postman测试接口
post请求

Get请求

由于所有路径为"/"的数据都被mvc拦截,所以需要对其他静态页面的路径进行放行,记得添加@Configuration,并在SpringMVCConfig中扫描到这个配置类
- @Configuration
- public class SpringMVCSupport extends WebMvcConfigurationSupport {
-
- @Override
- protected void addResourceHandlers(ResourceHandlerRegistry registry) {
- //当访问/pages/**这个路径时不被mvc拦截,直接访问/pages/下的文件
- registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
- registry.addResourceHandler("/js/**").addResourceLocations("/js/");
- registry.addResourceHandler("/css/**").addResourceLocations("/css/");
- registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
- }
- }

由于前后端交互,后端向前端发送数据库操作的信息并返回,这时需要与前端进行传递数据的约定,将不同的结果封装成msg对象。






- //定义异常处理器
- //为Rest风格开发的控制器类做增强
- @RestControllerAdvice
- public class ProjectExceptionAdvice {
- //定义当前处理器拦截哪种异常
- @ExceptionHandler(Exception.class)
- public Result doException(Exception ex){
- return new Result(555,"后台出异常了",null);
- }
- }

浏览器访问的过程:浏览器先通过路径向tomacat服务器发送请求,静态资源可以直接访问,动态资源需要先通过过滤器进去Spring中的中央控制器,再由中央控制器根据路径分配不同的Controller,再由这个Controller返回给页面

现在需要加上新的业务,在Controller的执行前后都做一些固定的事情,比如权限校验,是否有权限调用这个Controller,拦截器就能够实现这个方法。


