构造Restful风格的SpringMVC

pringmvc 3.0 中增加 RESTful URL功能,构造出类似javaeye现在的URL。 rest介绍 ,
这里还有struts2 rest构造的一篇文章: 使用
Struts 2 开发 RESTful 服务

简单例子如下,比如如下URL

Java代码 

  1. /blog/1  HTTP GET =>    得到id = 1的blog

  2. /blog/1  HTTP DELETE => 删除 id = 1的blog

  3. /blog/1  HTTP PUT  =>   更新id = 1的blog

  4. /blog     HTTP POST =>   新增BLOG

[java] view plaincopy

  1. /blog/1  HTTP GET =>    得到id = 1的blog

  2. /blog/1  HTTP DELETE => 删除 id = 1的blog

  3. /blog/1  HTTP PUT  =>   更新id = 1的blog

  4. /blog     HTTP POST =>   新增BLOG

以下详细解一下spring rest使用.

首先,我们带着如下个问题查看本文。
1.
如何在java构造没有扩展名的RESTful url,如 /forms/1,而不是 /forms/1.do

2. 由于我们要构造没有扩展名的url本来是处理静态资源的容器映射的,现在被我们的spring占用了,冲突怎么解决?
3.
浏览器的form标签不支持提交delete,put请求,如何曲线解决?

springmvc rest 实现


springmvc的resturl是通过@RequestMapping 及@PathVariable
annotation提供的,通过如@RequestMapping(value="/blog/{id}",method=RequestMethod.DELETE)即可处理/blog/1
的delete请求.

Java代码 

  1. @RequestMapping(value="/blog/{id}",method=RequestMethod.DELETE)

  2. public ModelAndView delete(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) {

  3. blogManager.removeById(id);

  4. return new ModelAndView(LIST_ACTION);

  5. }

[java] view plaincopy

  1. @RequestMapping(value="/blog/{id}",method=RequestMethod.DELETE)

  2. public ModelAndView delete(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) {

  3. blogManager.removeById(id);

  4. return new ModelAndView(LIST_ACTION);

  5. }

@RequestMapping @PathVariable如果URL中带参数,则配合使用,如

Java代码 

  1. @RequestMapping(value="/blog/{blogId}/message/{msgId}",method=RequestMethod.DELETE)

  2. public ModelAndView delete(@PathVariable("blogId") Long blogId,@PathVariable("msgId") Long msgId,HttpServletRequest request,HttpServletResponse response) {

  3. }

[java] view plaincopy

  1. @RequestMapping(value="/blog/{blogId}/message/{msgId}",method=RequestMethod.DELETE)

  2. public ModelAndView delete(@PathVariable("blogId") Long blogId,@PathVariable("msgId") Long msgId,HttpServletRequest request,HttpServletResponse response) {

  3. }

spring rest配置指南


1. springmvc web.xml配置

Xml代码 

  1. <!-- 该servlet为tomcat,jetty等容器提供,将静态资源映射从/改为/static/目录,如原来访问 http://localhost/foo.css ,现在http://localhost/static/foo.css -->

  2. <servlet-mapping>

  3. <servlet-name>default</servlet-name>

  4. <url-pattern>/static/*</url-pattern>

  5. </servlet-mapping>

  6. <servlet>

  7. <servlet-name>springmvc</servlet-name>

  8. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

  9. <load-on-startup>1</load-on-startup>

  10. </servlet>
  11. <!-- URL重写filter,用于将访问静态资源http://localhost/foo.css 转为http://localhost/static/foo.css -->

  12. <filter>

  13. <filter-name>UrlRewriteFilter</filter-name>

  14. <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>

  15. <init-param>

  16. <param-name>confReloadCheckInterval</param-name>

  17. <param-value>60</param-value>

  18. </init-param>

  19. <init-param>

  20. <param-name>logLevel</param-name>

  21. <param-value>DEBUG</param-value>

  22. </init-param>

  23. </filter>

  24. <filter-mapping>

  25. <filter-name>UrlRewriteFilter</filter-name>

  26. <url-pattern>/*</url-pattern>

  27. </filter-mapping>
  28. <!-- 覆盖default servlet的/, springmvc servlet将处理原来处理静态资源的映射 -->

  29. <servlet-mapping>

  30. <servlet-name>springmvc</servlet-name>

  31. <url-pattern>/</url-pattern>

  32. </servlet-mapping>
  33. <!-- 浏览器不支持put,delete等method,由该filter将/blog?_method=delete转换为标准的http delete方法 -->

  34. <filter>

  35. <filter-name>HiddenHttpMethodFilter</filter-name>

  36. <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>

  37. </filter>
  38. <filter-mapping>

  39. <filter-name>HiddenHttpMethodFilter</filter-name>

  40. <servlet-name>springmvc</servlet-name>

  41. </filter-mapping>

[xml] view plaincopy

  1. <!-- 该servlet为tomcat,jetty等容器提供,将静态资源映射从/改为/static/目录,如原来访问 http://localhost/foo.css ,现在http://localhost/static/foo.css -->

  2. <servlet-mapping>

  3. <servlet-name>default</servlet-name>

  4. <url-pattern>/static/*</url-pattern>

  5. </servlet-mapping>

  6. <servlet>

  7. <servlet-name>springmvc</servlet-name>

  8. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

  9. <load-on-startup>1</load-on-startup>

  10. </servlet>
  11. <!-- URL重写filter,用于将访问静态资源http://localhost/foo.css 转为http://localhost/static/foo.css -->

  12. <filter>

  13. <filter-name>UrlRewriteFilter</filter-name>

  14. <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>

  15. <init-param>

  16. <param-name>confReloadCheckInterval</param-name>

  17. <param-value>60</param-value>

  18. </init-param>

  19. <init-param>

  20. <param-name>logLevel</param-name>

  21. <param-value>DEBUG</param-value>

  22. </init-param>

  23. </filter>

  24. <filter-mapping>

  25. <filter-name>UrlRewriteFilter</filter-name>

  26. <url-pattern>/*</url-pattern>

  27. </filter-mapping>
  28. <!-- 覆盖default servlet的/, springmvc servlet将处理原来处理静态资源的映射 -->

  29. <servlet-mapping>

  30. <servlet-name>springmvc</servlet-name>

  31. <url-pattern>/</url-pattern>

  32. </servlet-mapping>
  33. <!-- 浏览器不支持put,delete等method,由该filter将/blog?_method=delete转换为标准的http delete方法 -->

  34. <filter>

  35. <filter-name>HiddenHttpMethodFilter</filter-name>

  36. <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>

  37. </filter>
  38. <filter-mapping>

  39. <filter-name>HiddenHttpMethodFilter</filter-name>

  40. <servlet-name>springmvc</servlet-name>

  41. </filter-mapping>

2.
webapp/WEB-INF/springmvc-servlet.xml配置,使用如下两个class激活@RequestMapping
annotation

Java代码 

  1. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

  2. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

[java] view plaincopy

  1. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

  2. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

完整配置

Java代码 

  1. <beans default-autowire="byName"   >
  2. <!-- 自动搜索@Controller标注的类 -->

  3. <context:component-scan base-package="com.**.controller"/>
  4. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
  5. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
  6. <!-- Default ViewResolver -->

  7. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

  8. <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>

  9. <property name="prefix" value="/pages"/>

  10. <property name="suffix" value=".jsp"></property>

  11. </bean>
  12. <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="i18n/messages"/>
  13. <!-- Mapping exception to the handler view -->

  14. <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

  15. <!-- to /commons/error.jsp -->

  16. <property name="defaultErrorView" value="/commons/error"/>

  17. <property name="exceptionMappings">

  18. <props>

  19. </props>

  20. </property>

  21. </bean>
  22. </beans>

[java] view plaincopy

  1. <beans default-autowire="byName"   >
  2. <!-- 自动搜索@Controller标注的类 -->

  3. <context:component-scan base-package="com.**.controller"/>
  4. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
  5. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
  6. <!-- Default ViewResolver -->

  7. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

  8. <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>

  9. <property name="prefix" value="/pages"/>

  10. <property name="suffix" value=".jsp"></property>

  11. </bean>
  12. <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="i18n/messages"/>
  13. <!-- Mapping exception to the handler view -->

  14. <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

  15. <!-- to /commons/error.jsp -->

  16. <property name="defaultErrorView" value="/commons/error"/>

  17. <property name="exceptionMappings">

  18. <props>

  19. </props>

  20. </property>

  21. </bean>
  22. </beans>

3. Controller编写

Java代码 

  1. /**

  2. * @RequestMapping("/userinfo") 具有层次关系,方法级的将在类一级@RequestMapping之一,

  3. * 如下面示例, 访问方法级别的@RequestMapping("/new"),则URL为 /userinfo/new

  4. */

  5. @Controller

  6. @RequestMapping("/userinfo")

  7. public class UserInfoController extends BaseSpringController{

  8. //默认多列排序,example: username desc,createTime asc

  9. protected static final String DEFAULT_SORT_COLUMNS = null;
  10. private UserInfoManager userInfoManager;
  11. private final String LIST_ACTION = "redirect:/userinfo";
  12. /**

  13. * 通过spring自动注入

  14. **/

  15. public void setUserInfoManager(UserInfoManager manager) {

  16. this.userInfoManager = manager;

  17. }
  18. /** 列表 */

  19. @RequestMapping

  20. public ModelAndView index(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) {

  21. PageRequest<Map> pageRequest = newPageRequest(request,DEFAULT_SORT_COLUMNS);

  22. //pageRequest.getFilters(); //add custom filters
  23. Page page = this.userInfoManager.findByPageRequest(pageRequest);

  24. savePage(page,pageRequest,request);

  25. return new ModelAndView("/userinfo/list","userInfo",userInfo);

  26. }
  27. /** 进入新增 */

  28. @RequestMapping(value="/new")

  29. public ModelAndView _new(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) throws Exception {

  30. return new ModelAndView("/userinfo/new","userInfo",userInfo);

  31. }
  32. /** 显示 */

  33. @RequestMapping(value="/{id}")

  34. public ModelAndView show(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {

  35. UserInfo userInfo = (UserInfo)userInfoManager.getById(id);

  36. return new ModelAndView("/userinfo/show","userInfo",userInfo);

  37. }
  38. /** 编辑 */

  39. @RequestMapping(value="/{id}/edit")

  40. public ModelAndView edit(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {

  41. UserInfo userInfo = (UserInfo)userInfoManager.getById(id);

  42. return new ModelAndView("/userinfo/edit","userInfo",userInfo);

  43. }
  44. /** 保存新增 */

  45. @RequestMapping(method=RequestMethod.POST)

  46. public ModelAndView create(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) throws Exception {

  47. userInfoManager.save(userInfo);

  48. return new ModelAndView(LIST_ACTION);

  49. }
  50. /** 保存更新 */

  51. @RequestMapping(value="/{id}",method=RequestMethod.PUT)

  52. public ModelAndView update(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {

  53. UserInfo userInfo = (UserInfo)userInfoManager.getById(id);

  54. bind(request,userInfo);

  55. userInfoManager.update(userInfo);

  56. return new ModelAndView(LIST_ACTION);

  57. }
  58. /** 删除 */

  59. @RequestMapping(value="/{id}",method=RequestMethod.DELETE)

  60. public ModelAndView delete(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) {

  61. userInfoManager.removeById(id);

  62. return new ModelAndView(LIST_ACTION);

  63. }
  64. /** 批量删除 */

  65. @RequestMapping(method=RequestMethod.DELETE)

  66. public ModelAndView batchDelete(@RequestParam("items") Long[] items,HttpServletRequest request,HttpServletResponse response) {
  67. for(int i = 0; i < items.length; i++) {
  68. userInfoManager.removeById(items[i]);

  69. }

  70. return new ModelAndView(LIST_ACTION);

  71. }
  72. }

[java] view plaincopy

  1. /**

  2. * @RequestMapping("/userinfo") 具有层次关系,方法级的将在类一级@RequestMapping之一,

  3. * 如下面示例, 访问方法级别的@RequestMapping("/new"),则URL为 /userinfo/new

  4. */

  5. @Controller

  6. @RequestMapping("/userinfo")

  7. public class UserInfoController extends BaseSpringController{

  8. //默认多列排序,example: username desc,createTime asc

  9. protected static final String DEFAULT_SORT_COLUMNS = null;
  10. private UserInfoManager userInfoManager;
  11. private final String LIST_ACTION = "redirect:/userinfo";
  12. /**

  13. * 通过spring自动注入

  14. **/

  15. public void setUserInfoManager(UserInfoManager manager) {

  16. this.userInfoManager = manager;

  17. }
  18. /** 列表 */

  19. @RequestMapping

  20. public ModelAndView index(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) {

  21. PageRequest<Map> pageRequest = newPageRequest(request,DEFAULT_SORT_COLUMNS);

  22. //pageRequest.getFilters(); //add custom filters
  23. Page page = this.userInfoManager.findByPageRequest(pageRequest);

  24. savePage(page,pageRequest,request);

  25. return new ModelAndView("/userinfo/list","userInfo",userInfo);

  26. }
  27. /** 进入新增 */

  28. @RequestMapping(value="/new")

  29. public ModelAndView _new(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) throws Exception {

  30. return new ModelAndView("/userinfo/new","userInfo",userInfo);

  31. }
  32. /** 显示 */

  33. @RequestMapping(value="/{id}")

  34. public ModelAndView show(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {

  35. UserInfo userInfo = (UserInfo)userInfoManager.getById(id);

  36. return new ModelAndView("/userinfo/show","userInfo",userInfo);

  37. }
  38. /** 编辑 */

  39. @RequestMapping(value="/{id}/edit")

  40. public ModelAndView edit(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {

  41. UserInfo userInfo = (UserInfo)userInfoManager.getById(id);

  42. return new ModelAndView("/userinfo/edit","userInfo",userInfo);

  43. }
  44. /** 保存新增 */

  45. @RequestMapping(method=RequestMethod.POST)

  46. public ModelAndView create(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) throws Exception {

  47. userInfoManager.save(userInfo);

  48. return new ModelAndView(LIST_ACTION);

  49. }
  50. /** 保存更新 */

  51. @RequestMapping(value="/{id}",method=RequestMethod.PUT)

  52. public ModelAndView update(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {

  53. UserInfo userInfo = (UserInfo)userInfoManager.getById(id);

  54. bind(request,userInfo);

  55. userInfoManager.update(userInfo);

  56. return new ModelAndView(LIST_ACTION);

  57. }
  58. /** 删除 */

  59. @RequestMapping(value="/{id}",method=RequestMethod.DELETE)

  60. public ModelAndView delete(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) {

  61. userInfoManager.removeById(id);

  62. return new ModelAndView(LIST_ACTION);

  63. }
  64. /** 批量删除 */

  65. @RequestMapping(method=RequestMethod.DELETE)

  66. public ModelAndView batchDelete(@RequestParam("items") Long[] items,HttpServletRequest request,HttpServletResponse response) {
  67. for(int i = 0; i < items.length; i++) {
  68. userInfoManager.removeById(items[i]);

  69. }

  70. return new ModelAndView(LIST_ACTION);

  71. }
  72. }

上面是rapid-framework新版本生成器生成的代码,以后也将应用此规则,rest
url中增删改查等基本方法与Controller的方法映射规则

Java代码 

  1. /userinfo           => index()

  2. /userinfo/new       => _new()

  3. /userinfo/{id}      => show()

  4. /userinfo/{id}/edit         => edit()

  5. /userinfo   POST        => create()

  6. /userinfo/{id}  PUT => update()

  7. /userinfo/{id}  DELETE  => delete()

  8. /userinfo   DELETE      => batchDelete()

[java] view plaincopy

  1. /userinfo           => index()

  2. /userinfo/new       => _new()

  3. /userinfo/{id}      => show()

  4. /userinfo/{id}/edit         => edit()

  5. /userinfo   POST        => create()

  6. /userinfo/{id}  PUT => update()

  7. /userinfo/{id}  DELETE  => delete()

  8. /userinfo   DELETE      => batchDelete()

注(不使用 /userinfo/add  => add()
方法是由于add这个方法会被maxthon浏览器当做广告链接过滤掉,因为包含ad字符)

4. jsp 编写

Html代码 

  1. <form:form action="${ctx}/userinfo/${userInfo.userId}" method="put">

  2. </form:form>

[html] view plaincopy

  1. <form:form action="${ctx}/userinfo/${userInfo.userId}" method="put">

  2. </form:form>

生成的html内容如下,
生成一个hidden的_method=put,并于web.xml中的HiddenHttpMethodFilter配合使用,在服务端将post请求改为put请求

Java代码 

  1. <form id="userInfo" action="/springmvc_rest_demo/userinfo/2" method="post">

  2. <input type="hidden" name="_method" value="put"/>

  3. </form>

[java] view plaincopy

  1. <form id="userInfo" action="/springmvc_rest_demo/userinfo/2" method="post">

  2. <input type="hidden" name="_method" value="put"/>

  3. </form>

另外一种方法是你可以使用ajax发送put,delete请求.

5. 静态资源的URL重写

如上我们描述,现因为将default
servlet映射至/static/的子目录,现我们访问静态资源将会带一个/static/前缀.

如 /foo.gif, 现在访问该文件将是 /static/foo.gif.
  
那如何避免这个前缀呢,那就是应用URL rewrite,现我们使用 http://tuckey.org/urlrewrite/,
重写规则如下

Xml代码 

  1. <urlrewrite>

  2. <!-- 访问jsp及jspx将不rewrite url,其它.js,.css,.gif等将重写,如 /foo.gif => /static/foo.gif -->

  3. <rule>

  4. <condition operator="notequal" next="and" type="request-uri">.*.jsp</condition>

  5. <condition operator="notequal" next="and" type="request-uri">.*.jspx</condition>

  6. <from>^(/.*/..*)$</from>

  7. <to>/static$1</to>

  8. </rule>

  9. </urlrewrite>

[xml] view plaincopy

  1. <urlrewrite>

  2. <!-- 访问jsp及jspx将不rewrite url,其它.js,.css,.gif等将重写,如 /foo.gif => /static/foo.gif -->

  3. <rule>

  4. <condition operator="notequal" next="and" type="request-uri">.*.jsp</condition>

  5. <condition operator="notequal" next="and" type="request-uri">.*.jspx</condition>

  6. <from>^(/.*/..*)$</from>

  7. <to>/static$1</to>

  8. </rule>

  9. </urlrewrite>

另笔者专门写了一个 RestUrlRewriteFilter来做同样的事件,以后会随着rapid-framework一起发布.
比这个更加轻量级.

并且该代码已经贡献给spring,不知会不会在下一版本发布

构造Restful风格的SpringMVC,布布扣,bubuko.com

时间: 2024-10-05 21:10:42

构造Restful风格的SpringMVC的相关文章

MockMVC - 基于RESTful风格的SpringMVC的测试

MockMVC - 基于RESTful风格的SpringMVC的测试 对于前后端分离的项目而言,无法直接从前端静态代码中测试接口的正确性,因此可以通过MockMVC来模拟HTTP请求.基于RESTful风格的SpringMVC的测试,我们可以测试完整的Spring MVC流程,即从URL请求到控制器处理,再到视图渲染都可以测试. package test.example.controller; import com.DemoApplication; import com.example.enti

restful风格。Springmvc

1. restful风格.Springmvc  Localhost:8080/springmvc-01/user Method=”post” Uri:资源的形式传递到后台. Delete 删除. Localhost:8080/springmvc-01/user/3 Get:查询操作 Localhost:8080/springmvc-01/user/1 Post:添加Localhost:8080/springmvc-01/user Put:修改 Localhost:8080/springmvc-0

restful 风格 加上springmvc

一.spring 版本:spring-framework-3.2.7.RELEASE 二.所需其它Jar包: 三.主要代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

Restful风格API接口开发springMVC篇

Restful风格的API是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. 在Restful风格中,用户请求的url使用同一个url而用请求方式:get,post,delete,put...等方式对请求的处理方法进行区分,这样可以在前后台分离式的开发中使得前端开发人员不会对请求的资源地址产生混淆和大量的检查方法名的麻烦,形成一个统一的接口. 在Restful风格中,现

SpringMVC实现Restful风格的WebService

1.环境 JDK7 MyEclipse2014 tomcat8 maven 3.3.3 spring4.1.4 2.创建maven工程 使用MyEclipse创建maven工程的方式可以参考这篇博文(链接1), 该博文中的第四小结是关于如何创建SpringMVC+maven教程.下面只给出创建好的目录结构,其中的部分文件如java程序是后面要完成的. 3.指定依赖文件 maven具有特定的文件结构,并通过pom.xml来管理工程.下面是在实现Restful时需要的依赖. 1 <project x

springMVC+json构建restful风格的服务

首先.要知道什么是rest服务,什么是rest服务呢? REST(英文:Representational State Transfer,简称REST)描写叙述了一个架构样式的网络系统.比方 web 应用程序. 它首次出如今 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之中的一个. 在眼下主流的三种Web服务交互方案中.REST相比于SOAP(Simple Object Access protocol,简单对象訪问协议)以及XML-RPC更加简单明了,不管

springMvc框架之Restful风格

method: @Controller @RequestMapping("/test") public String MyController{ @RequestMapping("/begin") public String hi(HttpServletRequest request){ String name=request.getParameter("name"); System.out.println(name); return "

SpringMVC简单构造restful, 并返回json

文章要要点: 快速搭建构造restful的StringMvc GET, POST , PUT , DELETE的各种调用 同一资源 多种表述 (ContentNegotiatingViewResolver解析器),既可以返回对象给JSP, 也可以返回JSON 快速搭建构造restful的StringMvc 首现搭建一个简单的restfulMvc框架,  并上配置文件, 后期会增加带JSON返回值的配置 JAR包 web.xml配置 ? 1 2 3 4 5 6 7 8 9 10 11 12 13

springMvc中restful风格的api路径中把小数点当参数,SpringMvc中url有小数点

在springMvc web项目中restful风格的api路径中有小数点会被过滤后台拿不到最后一个小数点的问题, 有两种解决方案: 1:在api路径中加入:.+ @RequestMapping("/findByIp/{ip:.+}") public Object test(@PathVariable String ip) { System.out.println(ip); return ""; } 但这种方式在web服务中感觉太过于鸡肋 所以在springMvc.