java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE, JavaME, JavaSE)的总称。本站提供基于Java框架struts,spring,hibernate等的桌面应用、web交互及移动终端的开发技巧与资料

保持永久学习的心态,将成就一个优秀的你,来 继续搞起java知识。

我们在HelloWorldController上配置了一个@RequestMapping(value = "/helloworld")这表示对该controller的所有action请求必须是以"/helloworld”开始。

1.<a href="http://www.cfei.net/archives/tag/url" title="浏览关于“URL”的文章" target="_blank" class="tag_link">URL</a>路径<a href="http://www.cfei.net/archives/tag/%e6%98%a0%e5%b0%84" title="浏览关于“映射”的文章" target="_blank" class="tag_link">映射</a>

1.1.对一个action配置多个URL映射:

我们把上一篇中的HelloWorldController的index() action方法的@RequestMapping更改为@RequestMapping(value={&quot;/index&quot;, &quot;/hello&quot;}, method = {RequestMethod.GET}),这表示对该action配置了/index和/hello两个映射。运行测试,如下:

![这里写图片描述](http://img.blog.csdn.net/20160325165638015)

可以看到/helloworld/hello请求也成功匹配。

1.2.URL请求参数映射:

这在查询的时候经常用到,比如我们根据id或编号来获取某一条记录。

在HelloWorldController添加一个getDetail的action,代码如下:

@RequestMapping(value=&quot;/detail/{id}&quot;, method = {RequestMethod.GET})
public ModelAndView getDetail(@PathVariable(value=&quot;id&quot;) Integer id){    
    ModelAndView modelAndView = new ModelAndView();  
    modelAndView.addObject(&quot;id&quot;, id);  
    modelAndView.setViewName(&quot;detail&quot;);  
    return modelAndView;
}

其中value=&quot;/detail/{id}&quot;,中的{id}为占位符表示可以映射请求为/detail/xxxx 的URL如:/detail/123等。

方法的参数@PathVariable(value=&quot;id&quot;) Integer id 用于将URL中占位符所对应变量映射到参数id上,@PathVariable(value=&quot;id&quot;) 中value的&amp;#20540;要和占位符/{id}大括号中的&amp;#20540;一致。

在views中添加detail.jsp视图,用于将获取到的id&amp;#20540;展示出来。视图内容如下:

&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    ${id}
&lt;/body&gt;
&lt;/html&gt;

运行测试,请求URL地址http://localhost:8080/<a href="http://www.cfei.net/archives/tag/spring" title="浏览关于“Spring”的文章" target="_blank" class="tag_link">Spring</a>MVCLesson/helloworld/detail/123 ,结果如下:

![2](http://img.blog.csdn.net/20160325165807345)

可以看到已经正确的显示了我们请求的id。

1.3.URL通配符映射:

我们还可以通过通配符对URL映射进行配置,通配符有“?”和“*”两个字符。其中“?”表示1个字符,“*”表示匹配多个字符,“**”表示匹配0个或多个路径。

例如:

“/helloworld/index?”可以匹配“/helloworld/indexA”、“/helloworld/indexB”,但不能匹配“/helloworld/index”也不能匹配“/helloworld/indexAA”;

“/helloworld/index*”可以匹配“/helloworld/index”、“/helloworld/indexA”、“/helloworld/indexAA”但不能匹配“/helloworld/index/A”;

“/helloworld/index/*”可以匹配“/helloworld/index/”、“/helloworld/index/A”、“/helloworld/index/AA”、“/helloworld/index/AB”但不能匹配    “/helloworld/index”、“/helloworld/index/A/B”;

“/helloworld/index/**”可以匹配“/helloworld/index/”下的多有子路径,比如:“/helloworld/index/A/B/C/D”;

如果现在有“/helloworld/index”和“/helloworld/*”,如果请求地址为“/helloworld/index”那么将如何匹配?Spring MVC会按照最长匹配优先原则(即和映射配置中哪个匹配的最多)来匹配,所以会匹配“/helloworld/index”,下面来做测试:

在HelloWorldController添加一个urlTest的action,内容如下:
复制代码

@RequestMapping(value=&quot;/*&quot;, method = {RequestMethod.GET})
public ModelAndView urlTest(){
    
    ModelAndView modelAndView = new ModelAndView();   
    modelAndView.setViewName(&quot;urltest&quot;);  
    return modelAndView;
}

复制代码

在views文件夹中新加一个视图urltest.jsp,为了和index.jsp做区别urltest.jsp的内容如下:
复制代码

&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    urlTest!
&lt;/body&gt;
&lt;/html&gt;

复制代码

请求http://localhost:8080/SpringMVCLesson/helloworld/index查看结果:

&lt;img src=&quot;http://img.blog.csdn.net/20160325170044239?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center&quot; border=&quot;0&quot; &gt;

可以看出映射的是index对应的action。

请求http://localhost:8080/SpringMVCLesson/helloworld/AAA查看结果:

&lt;img src=&quot;http://img.blog.csdn.net/20160325170114568?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center&quot; border=&quot;0&quot; &gt;

可以看出映射的是urlTest对应的action。

1.4.URL正则表达式映射:

Spring MVC还支持正则表达式方式的映射配置,我们通过一个测试来展示:

在HelloWorldController添加一个regUrlTest的action,内容如下:

@RequestMapping(value=&quot;/reg/{name:\\w&amp;#43;}-{age:\\d&amp;#43;}&quot;, method = {RequestMethod.GET})
public ModelAndView regUrlTest(@PathVariable(value=&quot;name&quot;) String name, @PathVariable(value=&quot;age&quot;) Integer age){
    
    ModelAndView modelAndView = new ModelAndView();   
    modelAndView.addObject(&quot;name&quot;, name); 
    modelAndView.addObject(&quot;age&quot;, age); 
    modelAndView.setViewName(&quot;regurltest&quot;);  
    return modelAndView;
}

在views文件夹中新加一个视图regurltest.jsp内容如下:
复制代码

&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    ${name}-${age}
&lt;/body&gt;
&lt;/html&gt;

复制代码

请求http://localhost:8080/SpringMVCLesson/helloworld/reg/Hanmeimei-18查看结果:

&lt;img src=&quot;http://img.blog.csdn.net/20160325170213131?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center&quot; border=&quot;0&quot; &gt;

请求http://localhost:8080/SpringMVCLesson/helloworld/reg/Hanmeimei-Lilei查看结果(会发现找不到对应的action返回404):

 
&lt;img src=&quot;http://img.blog.csdn.net/20160325170344852?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center&quot; border=&quot;0&quot; &gt;

2.限制action所接受的请求方式(get或post):

之前我们在HelloWorldController的index() action方法上配置的为@RequestMapping(value=&quot;/*&quot;, method = {RequestMethod.GET})我们把它改为@RequestMapping(value=&quot;/*&quot;, method = {RequestMethod.POST})再次请求http://localhost:8080/SpringMVCLesson/helloworld/index试一下:

&lt;img src=&quot;http://img.blog.csdn.net/20160325173040393?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center&quot; border=&quot;0&quot; &gt;

这里可以看到结果映射到了urlTest这个action,这是因为我们在urlTest上配置的为@RequestMapping(value=&quot;/*&quot;, method = {RequestMethod.GET}),当index这个action映射不在符合时便映射到了urlTest。

我们也可以这样配置@RequestMapping(value=&quot;/*&quot;, method = {RequestMethod.GET, RequestMethod.POST})表示该action可以接受get或post请求,不过更简单的是不对method做配置则默认支持所有请求方式。

 

3.限制action所接受请求的参数:

我们可以为某个action指定映射的请求中必须包含某参数,或必须不包含某参数,或者某参数必须等于某个&amp;#20540;,或者某参数必须不等于某个&amp;#20540;这些限制。

3.1.指定映射请求必须包含某参数:

在HelloWorldController添加一个paramsTest的action,内容如下:

@RequestMapping(value=&quot;/paramstest&quot;, params=&quot;example&quot;, method = {RequestMethod.GET})
public ModelAndView paramsTest(){
    
    ModelAndView modelAndView = new ModelAndView();   
    modelAndView.setViewName(&quot;paramstest&quot;);  
    return modelAndView;
}

在views文件夹中新加一个视图paramstest.jsp内容如下:

&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    paramstest!
&lt;/body&gt;
&lt;/html&gt;

请求http://localhost:8080/SpringMVCLesson/helloworld/paramstest查看结果:

&lt;img src=&quot;http://img.blog.csdn.net/20160325173011112?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center&quot; border=&quot;0&quot; &gt;

这里可以看到没有找到paramsTest这个action结果还是映射到了urlTest这个action。

请求http://localhost:8080/SpringMVCLesson/helloworld/paramstest?example查看结果:

&lt;img src=&quot;http://img.blog.csdn.net/20160325173109628?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center&quot; border=&quot;0&quot; &gt;

这次可以看到请求映射到了paramsTest这个action。

3.2.指定映射请求必须不包含某参数:

把刚才添加的paramsTest的@RequestMapping(value=&quot;/paramstest&quot;, params=&quot;example&quot;, method = {RequestMethod.GET}) 改为@RequestMapping(value=&quot;/paramstest&quot;, params=&quot;!example&quot;, method = {RequestMethod.GET})

重新请求http://localhost:8080/SpringMVCLesson/helloworld/paramstest?example查看结果:

&lt;img src=&quot;http://img.blog.csdn.net/20160325173147212?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center&quot; border=&quot;0&quot; &gt;

可以看到又没有找到paramsTest这个action而映射到了urlTest这个action。

3.3.指定映射请求中或者某参数必须等于某个&amp;#20540;:

把刚才添加的paramsTest的@RequestMapping(value=&quot;/paramstest&quot;, params=&quot;example&quot;, method = {RequestMethod.GET}) 改为@RequestMapping(value=&quot;/paramstest&quot;, params=&quot;example=AAA&quot;, method = {RequestMethod.GET})

请求http://localhost:8080/SpringMVCLesson/helloworld/paramstest?example=BBB查看结果:

&lt;img src=&quot;http://img.blog.csdn.net/20160325173228894?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center&quot; border=&quot;0&quot; &gt;

可以看到没有找到paramsTest这个action而映射到了urlTest这个action。

请求http://localhost:8080/SpringMVCLesson/helloworld/paramstest?example=AAA查看结果:

&lt;img src=&quot;http://img.blog.csdn.net/20160325173306519?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center&quot; border=&quot;0&quot; &gt;

这次可以看到请求映射到了paramsTest这个action。

3.4.指定映射请求中或者某参数必须不等于某个&amp;#20540;:

把刚才添加的paramsTest的@RequestMapping(value=&quot;/paramstest&quot;, params=&quot;example&quot;, method = {RequestMethod.GET}) 改为@RequestMapping(value=&quot;/paramstest&quot;, params=&quot;example!=AAA&quot;, method = {RequestMethod.GET})

请求http://localhost:8080/SpringMVCLesson/helloworld/paramstest?example=BBB查看结果:

&lt;img src=&quot;http://img.blog.csdn.net/20160325173345644?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center&quot; border=&quot;0&quot; &gt;

可以看到请求映射到了paramsTest这个action。

请求http://localhost:8080/SpringMVCLesson/helloworld/paramstest?example=AAA查看结果:

&lt;img src=&quot;http://img.blog.csdn.net/20160325173414090?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center&quot; border=&quot;0&quot; &gt;

可以看到没有找到paramsTest这个action而映射到了urlTest这个action。

注:当我们为params指定多个参数时如:params={&quot;example1&quot;, &quot;example2&quot;},表示的是and关系,即两个参数限制必须同时满足。

 

4.限制action所接受请求头参数:

同限制action所接受的请求参数一样,我们也可以为某个action指定映射的请求头中必须包含某参数,或必须不包含某参数,或者某参数必须等于某个&amp;#20540;,或者某参数必须不等于某个&amp;#20540;这些限制。

4.1.指定映射请求头必须包含某参数:

@RequestMapping(value=&quot;/headerTest&quot;, headers = &quot;example&quot;)。与限制请求参数是一样的,可以参考上面的例子进行测试。

4.2.指定映射请求头必须不包含某参数:

@RequestMapping(value=&quot;/headerTest&quot;, headers = &quot;!example&quot;)。与限制请求参数是一样的,可以参考上面的例子进行测试。

4.3.指定映射请求头中或者某参数必须等于某个&amp;#20540;:

@RequestMapping(value=&quot;/headerTest&quot;, headers = &quot;Accept=text/html&quot;)。与限制请求参数是一样的,可以参考上面的例子进行测试。

4.4.指定映射请求头中或者某参数必须不等于某个&amp;#20540;:

@RequestMapping(value=&quot;/headerTest&quot;, headers = &quot;Accept!=text/html&quot;)。与限制请求参数是一样的,可以参考上面的例子进行测试。

注:当我们为headers指定多个参数时如:headers={&quot;example1&quot;, &quot;example2&quot;},表示的是and关系,即两个参数限制必须同时满足。

springmvcurl映射

因为水平有限,难免有疏忽或者不准确的地方,希望大家能够直接指出来,我会及时改正。一切为了知识的分享。

后续会有更多的精彩的内容分享给大家。