jjzjj

SpringMvc(一)-初识

xiaoqigui 2023-04-16 原文

1、环境搭建

1.1 jar包

<spring.version>4.3.18.RELEASE</spring.version>

<!-- spring-mvc begin -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>
<!-- spring-mvc end -->

1.2 web.xml

  • 前端核心控制器(dispatcherServlet)

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

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         id="WebApp_ID" version="3.1">

    <!--前端核心控制器  springMvc框架提供的 -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置初始化参数,指定springMvc的核心配置文件,目的就是自动创建容器对象 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!-- web容器启动,优先创建前端核心控制器实例对象 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <!-- 拦截所有的请求处理,放行jsp -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- Rest风格 请求转换过滤器-->
    <filter>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

1.3spring-mvc.xml

  • 组件扫描
  • 视图解析器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 组件扫描 -->
    <context:component-scan base-package="com.kgc.mvc"></context:component-scan>

    <!-- jsp 视图解析器 -->
    <!-- 作用:当请求处理方法返回一个目标视图页面的名称,视图解析器会自动将返回的视图名称解析为真实的物理视图(prefix + 目标视图页面名称 + suffix) -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 统一前缀,请求处理方法返回目标视图名称时,会被统一增加此前缀目录(目录视图目录),结尾的 / 不能少 -->
        <property name="prefix" value="/WEB-INF/views/"></property>
        <!-- 统一后缀,请求处理方法返回目标视图名称时,会被统一增加此后缀 -->
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

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" %>
<html>
<head>
    <title>成功页面</title>
</head>
<body>
    <h2>KH96 Success Page</h2>
</body>
</html>

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 =

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

@RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname"} )
public String testSpringMvcRequestMappingParams(){

    System.out.println("----- @RequestMapping 属性 params------");

    //返回成功页面
    return "hello";
}

测试,不带参数

测试,带参数,不带值

测试,带参数,带值

3.3.2 params =

指定一个参数,指定值;

@RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname=kh96"} )
public String testSpringMvcRequestMappingParams(){

    System.out.println("----- @RequestMapping 属性 params------");

    //返回成功页面
    return "hello";
}

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

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

3.3.3 params =

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

@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风格 请求转换过滤器

<!-- Rest风格 请求转换过滤器-->
<filter>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

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

<h3>Get 请求映射注解:rest风格处理-get,查询select</h3>
<h3><a href="${pageContext.request.contextPath}/testSpringMvcRequestMappingRest/KH96_01">Test SpringMvc Rest Get</a> </h3>

测试

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

<h3>Post 求映射注解:rest风格处理-post,新增insert</h3>
<form action="testSpringMvcRequestMappingRest" method="post">
    <input type="submit" value="Test SpringMvc Rest Post">
</form>

测试

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

<h3>Put 请求映射注解:rest风格处理-put,更新update</h3>
<form action="testSpringMvcRequestMappingRest" method="post">
    <input type="hidden" name="_method" value="put">
    <input type="submit" value="Test SpringMvc Rest put">
</form>

测试

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

<h3>Delete 请求映射注解:rest风格处理-delete,删除delete</h3>
<form action="testSpringMvcRequestMappingRest/KH96_01" method="post">
    <input type="hidden" name="_method" value="delete">
    <input type="submit" value="Test SpringMvc Rest delete">
</form>

测试

有关SpringMvc(一)-初识的更多相关文章

  1. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

  2. 【Linux】初识Linux --指令Ⅰ - 2

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法,Linux…感兴趣就关注我吧!你定不会失望。目录1.ls显示当前目录下的文件内内容2.pwd-显示用户当前所在的目录3.cd-改变工作目录。将当前工作目录改变到指定的目录下1.cd-回到上一次待的工作空间2.cd..返回上一层目录1.相对路径:cd../aurora2.绝对路径:cd/home/aurora/lesson1/aurora3.cd~进入用户家目录4.cd/进入root目录4.mkdir-新建目录5.rmdir/rm-删除1.rmdir删除空文件夹2.rm删除1.rm-f2.rm-i3.rm-r1.ls显示当前目

  3. SpringMVC的数据响应(一) - 2

    4.SpringMVC的数据响应4.1.SpringMVC的数据响应方式(理解)1.页面跳转直接返回字符串通过ModelAndView对象返回2.回写数据直接返回字符串(解析json数据)返回对象或集合4.2.SpringMVC的数据响应-页面跳转-返回字符串形式(应用)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OxdfClO3-1671702092565)(C:\Users\紫轩蝶泪\AppData\Roaming\Typora\typora-user-images\image-20220916113108020.png)]WEB-INF是受饱保护的文件夹

  4. gtest初识 - googletest(一) - 2

    gtest是Google开发的一个开源单元测试框架,代码提供丰富的注释和实例,参考实际用例可以很快上手基本单元测试,丰富的代码注释能够让有兴趣的开发者深入了解gtest的代码结构并做部分针对性的二次开发。gtest主要针对c/c++提供了针对函数接口和类方法丰富测试方法,针对单元测试特有的数据或者代码反复编写的这种特性做了集成和优化,满足当前绝大部分对于单元测试的需求。其有如下特点:自动收集测试用例,无需开发者再次组织提供强大的断言集,支持包括布尔、整型、浮点型、字符串等。提供断言方法自定义扩展提供死亡测试功能使用参数化自动生成多个相似的测试用例可以将公共的用例初始化和清理工作放入测试夹具中,

  5. 鸿蒙HarmonyOS开发环境初识及搭建 - 2

    一鸿蒙简介HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备,提供全场景(移动办公、运动健康、社交通信、媒体娱乐等)业务能力。HarmonyOS提供了支持多种开发语言的API,供开发者进行应用开发。支持的开发语言包括Java、XML(ExtensibleMarkupLanguage)、C/C++、JS(JavaScript)、CSS(CascadingStyleSheets)和HML(HarmonyOSMarkupLan

  6. javascript - Java/SpringMVC/Maven元素的缓存清除机制 - 2

    关于我正在使用的应用程序的一些背景知识:SpringMVC、JavaEEWeb应用程序、Maven。基本上,我正在寻找的是一种在每次部署我们的应用程序时刷新所有JS和CSS文件的机制。就目前而言,应用程序正在引用静态文件(例如“js/app.js”)。每次这个文件有变化,在本地重新部署后,当浏览器去下载它时,我们会得到一个304(文件没有被修改)。我的问题是:1)在重新部署应用程序时再次提供这些文件并使用应用程序版本作为缓存清除机制(例如“js/v1.0.0/app.js”)会更好吗?这可以通过servlet过滤器来完成。2)由于该元素是一个Maven动态Web元素,是否有某种插件可以

  7. 初识测开/测试- 第一篇 - 测开/测试方向 - 2

    前言在进入软件测试的正式讲解之前,我们需要对这个行业有一个整体的了解。当我们从软件开发转向软件测试的时候,多数公司是欢迎的,而且难度也小。反之,当我们从软件测试转向软件开发的时候,难度将会变得很大。关于互联网的工作大概有以下三种:1、软件开发:进行软件系统的开发,功能实现的工作2、软件测试验证软件功能性的正确性。具体的验证方式分为以下几种:1、手工验证2、自动化验证3、软件测试与开发开发测试工具,开发测试脚本,其目的就是为了提高测试效率。看到开发这两个字,说明是会涉及到编程的。但是难度会比软件开发低一些,没有数据结构中的编程那么难。测试开发这里的编程,都是有着指定规则来编写代码。换句话来说,它

  8. BACnet协议详解——初识BACnet架构 - 2

    文章目录BACnet协议架构BACnet简化的架构简化的四层BACnet体系结构选取BACnet网络的拓扑结构安全最后声明BACnet协议架构国际标准化组织在制定计算机网络通讯协议标准时定义了一个模型,称为开放系统互联参考模型(OSI(ISO7498)。模型的目的是解决计算机与计算机之间普遍的通信问题。下图给出了这七层的体系架构图。对于这种发生在两个应用程序之间的通信,看起来两个程序似乎是通过各自的应用接口直接相连。而真正的通信只发生在物理层。实现OSI模型协议所需的费用较高,在绝大部分楼宇自动控制系统中,并不需要实现OSI模型的所有内容。如果只选择OSI模型中需要的层次,形成一个简化的模型,

  9. webpack--》webpack底层深入讲解,从初识到精通,真正实现从0到1的过程 - 2

    目录webpackwebpack的基本使用安装配置修改自定义打包的入口与出口优化js或图片的存放路径配置webpack中@符号的使用webpack中相关插件安装webpack-dev-serverhtml-webpack-pluginclean-webpack-pluginwebpack中的loader打包处理css文件打包处理less文件打包处理样式表中与url路径相关的文件打包处理js文件中的高级语法webpack的打包与发布配置build命令SourceMapwebpackwebpack是前端项目工程化的具体解决方案。其主要功能为:它提供了友好的前端模块化开发支持,以及代码压缩混淆,处理

  10. 【微信小程序】初识微信小程序 - 2

    作者简介:一名C站萌新,前来进行小程序的前进之路博主主页:大熊李子的主页🐻1.1什么是微信小程序微信小程序是一种可以通过扫码或搜索即可进入使用的应用,减少了下载安装的环节,实现用户对于应用“触手可及、用完即走”的理想需求。在微信公众平台,小程序是与服务号、订阅号、企业微信并行的体系点开微信“发现-小程序”栏,你就能看到近期使用过的小程序;或者下拉微信聊天页面,你也能看到自己用过的小程序。如果你没有用过任何小程序,那么可以扫码进入小程序页面,或者点击好友分享的小程序卡片进入小程序。1.2小程序与普通网页开发的区别1.运行环境不同网页运行在浏览器环境中小程序运行在微信环境中2.API不同由于运行环

随机推荐