SpringMVC(Servlet封装)01

1、执行流程

1、进行表现层开发

2、XML流程

(1)导入依赖

(2)写spring-ioc.xml、spring-mvc.xml配置

SpringMVC(Servlet封装)01_第1张图片

ioc的





    

mvc的




    
    
    
    

    
    
        
        
            
            
            
        
    
    
    



    


        
        
    

    


    

注意:是这个命名空间

SpringMVC(Servlet封装)01_第2张图片

(3)配置web.xml文件

SpringMVC(Servlet封装)01_第3张图片




  Archetype Created Web Application

  
    dispatcherServlet
    org.springframework.web.servlet.DispatcherServlet


    
      contextConfigLocation
      classpath:spring-mvc.xml
    
  


  

    dispatcherServlet

    /
  

(4)创建controller类

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"; } }

3、注解流程

(1)导入依赖

(2)初始化SpringMvc环境,设置springMvc加载对应的bean

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 {

}

//todo 还有spring的

(3)初始化serlvet容器,加载springMVc环境,并设置springMvc技术处理的请求

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[]{"/"};
    }

}

 (4)创建controller类(相当于servlet)


/**
 * 使用@Controller定义Bean
 */
@Controller
public class UserController {

    //设置当前操作的访问路径
    @RequestMapping("/save")
    //设置当前操作的返回值类型
    @ResponseBody
    public String save(){
        System.out.println("user save...");
        return "{'module':'springmvc'}";
    }
}

4、classpath和classpath*区别

    主要区别在于搜索范围。classpath只搜索指定的目录和JAR文件,而classpath*会搜索整个类路径,包括子目录和JAR文件。

5、从上往下依次是,请求行,请求头,请求体

SpringMVC(Servlet封装)01_第4张图片

6、 (spirng-mvc里面)

springmvc对内置注解的支持,比如json数据

7、spring-mvc和spring-ioc是不同的容器,

mvc是web容器,比ioc高一级

SpringMVC(Servlet封装)01_第5张图片

7、现在一个controller类就是一个模块(比如用户模块),然后类里面一个方法对应一个功能

8、配置了内置的diapatchServlet之后,tomcat会帮我们创建这个servlet,然后去加载spring mvc.xml那些配置文件

8、@Controller注解  类注解

设定核心控制器bean

SpringMVC(Servlet封装)01_第6张图片

9、@RequestMapping  类、方法注解

设置当前控制器方法请求路径

SpringMVC(Servlet封装)01_第7张图片

10、@ResponseBody 方法注解,返回json数据

11、@RestController(默认全部返回json数据)

= Controller+ResponseBody、@Controller 默认表示前后端不分离

        结合了@Controller和@ResponseBody两个注解的功能,使得该类能够处理HTTP请求并返回JSON格式的响应

        RestController返回的是JSON数据。RestController注解是Spring4之后新加的注解,它的作用是返回json格式的数据。这个注解实际上是@Controller和@ResponseBody两者的结合,使用这个注解后该controller的所有方法都会返回json格式的数据。因为@ResponseBody的作用就是把返回的对象转换为json格式,并把json数据写入response的body中,前台收到response时就可以获取其body中的json数据了。

7、总结(注解)

SpringMVC(Servlet封装)01_第8张图片

8、创建springMvc的配置文件,加载controller对应的bean(注解)

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 {
}

9、定义一个servlet容器启动的配置类,在里面加载spring的配置(注解)

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;
    }
}

10、服务器启动执行流程

 SpringMVC(Servlet封装)01_第9张图片

11、requestMapping里面的method方法指定接收请求的方式

12、Qo包里面的UserQo那种就是专门给controller那边写传递参数的

13、String.format()按照指定的格式生成字符串

14、不用去new对象,拿来直接用,类似于方法调用

SpringMVC(Servlet封装)01_第10张图片

15、传递的参数里面一般不传递那些Map、List(可以封装成对象)

16、RequestMapping请求处理的细分,分别处理不同的请求

GetMapping增

DeleteMapping删

PutMapping改

PostMapping查

17、ObjectUtils.isEmpty()非空判断

18、@RequestParam 方法注解(参数设置必传参数)

required 设置必要参数(默认true)
value 起别名
defaultValue 设置默认值

19、用springboot自带的json数据可以避免乱码问题(序列化框架)

20、@RequestBody接收json数据

接收客户端传递的json数据,不要使用get请求

  告诉Spring MVC从请求体中解析JSON(或其他格式的数据)并将其映射到 UserQo 类型的对象

 @PostMapping("/json")
    public String testJson(@RequestBody UserQo userQo){
        System.out.println(userQo.getUsername());
        return "测试接收json数据";
    }

21、复杂对象尽量使用json格式

21、传递的是引用类型对象的话传参数就传他的属性就行(多级就属性.属性)​​​​​​​

22、传数组的时候就这样传

SpringMVC(Servlet封装)01_第11张图片

24、//*区别

        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。)

注意:

  • 仅仅只能拦截处理主页请求:

  • 什么请求都不能拦截处理,相当于没有设置:
  • /**

25、@PathVariable注解:用于从URL模板中获取变量的值

@GetMapping("/path/{page1}/{size}")
    public String testPath(@PathVariable(name = "page1") Integer page,@PathVariable Integer size){
        System.out.println(page);
        System.out.println(size);
        return "从请求路径中获取参数";
    }

26、@ReqeustMapping核心注解功能(方法注解,类注解)

(1)作用:设置当前控制器方法的请求访问路径

作用:全局异常处理、统一结果集、跨域请求(浏览器安全机制)、参数校验

(1)核心属性

value/path 声音请求路径(如果在类上,表示所有请求的前缀)
method 请求方式(默认get,只能用于修饰方法)

(2)其他属性(限制请求的参数)

prams 设置请求参数必须包含指定的内容,格式
headers 限制请求头中的参数
consumes 限制ContentType的内容
produces 限制Accept内容

29、推荐三个以上的参数封装成对象类型,作为控制层和业务的入口参数

30、常见的JSON序列化框架

  1. (1)fastjson

    1. 在Spring MVC中启用FastJson作为HTTP消息的转换器。
    2. 配置FastJson的日期格式为"yyyy-MM-dd HH:mm:ss"
  2. 
        
            
                
                
                    
                        
                    
                
            
        
    
  3. (2)jackjson(多)

  4. 
    
    
        
        
        
        
    
        
        
            
            
                
                
                
            
        
       
    
  5. (3)gson

31、spring相关的bean加载控制(注解)SpringMVC(Servlet封装)01_第12张图片

(1)方式一的实现:

SpringMVC(Servlet封装)01_第13张图片

注意:如果写了@Configuration,那么这个类也会被扫描同时里面的bean也会被加载

注意:这里的configuration必须取消掉,不然也会扫描到SpringMVC(Servlet封装)01_第14张图片 

(2)方式二:区分开@ComponentScan({"com.qf.service","com.qf.dao"})

SpringMVC(Servlet封装)01_第15张图片

SpringMVC(Servlet封装)01_第16张图片

调用的时候选择对应的

34、@RequestMapping默认使用GET请求方法,但是可接收所有请求方法

35、解决post乱码问题(注解)

//解决post乱码问题
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};

    }

SpringMVC(Servlet封装)01_第17张图片

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};

    }
}

 

37、@Requestparam注解:

绑定请求参数与处理器方法形参间的关系

38、接收请求中的json数据(注解版本)

(1)导入jackson依赖

(2)设置发送json数据

SpringMVC(Servlet封装)01_第18张图片

(3)开启自动转换数据的支持

SpringMVC(Servlet封装)01_第19张图片

(4)接收json数据

SpringMVC(Servlet封装)01_第20张图片

39、@EnableWebMvc配置类注解:开启自动转换数据的支持(注解)

40、@RequestBody(形参注解):从前端接收json数据(一个处理器方法只能使用一次)

非法

@RequestMapping("/some-endpoint")  
public ResponseEntity handleRequest(@RequestBody MyObject obj1, @RequestBody MyObject obj2) {  
    // ...  
}

​​​​​​​

43、convert接口(转换格式:注解版)

SpringMVC(Servlet封装)01_第21张图片

45、在controller下面如果不写responsebody默认去找对应名字的前端界面

  @RequestMapping("/toJumpPage")
    public String toJumpPage(){
        System.out.println("跳转页面");
        return "page.jsp";
    }

​​​​​​​

48、rest风格

​​​​​​​​​​​​​​SpringMVC(Servlet封装)01_第22张图片49、rest风格书写规范

SpringMVC(Servlet封装)01_第23张图片

 50、@PathVariable 形参注解

绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应​​​​​​​

51、@RequestBody、@RequestParam、@PathVariable、@Param区别(形参注解)

@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)

52、查看自己写的sql语句

SpringMVC(Servlet封装)01_第24张图片

53、默认找前端jsp,以为要做转发SpringMVC(Servlet封装)01_第25张图片

54、之所以不让mvc扫描重复的包是因为会导致事务失效

56、controller是spring的注解

57、@RequestBody和@ResponseBody

@RequestBody @ResponseBody
形参注解 方法注解
接收客户端传递的json数据,不要使用get请求 返回json数据

57、fastjson、json、gson都是作json数据的解析的(序列化和反序列化)

58、处理json数据需要序列化框架

流程

(1)导入jackson包

59、使用fastjson需要配置消息转换器+配置json解析的时间格式(spring-mvc.xml)

(1)导包


    
      com.alibaba
      fastjson
      1.2.83
    

(2)在spring-mvc.xml里配消息转换器




    

    
        
            
                

                

            
        
    


    
        
    

优化方法




    

    
        
            
                

                
                    
                    
                        
                    
                

            
        
    


 注意命名空间

这样写的话框架会帮我们转

60、时间格式问题

这样传会报错,因为前端传递的是String,你却用Date去接受了

 @PostMapping("/login")
    public String login(Date date){
        return "login";
    }

61、使用jackson指定日期时间格式(多)




    

    
        

             
                 
                     

                         
                     
                 
             
        
    


62、返回json数据前提是一定要加入json框架,配合@RestController(默认全部返回json)使用

63、在时间配置的时候(前端传递的都是String类型)

请求方面:

(1)传递的是单Date类型的话,就加上@DateTimeFormat(pattern = "yyyy-MM-dd"),他就会转为Date类型在后端controller

@DateTimeFormat(pattern = "yyyy-MM-dd") Date date

(2)不传json的话,

响应那里就必须在接收的属性那里转@DateTimeFormat(pattern = "yyyy-MM-dd")

(3)传递的是对象类型的话,就这样json传(使用@RequestBody注解,必须配合序列化框架使用)(多),

然后响应再做处理 @JsonFormat(pattern = "yyyy-MM-dd")/全局

public Integer register(@RequestBody Brand brand){

响应方面:

(1)可以单属性的配置@JsonFormat(pattern = "yyyy-MM-dd")

实体类里面

@JsonFormat(pattern = "yyyy-MM-dd")
private Date createDate;

(2)可以配置全局转json的




    

    
        

             
                 
                     

                         
                     
                 
             
        
    


注意:@JsonFormat(pattern = "yyyy-MM-dd")优先级高于全局

你可能感兴趣的:(java)