• SpringMvc(一)-初识


    1、环境搭建

    1.1 jar包

    4.3.18.RELEASE
    
    
    
        org.springframework
        spring-web
        ${spring.version}
    
    
    
        org.springframework
        spring-webmvc
        ${spring.version}
    
    

    1.2 web.xml

    • 前端核心控制器(dispatcherServlet)

      • 配置初始化参数,指定springMvc的核心配置文件, 目的 就是 自动创建容器对象
      • 启动级别 1
    • Rest风格 请求转换过滤器

    
    
    
        
        
            dispatcherServlet
            org.springframework.web.servlet.DispatcherServlet
            
            
                contextConfigLocation
                classpath:spring-mvc.xml
            
            
            1
        
    
        
            dispatcherServlet
            
            /
        
    
        
        
            hiddenHttpMethodFilter
            org.springframework.web.filter.HiddenHttpMethodFilter
        
        
            hiddenHttpMethodFilter
            /*
        
    
    

    1.3spring-mvc.xml

    • 组件扫描
    • 视图解析器
    
    
    
        
        
    
        
        
        
            
            
            
            
        
    
    

    2、Mvc 使用流程

    需求,浏览器发送请求helloMvc,请求后端处理方法,返回目标success。jsp页面,并在页面中显示 Hello Mvc in KH96;

    2.1 HelloMvcController

    @Controller //不可以用其他的分层注解替换,只能用controller  (1.可以作为一个控制层组件扫描到容器  2.代表一个控制器)
    public class HelloMvcController {
    
        //接收helloMvc,跳转到目标success.jsp
        @RequestMapping("/helloMvc") //定义当前请求控制器中,可以处理请求的映射url字符串,前面的 / 可写 可不写
        public String helloSpringMvc(){
            System.out.println("------ 调用 HelloMvcController控制器的 helloSpringMvc() 请求处理方法------");
    
            //目标jsp视图页面的名称(不带后缀),区分大小写
            return "success";
        }
    }

    2.2 success.jsp

    webapp/WEB-INF/views/ success.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        成功页面
    
    
        

    KH96 Success Page

    2.3 测试

    2.4 总结

    springMvc使用流程小结:

    • 1、Tomcat服务器 启动时 ,自动创建前端核心控制器的实例- DispatcherServlet ,同时自动 读取 配置的 spring-mvc.xml 核心配置文件, 创建容器 对象,并 扫描组件 加入到容器中;
      • 即:将控**制器组件**(加了@Controller注解)**加入到容器中**,并**自动解析**加入的**请求控制器**,可以得到**请求处理url**和**请求处理方法**的**映射**;
    • 2、客户端浏览器,**发送请求**:http://localhost:8080/springmvc-01/helloMvc
    • 3、请求会被 **前端核心控制器** **拦截**(匹配到**前端核心控制器**的**url-pattern**)
    • 4、**前端核心控制器** ,自动根据请求**url和请求处理方法的映射关系**,进行**映射查找**,如果**找到了**对应关系,自动将**当前请求**发送**给目标请求处理器**的请求处理方法,进行业务处理,如果**没有找到**,直接**报错误404**;
    • 5、目标请求处理方法,处理完业务后,**返回**一个目标**视图的名称**-success
    • 6、返回的目标视图名称,仍然会 交给 前端核心控制器 进行 视图解析 (自动调用容器中添加的视图解析器解析),会 得到 一个 真实的目标物理视图页面 (要跳转的真实页面),进行响应 跳转目标页面 给浏览器显示;

    3、@RequestMapping

    3.1 @RequestMapping可以写的位置

    类上和 方法上 :

    • 类上:相对于 web应用根目录 的;

    • 方法上:相对于 类上的映射 ,如果 类上没有 ,就是 相对于web应用根目录 ;

    3.1.1 只用方法上有

    @RequestMapping("/testSpringMvcRequestMappingTarget")
    public String testMvcRequestMappingTarget(){
        //返回成功页面
        return "hello";
    }

    测试

    3.1.2 类上 和 方法上都有

    @Controller
    @RequestMapping("/kh96")
    public class SpringMvcController {
    
        @RequestMapping("/testSpringMvcRequestMappingTarget")
        public String testMvcRequestMappingTarget(){
            //返回成功页面
            return "hello";
        }
        
    }

    测试

    3.2 method属性

    • 作用: 指定 当前请求处理方法的 请求方式 ;

    • 一旦指定了请求方式,就 只能使用 指定的请求方式,才可以映射处理, 不指定 ,自动适配( 所有方式都可以 );

    • method 属性可以 指定多个请求方式 ;

    3.2.1 method = RequestMethod.GET

    @RequestMapping(value = "/testSpringMvcRequestMappingMethodGet",method = RequestMethod.GET)
    public String testSpringMvcRequestMappingMethodGet(){
    
        System.out.println("----- @RequestMapping method = RequestMethod.GET ------");
    
        //返回成功页面
        return "hello";
    }

    使用PostMan测试

    Get测试

    Post测试

    3.2.2 method = RequestMethod.POST

    @RequestMapping(value = "/testSpringMvcRequestMappingMethodPost",method = RequestMethod.POST)
    public String testSpringMvcRequestMappingMethodPost(){
    
        System.out.println("----- @RequestMapping method = RequestMethod.Post ------");
    
        //返回成功页面
        return "hello";
    }

    Get测试

    Post测试

    3.2.3 method = {RequestMethod.GET,RequestMethod.POST})

    @RequestMapping(value = "/testSpringMvcRequestMappingMethodGetAndPost",method = {RequestMethod.GET,RequestMethod.POST})
    public String testSpringMvcRequestMappingMethodGetAndPost(){
    
        System.out.println("----- @RequestMapping method = RequestMethod.Post ------");
    
        //返回成功页面
        return "hello";
    }

    Get测试

    Post测试

    3.3 params属性

    指定当前请求处理方法对于请求, 必要携带的参数 :

    • 写法1: 指定 当前请求必须携带的 参数名 , 没有参数值 ,可以指定多个(大括号,逗号分割),如果请求 没有携带params的所有参数 ,请求 404;
    • 写法2: 指定 当前请求必须携带的 参数名 和 对应的参数值 ,可以指定多个(大括号,逗号分割),如果请求 没有携带params指定的所有参数 , 请求404 ,如果请求携带的参数及对应的参数值不匹配,请求404;
      • 注意:携带的参数值必须是指定的参数值
    • 总结, 必须携带所有 的 参数 ,如果 有指定参数值 , 必须携带参数值 且携带的 参数值必须一致 ;

    3.3.1 params ={"uname"}

    指定一个参数,不指定参数值;

    @RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname"} )
    public String testSpringMvcRequestMappingParams(){
    
        System.out.println("----- @RequestMapping 属性 params------");
    
        //返回成功页面
        return "hello";
    }

    测试,不带参数

    测试,带参数,不带值

    测试,带参数,带值

    3.3.2 params ={"uname=kh96"}

    指定一个参数,指定值;

    @RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname=kh96"} )
    public String testSpringMvcRequestMappingParams(){
    
        System.out.println("----- @RequestMapping 属性 params------");
    
        //返回成功页面
        return "hello";
    }

    测试,带参数,带值,值不匹配

    测试,带参数,带值,值匹配

    3.3.3 params ={"uname=kh96","upwd=123"}

    指定两个参数,并指定值;

    @RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname=kh96","upwd=123"})
    public String testSpringMvcRequestMappingParams(){
    
        System.out.println("----- @RequestMapping 属性 params------");
    
        //返回成功页面
        return "hello";
    }

    测试,带一个参数,并指定值

    测试,带两个参数,并指定第一个值

    测试,带两个参数,并指定第两个值

    3.4 headers属性

    指定当前请求处理方法对于请求,必要携带的请求头参数,用法和params类似,参数位置不同;

    @RequestMapping(value = "/testSpringMvcRequestMappingHeaders",headers = {"token=123"})
    public String testSpringMvcRequestMappingHeaders(){
    
        System.out.println("----- @RequestMapping 属性 headers------");
    
        //返回成功页面
        return "hello";
    }

    测试,主要观察参数位置,其他参数规则跟params一致

    3.5 @RequestMapping + @PathVariable

    请求映射注解:参数占位符注解 @PathVariable:

    • 写法: 只能携带 请求处理方法的形参中,自动将RequestMapping中 指定的 url使用的 占位符绑定参数值 ,
      • 即:请求地址映射为: /url/{参数名},目标请求为:/url/参数值, 自动 将参数值 绑定到指定参数名上;
    • 要求1:@RequestMapping("指定参数名")注解请求url中,指定的 占位符参数名 , 必须跟 当前请求方法 形参中@PathVariable注解指定的参数名一致 ;否者报错: Could not find @PathVariable [utel] in @RequestMapping
    • 要求2:@RequestMapping,只写注解, 不指定参数名 ,指定的占位符参数名, 必须跟 当前请求方法 形参名一致 (也就是默认为形参名);否则,报错:Could not find @PathVariable [uemail] in @RequestMapping

    3.5.1 测试

    3.5.1.1 占位符与@PathVariable注解指定的参数名不一致

    @RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel#}/{uemail}")
    public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable("uemail") String uemail){
    
        System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");
    
        //返回成功页面
        return "hello";
    }

    测试结果

    3.5.1.2 占位符与@PathVariable注解指定的参数名一致

    @RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail}")
    public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable("uemail") String uemail){
    
        System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");
    
        //返回成功页面
        return "hello";
    }

    测试结果

    3.5.1.3 @PathVariable不指定参数名

    测试,占位符与形参不一致

    @RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail#}")
    public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable String uemail){
    
        System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");
    
        //返回成功页面
        return "hello";
    }

    测试结果

    测试,占位符与形参一致

    @RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail}")
    public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable String uemail){
    
        System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");
    
        //返回成功页面
        return "hello";
    }

    测试结果

    4.Rest风格

    • get------查询select
    • post------新增insert
    • put------更新update
    • delete------删除delete

    相同的 请求路径 ,通过 请求方式 判断 请求方法 ;

    自定义请求方式,一定要带一个名字为 _method的参数 ;

    4.1 Rest风格 请求转换过滤器

    
    
        hiddenHttpMethodFilter
        org.springframework.web.filter.HiddenHttpMethodFilter
    
    
        hiddenHttpMethodFilter
        /*
    

    4.1 get------查询 select

    请求方法

    //请求映射注解:rest风格处理-get,查询select
    //@RequestMapping(value = "/testSpringMvcRequestMappingRestGet/{uid}",method = RequestMethod.GET)
    @RequestMapping(value = "/testSpringMvcRequestMappingRest/{uid}",method = RequestMethod.GET)
    public String testSpringMvcRequestMappingRestGet(@PathVariable("uid") String uid){
    
        System.out.println("----- Rest Get 根据 uid:"+uid+" 查询用户详情 ------");
    
        //返回成功页面
        return "hello";
    }

    jsp

    Get 请求映射注解:rest风格处理-get,查询select

    Test SpringMvc Rest Get

    测试

    4.2post------新增 insert

    //请求映射注解:rest风格处理-post,新增insert
    //@RequestMapping(value = "/testSpringMvcRequestMappingRestPost",method = RequestMethod.POST)
    @RequestMapping(value = "/testSpringMvcRequestMappingRest",method = RequestMethod.POST)
    public String testSpringMvcRequestMappingRestPost(){
    
        System.out.println("----- Rest Post 新增用户详情  ------");
    
        //返回成功页面
        return "hello";
    }

    jsp

    Post 求映射注解:rest风格处理-post,新增insert

    测试

    4.3 put------更新 update

    //请求映射注解:rest风格处理-put,更新update
    //@RequestMapping(value = "/testSpringMvcRequestMappingRestPut",method = RequestMethod.PUT)
    @RequestMapping(value = "/testSpringMvcRequestMappingRest",method = RequestMethod.PUT)
    public String testSpringMvcRequestMappingRestPut(){
    
        System.out.println("----- Rest Put 更新用户详情 ------");
    
        //返回成功页面
        return "hello";
    }

    jsp

    Put 请求映射注解:rest风格处理-put,更新update

    测试

    4.4 delete------删除 delete

    //请求映射注解:rest风格处理-delete,删除delete
    //@RequestMapping(value = "/testSpringMvcRequestMappingRestDelete/{uid}",method = RequestMethod.DELETE)
    @RequestMapping(value = "/testSpringMvcRequestMappingRest/{uid}",method = RequestMethod.DELETE)
    public String testSpringMvcRequestMappingRestDelete(@PathVariable("uid") String uid){
    
        System.out.println("----- Rest Delete 根据 uid:"+uid+" 删除用户  ------");
    
        //返回成功页面
        return "hello";
    }

    jsp

    Delete 请求映射注解:rest风格处理-delete,删除delete

    测试

  • 相关阅读:
    【Leetcode刷题Python】416. 分割等和子集
    02 DevOps 之 Jenkins
    带有 URL 的 useState:如何使用 useSearchParams 保持状态
    Socks5 与 HTTP 代理在网络安全中的应用
    德尔菲技术是什么意思?如何使用?
    [17] 使用Opencv_CUDA 进行滤波操作
    广西建筑模板的材质类型和特点有哪些?
    Unity IL2CPP 游戏分析入门
    2310C++构造对象
    PostgreSQL的学习心得和知识总结(一百一十)|深入理解PostgreSQL数据库 日志格式jsonlog 的使用场景和实现原理
  • 原文地址:https://blog.csdn.net/m0_73257876/article/details/126673796