SpringMVC(Servlet封装)01

2024-06-25 1356阅读

1、执行流程

SpringMVC(Servlet封装)01

1、进行表现层开发

2、XML流程

(1)导入依赖

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

SpringMVC(Servlet封装)01

ioc的



    

mvc的


    
    
    
    
    
    
        
        
            
            
            
        
    
    
    


    


        
        
    
    


    

注意:是这个命名空间

SpringMVC(Servlet封装)01

(3)配置web.xml文件

SpringMVC(Servlet封装)01


  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

6、 (spirng-mvc里面)

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

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

mvc是web容器,比ioc高一级

SpringMVC(Servlet封装)01

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

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

8、@Controller注解  类注解

设定核心控制器bean

SpringMVC(Servlet封装)01

9、@RequestMapping  类、方法注解

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

SpringMVC(Servlet封装)01

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、创建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

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

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

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

SpringMVC(Servlet封装)01

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

SpringMVC(Servlet封装)01

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

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

    (1)方式一的实现:

    SpringMVC(Servlet封装)01

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

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

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

    SpringMVC(Servlet封装)01

    SpringMVC(Servlet封装)01

    调用的时候选择对应的

    SpringMVC(Servlet封装)01

    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

    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

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

    SpringMVC(Servlet封装)01

    SpringMVC(Servlet封装)01

    (4)接收json数据

    SpringMVC(Servlet封装)01

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

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

    非法

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

    ​​​​​​​

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

    SpringMVC(Servlet封装)01

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

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

    ​​​​​​​

    48、rest风格

    ​​​​​​​​​​​​​​SpringMVC(Servlet封装)0149、rest风格书写规范

    SpringMVC(Servlet封装)01

     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

    53、默认找前端jsp,以为要做转发SpringMVC(Servlet封装)01

    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里配消息转换器

    
        
    
        
            
                
                    
    
                    
                
            
        
    
        
            
        
    

    优化方法

    
        
    
        
            
                
                    
    
                    
                        
                        
                            
                        
                    
                
            
        
    

     注意命名空间

    SpringMVC(Servlet封装)01

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

    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")优先级高于全局

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]