上一篇:《修炼SpringMVC-配置开发-视图解析器》
如果文中有纰漏,请多多指正!!!
一、案例入门
先看一个简单注解案例
在SpringMVC中利用注解开发Controller,无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL请求和Controller方法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。
- 自定义处理器:
package com.springmvc.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;@Controllerpublic class HelloController { @RequestMapping("/test.do") public ModelAndView test() throws Exception { ModelAndView mov=new ModelAndView("index"); mov.addObject("key", "注解开发"); return mov; }}
- 注解配置:
- web.xml配置
SpringMVCDemoorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:mySringMVC.xml1SpringMVCDemo*.do
通过以上的简单配置,一个简单完整的处理器,就可以正常工作了。当我们访问,比如本测试案例的地址 http://localhost:8080/SpringMVCPrimary/test.do时,就会在请求处理完成后跳转到index.jsp页面。
二、处理器的请求规则映射配置
在入门案例中,我们通过将@RequestMapping注解注解在方法上来定义处理器对于请求的映射关系。该注解可以注解在方法上,也可以注解在类上,但其含义不同。
对于处理器的请求规则映射的定义我们将通过以下4点进行概要说明。
1.对请求URI的命名空间的定义
所谓命名空间(namespace),是指标识符的各种可见范围,也就是通过名称空间来分类,区别不同的代码功能,同时也是URI的一部分。
我们通过@RequestMapping注解的value属性用语定义所匹配请求的URI。如果指定在方法上的注解具有相同的部分URI,我们可以抽取相同部分,通过@RequestMapping注解注解在类上,此时的这个URI就是命名空间。
例如有如下案例,我们在访问时就必须是加上/common,也就是http://localhost:8080/SpringMVCPrimary/common/test1.do或者http://localhost:8080/SpringMVCPrimary/common/test2.do:
@Controller@RequestMapping("/common")public class HelloController { @RequestMapping("/test1.do") public ModelAndView test1() throws Exception { ModelAndView mov=new ModelAndView("index"); mov.addObject("key", "注解开发"); return mov; } @RequestMapping("/test2.do") public ModelAndView test2() throws Exception { ModelAndView mov=new ModelAndView("index"); mov.addObject("key", "注解开发"); return mov; }}
2.在请求URI中使用通配符
在请求URI中使用通配符,可大致分为两种
1)在资源名称中使用通配符
在请求资源名称中使用通配符,表示该请求资源名称中包含指定的字符即可完成匹配。
例如案例:
@Controller@RequestMapping("/common")public class HelloController { @RequestMapping("/*test1.do") public ModelAndView test1() throws Exception { ModelAndView mov=new ModelAndView("index"); mov.addObject("key", "注解开发"); return mov; } @RequestMapping("/test2*.do") public ModelAndView test2() throws Exception { ModelAndView mov=new ModelAndView("index"); mov.addObject("key", "注解开发"); return mov; }}
其中/*test1.do表示资源名称以test1结尾即可,/test2*.do表示资源名称以test2开头即可。例如请求http://localhost:8080/SpringMVCPrimary/common/aaaaatest1.do就可以访问到test1()方法。
2)在资源路径中使用通配符
在资源路径中使用通配符,一般有两种用法:路径级数的精确匹配和路径级数的可变匹配。
- 路径级数的精确匹配。
比如/common/*/test1.do,表示test1.do的资源名称前边,只能且必须有两级路径,第一级必须是/common,而第二级随意。
- 路径级数的可变匹配。
比如/common/**/test1.do,表示test1.do的资源名称前边,必须以/common开头,而其他级的路径是什么,有或没有,都随意。
3.对请求的提交方式的定义
在客户端浏览器常用的请求提交方式一般有以下几种:
1.表单请求:默认GET,可指定POST2.ajax请求:默认GET,可指定POST3.地址栏请求:GET4.超链接请求:GET5.src资源路经请求:GET
对于@RequestMapping注解,我们可以通过method属性,对指定注解方法所处理的请求方式,进行限定,只有满足method指定的提交方式的请求,才会执行被注解方法。
如果我们不配置method属性值,那么无论是GET还是POST提交方式,均可匹配执行,也就是对于请求提交方式没有要求。
method属性取值为RequestMethod枚举常量:
public enum RequestMethod { GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE}
4.对请求中携带参数的定义
在@RequestMapping注解中,param属性中定义了必须携带的参数的要求。
比如:
- @RequestMapping(value="/test1.do",method=RequestMethod.GET, params={"a","b"}):要求请求中必须携带请求参数a和b.
例:http://localhost:8080/SpringMVCPrimary/common/test1.do?a=1&b=3,a或b少一个都不行,携带参数值任意。
- @RequestMapping(value="/test1.do",method=RequestMethod.GET, params={"!a","b"}):要求请求中必须携带请求参数b,但必须不能携带参数a.
- @RequestMapping(value="/test1.do",method=RequestMethod.GET, params={"a=1","b=2"}):要求请求中必须携带请求参数a和b,并且a=1,b=2.
- @RequestMapping(value="/test1.do",method=RequestMethod.GET, params={"a=1","b!=2"}):要求请求中必须携带请求参数a和b,并且a=1,b!=2.