我是靠谱客的博主 舒心棒棒糖,最近开发中收集的这篇文章主要介绍SpringMVC_RequestMapping一、DispatcherServlet url-pattern写法二、RequestMapping 里面可以配置的值三、RequestMapping 模糊匹配功能,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

/**
 * 1、告诉SpringMVC这个类是一个处理器
 * 
 * HelloWorld:细节:
 * 1、运行流程:
 * 		1)、客户端点击链接会发送 http://localhost:8080/springmvc/hello 请求
 * 		2)、来到tomcat服务器;
 * 		3)、SpringMVC的前端控制器收到所有请求;
 * 		4)、来看请求地址和@RequestMapping标注的哪个匹配,来找到到底使用那个类的哪个方法来处理
 * 		5)、前端控制器找到了目标处理器类和目标方法,直接利用返回执行目标方法;
 * 		6)、方法执行完成以后会有一个返回值;SpringMVC认为这个返回值就是要去的页面地址
 * 		7)、拿到方法返回值以后;用视图解析器进行拼串得到完整的页面地址;
 * 		8)、拿到页面地址,前端控制器帮我们转发到页面;
 *
 *2、@RequestMapping;
 *		就是告诉SpringMVC;这个方法用来处理什么请求;
 *		这个/是可以省略,即使省略了,也是默认从当前项目下开始;
 *		习惯加上比较好    /hello  /hello
 *		RequestMapping的使用:?
 *3、如果不指定配置文件位置?
 *		/WEB-INF/springDispatcherServlet-servlet.xml
 *		如果不指定也会默认去找一个文件;
 *			/WEB-INF/springDispatcherServlet-servlet.xml
 *	就在web应用的/WEB-INF、下创建一个名叫   前端控制器名-servlet.xml
 */

一、DispatcherServlet url-pattern写法

org.springframework.web.servlet.DispatcherServlet

 1. //* 的区别

  • /:拦截所有请求,不拦截jsp页面,*.jsp请求
  • /*:拦截所有请求,拦截jsp页面,*.jsp请求

处理*.jsp是tomcat做的事,所有项目的小web.xml都是继承于大web.xmlDefaultServlet是Tomcat中处理静态资源的,除过jsp,和servlet外剩下的都是静态资源。

  //~apache-tomcat-X.x.xxconfweb.xml 
    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>fork</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>xpoweredBy</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>

    <!-- The mappings for the JSP servlet -->
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>
  //~apache-tomcat-X.x.xxconfweb.xml 
  <!-- The default servlet for all web applications, that serves static     -->
  <!-- resources.  It processes all requests that are not mapped to other   -->
  <!-- servlets with servlet mappings (defined either here or in your own   -->
  <!-- web.xml file).  This servlet supports the following initialization   -->
  <!-- parameters (default values are in square brackets):                  -->
   
    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>


    <!-- The mapping for the default servlet -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

当我们没有配置静态资源处理的时候,我们去访问 index.html 会发现返回404
index.html:静态资源,tomcat就会在服务器下找到这个资源并返回,我们前端控制器的 / 禁用了tomcat服务器中的DefaultServlet,而我们有没有 /index.html 这个请求,所以会返回404

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<!-- Map all requests to the DispatcherServlet for handling -->
<!--  *.do   *.action  *.haha -->
<!--
    1)服务器的大web.xml中有一个DefaultServlet是url-pattern=/
    2)我们的配置中前端控制器 url-pattern=/
            静态资源会来到DispatcherServlet(前端控制器)看那个方法的RequestMapping是这个index.html
    3)为什么jsp又能访问;因为我们没有覆盖服务器中的JspServlet的配置
    4) /*  直接就是拦截所有请求;我们写/;也是为了迎合后来Rest风格的URL地址
-->
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
// 控制台输出
27-Jul-2019 21:39:38.139 璀﹀憡 [http-nio-8080-exec-8] org.springframework.web.servlet.DispatcherServlet.noHandlerFound No mapping for GET /2.SpringMVC_helloworld/index.html

 


二、RequestMapping 里面可以配置的值

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
    String name() default "";
    @AliasFor("path")
    String[] value() default {};
    @AliasFor("value")
    String[] path() default {};
    RequestMethod[] method() default {};
    String[] params() default {};
    String[] headers() default {};
    String[] consumes() default {};
    String[] produces() default {};
}
/**
 * RequestMapping的其他属性
 * method:限定请求方式、
 * 		HTTP协议中的所有请求方式:
 * 			【GET】, HEAD, 【POST】, PUT, PATCH, DELETE, OPTIONS, TRACE
 * 		GET、POST
 * 		method=RequestMethod.POST:只接受这种类型的请求,默认是什么都可以;
 * 			不是规定的方式报错:4xx:都是客户端错误
 * 				405 - Request method 'GET' not supported
 * params:规定请求参数
 * params 和 headers支持简单的表达式:
 * 		param1: 表示请求必须包含名为 param1 的请求参数
 * 			eg:params={"username"}:
 * 				发送请求的时候必须带上一个名为username的参数;没带都会404
 * 
 * 		!param1: 表示请求不能包含名为 param1 的请求参数
 * 			eg:params={"!username"}
 * 				发送请求的时候必须不携带上一个名为username的参数;带了都会404
 * 		param1 != value1: 表示请求包含名为 param1 的请求参数,但其值不能为 value1
 * 			eg:params={"username!=123"}
 * 				发送请求的时候;携带的username值必须不是123(不带username或者username不是123)
 * 
 * 		{“param1=value1”, “param2”}: 请求必须包含名为 param1 和param2 的两个请求参数,且 param1 参数的值必须为 value1
 * 			eg:params={"username!=123","pwd","!age"}
 * 				请求参数必须满足以上规则;
 * 				请求的username不能是123,必须有pwd的值,不能有age
 * headers:规定请求头;也和params一样能写简单的表达式
 * 	
 * 
 * 
 * consumes:只接受内容类型是哪种的请求,规定请求头中的Content-Type
 * produces:告诉浏览器返回的内容类型是什么,给响应头中加上Content-Type:text/html;charset=utf-8
 */

1. value、path

@AliasFor("path")
String[] value() default {};

@AliasFor("value")
String[] path() default {};

value 和 path 都一样,都代表请求映射的路径。就和你有两个名字一样,一个正式名字一个别名。

2. method

限定请求方式

public enum RequestMethod {
	GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}

3. params

* params:规定请求参数
* params 和 headers支持简单的表达式:
* 		param1: 表示请求必须包含名为 param1 的请求参数
* 			eg:params={"username"}:
* 				发送请求的时候必须带上一个名为username的参数;没带都会404
*
* 		!param1: 表示请求不能包含名为 param1 的请求参数
* 			eg:params={"!username"}
* 				发送请求的时候必须不携带上一个名为username的参数;带了都会404
* 		param1 != value1: 表示请求包含名为 param1 的请求参数,但其值不能为 value1
* 			eg:params={"username!=123"}
* 				发送请求的时候;携带的username值必须不是123(不带username或者username不是123)
*
* 		{“param1=value1”, “param2”}: 请求必须包含名为 param1 和param2 的两个请求参数,且 param1 参数的值必须为 value1
* 			eg:params={"username!=123","pwd","!age"}
* 				请求参数必须满足以上规则;
* 				请求的username不能是123,必须有pwd的值,不能有age
@RequestMapping(value="/handle03",params={"username!=123","pwd","!age"})
public String handle03(){
    System.out.println("handle03....");
    return "success";
}

上面这个Mapping能接收的请求就是请求包含名为 username 、pwd 的请求参数不能包含 age这个请求参数username的值不能是123。这些条件需要同时满足

  • /username=456&pwd=123
  • /username=123&pwd=123&age=

 4. headers

规定请求头;也和params一样能写简单的表达式

/**
 * User-Agent:浏览器信息;
 * 让火狐能访问,让谷歌不能访问
 *
 * 谷歌:
 * User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
 * 火狐;
 * User-Agent	Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0
 * @return
 *
 */
@RequestMapping(value="/handle04",headers={"User-Agent=Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0"})
public String handle04(){
    System.out.println("handle04....");
    return "success";
}

注:上面只是简单的演示一下,允许火狐连版本号都限制死了,达不到允许所有火狐游览器都可以访问的要求。

5. 其他 

* consumes:只接受内容类型是哪种的请求,规定请求头中的Content-Type
* produces:告诉浏览器返回的内容类型是什么,给响应头中加上Content-Type:text/html;charset=utf-8

三、RequestMapping 模糊匹配功能

RequestMapping-ant风格的url 

* URL地址可以写模糊的通配符:
* 	?:能替代任意一个字符
* 	*:能替代任意多个字符,和一层路径
* 	**:能替代多层路径
@RequestMapping("/antTest01")
public String antTest01(){
	System.out.println("antTest01...");
	return "success";
}

/**
 * ?匹配一个字符,0个多个都不行;
 * 		模糊和精确多个匹配情况下,精确优先
 *  http://localhost:8080/2.SpringMVC_helloworld/antTest02
 */
@RequestMapping("/antTest0?")
public String antTest02(){
	System.out.println("antTest02...");
	return "success";
}

/**
 *   *匹配任意多个字符
 *  http://localhost:8080/2.SpringMVC_helloworld/antTest022222
 */
@RequestMapping("/antTest0*")
public String antTest03(){
	System.out.println("antTest03...");
	return "success";
}

/**
 *  *:匹配一层路径
 *  http://localhost:8080/2.SpringMVC_helloworld/a/hehe/antTest01
 */
@RequestMapping("/a/*/antTest01")
public String antTest04(){
	System.out.println("antTest04...");
	return "success";
}

//匹配多层路径
//http://localhost:8080/2.SpringMVC_helloworld/a/b/c/d/hehe/antTest01
@RequestMapping("/a/**/antTest01")
public String antTest05(){
	System.out.println("antTest05...");
	return "success";
}

//路径上可以有占位符:  占位符 语法就是可以在任意路径的地方写一个{变量名}
//   /user/admin    /user/leifengyang
// 路径上的占位符只能占一层路径
@RequestMapping("/user/{id}")
public String pathVariableTest(@PathVariable("id")String id){
	System.out.println("路径上的占位符的值"+id);
	return "success";
}

 


  • SpringMVC--理解web.xml中的 url-pattern标签及其使用范围:https://blog.csdn.net/yzh18373476791/article/details/82719848

最后

以上就是舒心棒棒糖为你收集整理的SpringMVC_RequestMapping一、DispatcherServlet url-pattern写法二、RequestMapping 里面可以配置的值三、RequestMapping 模糊匹配功能的全部内容,希望文章能够帮你解决SpringMVC_RequestMapping一、DispatcherServlet url-pattern写法二、RequestMapping 里面可以配置的值三、RequestMapping 模糊匹配功能所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部