Spring框架深入(四)--SpringMVC配置详解
一、SpringMVC web模型
二、@RequestMapping参数说明
1、value:定义处理方法的请求的URL地址;
2、method:定义处理的方法的http method类型,如GET/POST方法;不指定的时候,可以处理任何方式的http请求;
3、params:定义请求的URL中必须包含的参数,用于窄化请求;
4、headers:定义请求的request headers 中必须包含的参数,与params类似;
5、consums:指定处理请求的提交类型(content-type),application/json,用于窄化请求;
6、produces:指定返回的内容类型,仅当request请求头中的类型包含指定类型才返回;
params的使用
用于前台向后台的参数的传递;通过判断传递的参数中有或者没有“target”,来判断是否进入该方法;
//请求中有target参数时,才能进入 @RequestMapping(value="/find1.action",params="target") public String find1(String target) { System.out.println("find1"); System.out.println(target); return "result"; } //请求中不能有target参数 @RequestMapping(value="/find1.action",params="!target") public String find2() { System.out.println("find2"); return "result"; } //请求中target值等于test时,进入find3 @RequestMapping(value="/find1.action",params="target=test") public String find3(String target) { System.out.println("find3"); System.out.println(target); return "result"; }
value配置详解
value支持通配符的使用;
?:代表匹配文件名中的一个字符;
*:代表匹配文件名中的任意字符;
**:代表匹配多层路径;
示例:
有这样几个跳转链接,
<a href="find.action">find.action</a><br> <a href="find/id.action">find/id.action</a><br> <a href="find/ida.action">find/ida.action</a><br> <a href="find/idaa.action">find/idaa.action</a><br> <a href="find/id/abc.action">find/id/abc.action</a><br> <a href="find/id/abc/abc.action">find/id/abc/abc.action</a><br>
分别对应到的controller方法:
@RequestMapping("/find/id?.action") public String match1() { System.out.println("match1:"+"/find/id?.action"); return "result"; } @RequestMapping("/find/id*.action") public String match2() {
System.out.println("match2:"+"/find/id*.action"); return "result"; } @RequestMapping("/find/id/*.action") public String match3() { System.out.println("match3:"+"/find/id/*.action"); return "result"; } @RequestMapping("/find/id/**/abc.action") public String match4() { System.out.println("match4:"+"/find/id/**/abc.action"); return "result"; } @RequestMapping("/find.action") public String match5() { System.out.println("match5:"+"/find.action"); return "result"; }
运行结果:
或关系
一个value的配置可以支持两个URL路径的映射;通过这两个路径,可以同时访问到这个方法;
@RequestMapping(value= {"/get.action","/fetch.action"}) public String get() { System.out.println("get"); return "result"; }
正则表达式
页面链接:
<a href="get/2-b.action">reg</a>
controller代码:
@RequestMapping("get/{\\d+}-{[a-z]}") public String regularExpression() { System.out.println("regularExpression"); return "result"; }
通过正则表达式还可以实现路径参数的获取;
@RequestMapping("get/{number:\\d+}-{text:[a-z]}") public String regularExpression2(@PathVariable String number,@PathVariable String text) { System.out.println("regularExpression"); System.out.println("number:"+number); System.out.println("text:"+text); return "result"; }
先在路径中接收正则表达式的值,再通过@PathVariable获取值;
运行结果:
RESTFUL支持
1、restful:轻量级的SOA(面向服务)的实现,将一个个的请求做出的相应以资源的形式返回;
2、请求资源:
以前:userServlet?type=”add”;
Restful:URL风格:将参数通过URL传递到服务器端;
3、SpringMVC支持restful风格,可以通过URL进行参数的传递;
示例:
<a href="user/add.action">add</a>
@RequestMapping(value="/user/{type}.action") public String userMgr(@PathVariable("type") String initParam) { System.out.println("userMgr:"+initParam); return "result"; }
路径中的值add,就会作为参数被type接收;
先使用@PathVariable(“type”)中的type来接收通过URL路径传递的type值,再给InitParam初始化参数;
三、基于注解的参数绑定
1、@RequestParam:设置绑定的参数名和传入的参数名的值;
<a href="param.action?param=paramTest">测试</a><br>
@RequestMapping("/param.action") public String param(@RequestParam("param")String value) { System.out.println("param:"+value); return "result"; }
2、@ PathVariable
四、数据回显深入理解
数据回显的方法:
(1)、原生servlet的方式:
(2)、ModelAndView
(3)、Model/ModelMap:默认在request作用域实现数据传递
@RequestMapping("/back.action") public String back(Model model) { String msg="this is msg;"; model.addAttribute("msg", msg);//默认的作用域范围是request return "result"; }
在前台页面可直接通过EL表达式获取值;
(4)、ModeAtrribute
可以用于方法的返回值:用来在处理@RequestMapping之前,为请求绑定需要从后台查询到的model;
将数据绑定到request作用域,每个请求都可以从作用域中拿出数据;
当前@RequestMapping的每一个返回都可以携带ModelAttribute中的属性和属性值;
@ModelAttribute("list") public List<User> findAllUser(){ User user1=new User(1,"admin","admin"); User user2=new User(2,"test","test"); List<User> list=new ArrayList<User>(); list.add(user1); list.add(user2); return list; }
在前台页面通过request.getAttribute获取值;
(5)、@SessionAttributes:用于类和接口
将与ModelAttribute中的key相同的属性值也放到session作用域中;
@Controller @SessionAttributes(value= {"list","msg"}) public class ParamController { @RequestMapping("/param.action") public String param(@RequestParam("param")String value) { System.out.println("param:"+value); return "result"; } @ModelAttribute("list") public List<User> findAllUser(){ User user1=new User(1,"admin","admin"); User user2=new User(2,"test","test"); List<User> list=new ArrayList<User>(); list.add(user1); list.add(user2); return list; } }
在前台页面通过session可以同时获取到list和msg;
PS:因作者能力有限,如有误还请谅解;