`
xiangxingchina
  • 浏览: 523575 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring mvc 构造RESTful URL 详细讲解(spring 3.0 应用)

 
阅读更多
详细讲解spring rest使用,简单例子如下:
  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    

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

2. 由于我们要构造没有扩展名的url本来是处理静态资源的容器映射的,现在被我们的spring占用了,冲突怎么解决?

3. 浏览器的form标签不支持提交delete,put请求,如何曲线解决?

 

spring mvc rest 实现


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

  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中带参数,则配合使用,如

  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. spring mvc web.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.   
  12. <!-- URL重写filter,用于将访问静态资源http://localhost/foo.css 转为http://localhost/static/foo.css -->   
  13. < filter >   
  14.     < filter-name > UrlRewriteFilter </ filter-name >   
  15.     < filter-class > org.tuckey.web.filters.urlrewrite.UrlRewriteFilter </ filter-class >   
  16.     < init-param >   
  17.             < param-name > confReloadCheckInterval </ param-name >   
  18.             < param-value > 60 </ param-value >   
  19.         </ init-param >   
  20.     < init-param >   
  21.                 < param-name > logLevel </ param-name >   
  22.                 < param-value > DEBUG </ param-value >   
  23.         </ init-param >        
  24. </ filter >   
  25. < filter-mapping >   
  26.     < filter-name > UrlRewriteFilter </ filter-name >   
  27.     < url-pattern > /* </ url-pattern >   
  28. </ filter-mapping >   
  29.   
  30. <!-- 覆盖default servlet的/, springmvc servlet将处理原来处理静态资源的映射 -->   
  31. < servlet-mapping >   
  32.     < servlet-name > springmvc </ servlet-name >   
  33.     < url-pattern > / </ url-pattern >   
  34. </ servlet-mapping >   
  35.   
  36. <!-- 浏览器不支持put,delete等method,由该filter将/blog?_method=delete转换为标准的http delete方法 -->   
  37. < filter >   
  38.     < filter-name > HiddenHttpMethodFilter </ filter-name >   
  39.     < filter-class > org.springframework.web.filter.HiddenHttpMethodFilter </ filter-class >   
  40. </ filter >   
  41.   
  42. < filter-mapping >   
  43.     < filter-name > HiddenHttpMethodFilter </ filter-name >   
  44.     < servlet-name > springmvc </ servlet-name >   
  45. </ filter-mapping >   

 

 

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

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

 

完整配置

  1. <beans  default -autowire= "byName"    >  
  2.   
  3.     <!-- 自动搜索@Controller 标注的类 -->  
  4.     <context:component-scan base-package = "com.**.controller" />  
  5.       
  6.     <bean class = "org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />  
  7.   
  8.     <bean class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />  
  9.   
  10.     <!-- Default ViewResolver -->  
  11.     <bean id="viewResolver"   class = "org.springframework.web.servlet.view.InternalResourceViewResolver" >  
  12.         <property name="viewClass"  value= "org.springframework.web.servlet.view.JstlView" />  
  13.         <property name="prefix"  value= "/pages" />  
  14.         <property name="suffix"  value= ".jsp" ></property>  
  15.     </bean>  
  16.       
  17.     <bean id="messageSource"   class = "org.springframework.context.support.ResourceBundleMessageSource"  p:basename= "i18n/messages" />  
  18.   
  19.     <!-- Mapping exception to the handler view -->  
  20.     <bean id="exceptionResolver"   class = "org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" >  
  21.         <!-- to /commons/error.jsp -->  
  22.         <property name="defaultErrorView"  value= "/commons/error" />  
  23.         <property name="exceptionMappings" >  
  24.             <props>  
  25.             </props>  
  26.         </property>  
  27.     </bean>  
  28.           
  29. </beans>  

 

 

3. Controller编写

  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.       
  11.     private  UserInfoManager userInfoManager;  
  12.       
  13.     private   final  String LIST_ACTION =  "redirect:/userinfo" ;  
  14.       
  15.     /**   
  16.      * 通过spring自动注入  
  17.      **/   
  18.     public   void  setUserInfoManager(UserInfoManager manager) {  
  19.         this .userInfoManager = manager;  
  20.     }  
  21.       
  22.     /** 列表 */   
  23.     @RequestMapping   
  24.     public  ModelAndView index(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) {  
  25.         PageRequest<Map> pageRequest = newPageRequest(request,DEFAULT_SORT_COLUMNS);  
  26.         //pageRequest.getFilters(); //add custom filters   
  27.           
  28.         Page page = this .userInfoManager.findByPageRequest(pageRequest);  
  29.         savePage(page,pageRequest,request);  
  30.         return   new  ModelAndView( "/userinfo/list" , "userInfo" ,userInfo);  
  31.     }  
  32.       
  33.     /** 进入新增 */   
  34.     @RequestMapping (value= "/new" )  
  35.     public  ModelAndView _new(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo)  throws  Exception {  
  36.         return   new  ModelAndView( "/userinfo/new" , "userInfo" ,userInfo);  
  37.     }  
  38.       
  39.     /** 显示 */   
  40.     @RequestMapping (value= "/{id}" )  
  41.     public  ModelAndView show( @PathVariable  Long id,HttpServletRequest request,HttpServletResponse response)  throws  Exception {  
  42.         UserInfo userInfo = (UserInfo)userInfoManager.getById(id);  
  43.         return   new  ModelAndView( "/userinfo/show" , "userInfo" ,userInfo);  
  44.     }  
  45.       
  46.     /** 编辑 */   
  47.     @RequestMapping (value= "/{id}/edit" )  
  48.     public  ModelAndView edit( @PathVariable  Long id,HttpServletRequest request,HttpServletResponse response)  throws  Exception {  
  49.         UserInfo userInfo = (UserInfo)userInfoManager.getById(id);  
  50.         return   new  ModelAndView( "/userinfo/edit" , "userInfo" ,userInfo);  
  51.     }  
  52.       
  53.     /** 保存新增 */   
  54.     @RequestMapping (method=RequestMethod.POST)  
  55.     public  ModelAndView create(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo)  throws  Exception {  
  56.         userInfoManager.save(userInfo);  
  57.         return   new  ModelAndView(LIST_ACTION);  
  58.     }  
  59.       
  60.     /** 保存更新 */   
  61.     @RequestMapping (value= "/{id}" ,method=RequestMethod.PUT)  
  62.     public  ModelAndView update( @PathVariable  Long id,HttpServletRequest request,HttpServletResponse response)  throws  Exception {  
  63.         UserInfo userInfo = (UserInfo)userInfoManager.getById(id);  
  64.         bind(request,userInfo);  
  65.         userInfoManager.update(userInfo);  
  66.         return   new  ModelAndView(LIST_ACTION);  
  67.     }  
  68.       
  69.     /** 删除 */   
  70.     @RequestMapping (value= "/{id}" ,method=RequestMethod.DELETE)  
  71.     public  ModelAndView delete( @PathVariable  Long id,HttpServletRequest request,HttpServletResponse response) {  
  72.         userInfoManager.removeById(id);  
  73.         return   new  ModelAndView(LIST_ACTION);  
  74.     }  
  75.   
  76.     /** 批量删除 */   
  77.     @RequestMapping (method=RequestMethod.DELETE)  
  78.     public  ModelAndView batchDelete( @RequestParam ( "items" ) Long[] items,HttpServletRequest request,HttpServletResponse response) {  
  79.           
  80.         for ( int  i =  0 ; i < items.length; i++) {  
  81.               
  82.             userInfoManager.removeById(items[i]);  
  83.         }  
  84.         return   new  ModelAndView(LIST_ACTION);  
  85.     }  
  86.       
  87. }  

 

 

上面是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()  

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

 

4. jsp 编写

Html代码
  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>  

 

另外一种方法是你可以使用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 >
分享到:
评论

相关推荐

    spring 3.0 应用springmvc 构造RESTful URL 详细讲解

    在Spring 3.0框架中,Spring MVC是一个强大的用于构建Web应用程序的模块,它支持构建RESTful风格的URL,使得应用程序更加符合Web服务的最佳实践。REST(Representational State Transfer)是一种设计模式,强调通过...

    spring_3.0_应用springmvc_构造RESTful_URL_详细讲解

    在IT行业中,Spring框架是Java企业级应用开发的首选,而Spring MVC是Spring框架的一个重要...文档`spring_3.0_应用springmvc_构造RESTful_URL_详细讲解.docx`应该包含了更详尽的步骤和示例,帮助读者深入理解这一主题。

    spring mvc restful service

    Spring MVC 是一个强大的Java框架,用于构建Web应用程序,特别是对于基于模型-视图-控制器(MVC)架构的应用。在本文中,我们将深入探讨如何利用Spring MVC创建RESTful服务,这些服务可以处理字符串、JSON和XML数据...

    spring-3.0-应用springmvc-构造RESTful-URL-详细讲解

    在本文中,我们将深入探讨如何在Spring 3.0中应用Spring MVC来构建RESTful URL,以实现更加优雅和功能强大的Web服务。REST(Representational State Transfer)是一种架构风格,用于构建基于HTTP协议的Web服务,它...

    [spring 3.0] mvc 整合 restful 、maven实例 下载

    在本文中,我们将深入探讨如何在Spring 3.0中整合MVC框架与RESTful服务,并结合Maven构建项目。RESTful(Representational State Transfer)是一种软件架构风格,用于设计网络应用程序,尤其适用于Web服务。Spring ...

    精通Spring MVC 4

    本书共计10章,分别介绍了快速搭建Spring Web应用、精通MVC结构、URL映射、文件上传与错误处理、创建Restful应用、保护应用、单元测试与验收测试、优化请求、将Web应用部署到云等内容,循序渐进地讲解了Spring MVC4...

    RESTful_Spring3MVC

    Spring 3 MVC框架是Java开发者广泛使用的构建Web应用的工具,它为开发RESTful API提供了强大的支持。本教程将深入探讨如何利用Spring 3 MVC实现RESTful服务。 首先,理解REST的基本原则至关重要。RESTful架构有以下...

    spring3.0 mvc中文实例教程

    Spring3.0 MVC是Spring框架的重要组成部分,专注于构建高性能、健壮的Web应用程序。这个框架具有高度可配置性,允许开发者将各个逻辑和功能模块进行分离,增强了代码的可维护性和可扩展性。Spring MVC不仅能够独立...

    最全最经典spring-mvc教程

    这个"最全最经典spring-mvc教程"应该会详细讲解上述所有概念,并可能通过实例演示如何配置、创建和调试Spring MVC项目。对于想要深入理解和使用Spring MVC的开发者来说,这是一份非常宝贵的资源。通过学习这个教程,...

    spring3.0 MVC中文教程

    2. **第2部分:在Spring 3.0 MVC中创建Hello World应用程序** - 通过一个简单的示例来展示如何快速启动一个Spring MVC项目。 3. **第3部分:在Spring 3.0 MVC中进行表单处理** - 探讨如何使用Spring MVC处理表单提交...

    Spring-MVC-3.0.rar_Java spring mvc_spring mvc_spring ppt

    这份PPT很可能涵盖了Spring MVC 3.0的基本概念、配置、控制器、模型绑定、视图解析、拦截器以及如何构建RESTful服务等内容。通过学习,开发者能够了解如何创建Controller、配置DispatcherServlet、处理请求和响应,...

    spring3.0+spring mvc3.0+mybaits3.0

    Spring MVC 3.0作为Spring框架的一部分,专门用于构建Web应用程序,提供了优雅的模型-视图-控制器(MVC)架构模式。同时,MyBatis 3.0作为一个轻量级的持久层框架,以其简单易用和高度灵活的特点,成为了数据库操作...

    spring3.0MVC中文教材

    **Spring 3.0 MVC**是Spring框架的一个重要组成部分,专注于构建Web应用程序。相较于之前的版本,Spring 3.0 MVC引入了许多重要的改进和新特性,使其成为企业级Web开发的首选框架之一。 - **Spring MVC作为Web组件*...

    spring3.0支持restful的demo

    在Spring 3.0中,Spring MVC添加了对RESTful服务的支持,通过以下关键组件实现: 1. **@RestController**:这是一个注解,用于标记控制器类,表明该类将处理HTTP请求并返回JSON或XML等资源。与传统的@Controller...

    Mastering Spring MVC 4(2015.09)源码

    首先,Spring MVC 4基于Servlet 3.0规范,这意味着它可以利用异步处理能力,提高了Web应用的性能。通过AsyncSupport和AsyncConfigurer接口,开发者可以轻松地创建异步控制器,处理高并发场景。 控制器(Controller...

    Spring3.0MvcDemo

    《Spring 3.0 MVC 框架深度解析与实战指南》 在现代Web开发中,Spring框架以其强大的功能和灵活性备受青睐,尤其是其MVC模块,为构建高性能、易于维护的Web应用提供了坚实的基础。本文将深入探讨Spring 3.0版本的...

    Spring MVC 教程快速入门 深入分析

    Spring MVC是一种基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,使用了IoC容器,支持RESTful风格的应用程序开发。Spring MVC通过分离模型(Model)、视图(View)和控制器(Controller)来简化Web开发...

    Spring MVC 4.2.3

    Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构,使开发者能够有效地分离业务逻辑、数据处理和用户界面。在"Spring MVC 4.2.3"版本中,我们看到了一系列的...

    spring3.0 mvc和rest入门例子

    Spring 3.0 MVC 和 REST 是 Java Web 开发中的重要组成部分,它们为构建现代、高效的应用程序提供了强大的框架支持。本文将深入探讨这两个概念以及如何通过一个入门实例来理解它们。 Spring MVC(Model-View-...

    spring mvc 4.0

    Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序提供模型-视图-控制器(MVC)架构。在Spring MVC 4.0版本中,它引入了许多改进和新特性,以提升开发效率和应用程序的性能。 1. **依赖注入**:Spring ...

Global site tag (gtag.js) - Google Analytics