目录
3.1 @RequestMapping 映射请求
3.2 使用method属性来指定请求方式
3.3 params和headers
3.4 Ant风格
3.5 @PathVariable 映射 URL 绑定的占位符
3.6 REST风格
3.6.1 配置web.xml
3.6.2 Rest风格的URL
@RequestMapping 映射请求,直白点来说就是你输入一个路径后,系统会找这个路径对应的类或函数处理这个路径请求。
那么怎么查找这个路径对应的函数呢?就需要先绑定,这个@RequestMapping就是绑定的功能。
文章代码是基于《hualinux springMVC 5.3:建立学习的springMVC项目》所建立的项目基础上进行操行的
在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,修改代码如下:
package com.hualinux.srpingmvc.handers; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; //@Controller表示要使用模板,如果用@RestController则表示直接把数据返回给浏览器 @Controller public class SpringMVCTest { /* * 1. @RequestMapping除了修饰方法,还可以修饰类 * 2. * 1) 类定义处:提供初步的请求映射信息。相对于WEB应用的根目录 * 2) 方法处:提供进一步的细分映射信息。 * 相对于类定义的URL。若类定义处未标注 @RequestMapping,则方法处标记的URL相对于WEB应用的根目录 * */ @RequestMapping("/springmvc/testRequestMapping") public String testRequestMapping(){ System.out.println("testRequestMapping"); return "ok"; } }web/index.jsp页面的<body></body>标签中添加如下代码
<p><a href="springmvc/testRequestMapping">testRequestMapping</a></p>运行tomcat,idea会自动打开主页点,下面链接
在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:
/* * 使用method属性来指定请求方式 * */ @RequestMapping(value = "springmvc/testMethod",method = RequestMethod.POST) public String testMethod(){ System.out.println("testMethod"); return "ok"; }web/index.jsp页面的<body></body>标签中添加如下代码:
<p> <form action="springmvc/testMethod" method="post"> <input type="submit" value="testMethod"> </form> </p>运行tomcat,idea会自动打开主页点,下面链接
在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:
/**了解:可以使用params和headers来更加精确的映射请求。params和headers 支持简单的表达式串 *@return */ @RequestMapping(value="testParamsAndHeaders", params={" username", "age 1=10"}, headers={"Accept-Language=en-Us ,zh;q=0.8"}) public String testParamsAndHeaders(){ System.out.println("testParamsAndHeaders"); return "ok"; }web/index.jsp页面的<body></body>标签中添加如下代码:
<p><a href="springmvc/testParamsAndHeaders?username='hua'&age=20">testParamsAndHeaders?username='hua'&age=20</a></p>运行tomcat,idea会自动打开主页点,下面链接
上面如果age=10呢
<p><a href="springmvc/testParamsAndHeaders?username='hua'&age=10">testParamsAndHeaders?username='hua'&age=10</a></p>重启tomcat,运行效果如下
使用@RequestMapping映射请求
●Ant风格资源地址支持3种匹配符: - ? :匹配文件名中的一个字符 - * :匹配文件名中的任意字符 - ** : **匹配多层路径
●@RequestMapping还支持Ant风格的URL : - /user/*/createUser: 匹配/user/aaa/createUser. /user/bbb/createUser 等URL - /user/**/createUser: 匹配/user/createUser. /user/aaa/bbb/createUser等 URL - /user/createUser??: 匹配/user/createUseraa、 /user/createUserbb 等URL
在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:
//注:只要符合 /springmvc/testAntPath/*/abc格式就行 @RequestMapping("/springmvc/testAntPath/*/abc") public String testAntPath(){ System.out.println("testAntPath"); return "ok"; }
web/index.jsp页面的<body></body>标签中添加如下代码:
<p><a href="springmvc/testAntPath/hua/abc">testAntPath</a></p>运行tomcat,idea会自动打开主页点,下面链接
springMVC很灵活,它可以获取URL地址中的值,然后当作变量来输出,这里要使用@PathVariable注解,故名思意,就是路径变量的意思,通常的话,@PathVariable要使用,是一定要与@RequestMapping一起使用的,下面给出代码示例:
在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:
/* * @PathVariable可以来映射URL中的占位符到目标方法的参数中。 * 正国为这样才支持REST风格的URL * */ @RequestMapping("/springmvc/testPathVariable/{id}") public String testPathVariable(@PathVariable("id") Integer id ) { System.out.println("testPathVariable:"+id); return "ok"; }web/index.jsp页面的<body></body>标签中添加如下代码:
<p><a href="springmvc/testPathVariable/1">testPathVariable</a></p>运行tomcat,idea会自动打开主页点,下面链接
通常的话,表单有着post,与get提交方式,而rest风格的URL,则有着get,post,put,delete这四种请求方式,但是浏览器却是只支持get与post,所以我们可以使用springMVC,把它进行转换,我们要利用org.springframework.web.filter.HiddenHttpMethodFilter这个类,这是一个过滤器,我们首先要在web.xml中配置它,请配置在第一个位置,不然的话,可能会先进入其它的过滤器,配置代码如下:
web/WEB-INF/web.xml添加如下配置
<!-- 配置 org.springframework.web.filter.HiddenHttpMethodFilter 可以把Post转为DELETE或PUT--> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>/** Rest风格的URL. *以CRUD为例: *新增: /order POST *修改: /order/1 PUT update?id=1 *获取: /order/1 GET get?id=1 *删除: /order/1 DELETE delete?id=1 * *如何发送PUT 请求和DELETE 请求呢? * 1.需要配置HiddenHttpMethodF ilter * 2.需要发送 POST 请求 * 3.需要在发送POST请求时携带一个name="_ method" 的隐藏域,值为 DELETE 或 PUT * *在SpringMVC的目标方法中如何得到id呢? *使用 @PathVariable 注解 */
在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:
/* REST PUT方法,相当于数据库的更新*/ @RequestMapping(value = "/springmvc/testRest/{id}",method = RequestMethod.PUT) @ResponseBody public String testRestPut(@PathVariable("id") Integer id){ System.out.println("testRest PUT:"+id); return "ok"; } /* REST delete方法,相当于数据库的删除*/ @RequestMapping(value = "/springmvc/testRest/{id}",method = RequestMethod.DELETE) @ResponseBody public String testRestDelete(@PathVariable("id") Integer id){ System.out.println("testRest DELETE:"+id); return "ok"; } /* REST POST方法,相当于数据库的新增*/ @RequestMapping(value = "/springmvc/testRest",method = RequestMethod.POST) public String testRest(){ System.out.println("testRest POST"); return "ok"; } /* REST GET方法,相当于数据库的查询*/ @RequestMapping(value = "/springmvc/testRest/{id}",method = RequestMethod.GET) public String testRest(@PathVariable("id") Integer id){ System.out.println("testRest GET:"+id); return "ok"; }注:
在DELETET和PUT中要加入@ResponseBody,否则会报“JSPs only permit GET POST or HEAD”错误如果你确实是要返回数据,比如json数据,在@RequestMapping标注下面标注添加@ResponseBody
在DELETET和PUT中用隐藏按钮,其中 name="_method"名字不能修改,因为是固定的 ,value值可以是DELETE/PUT等
web/index.jsp页面的<body></body>标签中添加如下代码:
<p> <form action="springmvc/testRest/1" method="post"> <input type="hidden" name="_method" value="PUT" /> <input type="submit" value="TestRest PUT"/> </form> <form action="springmvc/testRest/1" method="post"> <input type="hidden" name="_method" value="DELETE"/> <input type="submit" value="TestRest DELETE"/> </form> <form action="springmvc/testRest" method="post"> <input type="submit" value="testRest POST"> </form> </p> <p><a href="springmvc/testRest/1">test REST Get</a></p>运行tomcat,idea会自动打开主页点,下面链接,分别点它们即可