概述
/**
* 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.xml,DefaultServlet是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 模糊匹配功能所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复