`
du_bo
  • 浏览: 41301 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类

Spring mvc 构造RESTful URL 详细讲解

 
阅读更多

springmvc 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  

 

 

以下详细解一下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. }  

 

@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. }  

 

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

 

 

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

转自:http://blog.sina.com.cn/s/blog_3eb0a8bc0100qmtf.html

分享到:
评论

相关推荐

    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-3.0-应用springmvc-构造RESTful-URL-详细讲解

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

    Spring MVC – Easy REST-Based JSON Services with @ResponseBody

    标签"源码"意味着文章可能深入讲解了Spring MVC框架的内部实现,或者提供了自定义的代码示例。"工具"可能指的是使用了一些辅助工具或库,如IDE、构建工具(Maven或Gradle)、JSON库(Jackson或Gson)等,以帮助开发...

    Spring3 MVC

    其资源中包括三个文档,仅供学习与参考。 1.spring3mvc真正入门资料 2.spring3.0MVC注解(附实例) 3.spring_3.0_应用springmvc_构造RESTful_URL_详细讲解

    Beginning Spring(2015)

    本章详细解释了如何使用Spring MVC来构建结构清晰且易于扩展的Web应用程序,并涵盖了控制器、视图解析器和其他关键组件。 #### 使用Spring访问JDBC数据 第四章讨论了如何利用Spring框架来简化JDBC数据访问操作。...

    Spring5-尚硅谷框架课堂笔记.rar

    6. **MVC 框架**:Spring MVC 是 Spring 用于构建 Web 应用的模块,提供模型-视图-控制器架构,支持 RESTful 风格的 URL 设计,以及视图解析、数据绑定等功能。 7. **Spring Boot**:Spring Boot 是 Spring 的一个...

    spring面试题

    它提供模型-视图-控制器(MVC)架构,支持RESTful风格的URL设计,使Web开发更加简洁和灵活。 2. Spring JDBC与ORM集成 Spring JDBC模块简化了数据库操作,通过JdbcTemplate和NamedParameterJdbcTemplate提供模板...

    spring学习资源共享

    Spring MVC提供了模型-视图-控制器(MVC)架构模式的实现,支持RESTful风格的URL设计,以及视图解析和数据绑定等功能。 总的来说,这份资源共享包含了Spring框架的关键知识点,对于初学者和有一定经验的开发者来说...

    SpringMVC自定义多视图

    总的来说,自定义多视图是Spring MVC中增强灵活性和可扩展性的重要手段,它允许我们根据需求动态地选择和构造视图,从而满足不同用户和系统的交互需求。通过深入理解和实践,你可以有效地利用这一特性来优化你的Web...

    SPRING开发指南

    文件列表中的"spring技术手册"很可能是涵盖所有这些主题的详细指南,包含了Spring框架的各个方面,从基础到高级特性的讲解,对初学者和有经验的开发者都有很高的参考价值。通过系统学习,你将能熟练掌握Spring,提升...

    spring宝典书源码04

    Spring MVC还支持RESTful风格的URL设计,以及视图解析器、数据绑定和验证等功能。 6. **Spring Boot**:Spring Boot简化了Spring应用程序的启动和配置过程,通过自动配置和“起步依赖”使快速开发成为可能。它内置...

    Spring3.2中文版.docx

    4. **Web层的REST支持**:Spring MVC增加了对RESTful服务的支持,通过`@RequestMapping`注解可以轻松创建RESTful API。 5. **声明式模型验证**:Spring 3.2支持JSR-303/JSR-349标准的声明式模型验证,简化了数据校验...

    Spring in Action

    它包含处理器映射、视图解析、数据绑定等功能,支持RESTful风格的URL设计。 6. **Spring Boot**:为简化Spring应用的初始搭建和运行过程而生,通过默认配置和“起步依赖”简化了项目的创建和配置。Spring Boot可以...

    Spring面试专题.rar

    3. **RESTful API设计**:使用HTTP动词、URL路径和状态码来实现RESTful风格的服务。 4. **数据绑定和验证**:了解DataBinder和Validation的使用,以及自定义验证规则。 5. **SpringMVC拦截器**:实现拦截器,用于...

    032-return-file-from-spring-rest-webservice

    本文将深入探讨如何在Spring RESTful API中返回文件,以此为“032-return-file-from-spring-rest-webservice”这一主题提供详尽的解释。我们将讨论相关的Java技术和Spring MVC框架的核心概念,以及如何实现在REST...

    Spring中的REST分页的实现代码

    本文将详细讲解如何利用Spring Boot和Spring Data在Spring MVC框架下构建RESTful分页API。 首先,我们要明确资源与表示的概念。在RESTful API设计中,一个页面本身并不是一个独立的资源,而是对资源(如产品)请求...

    springboot注解.docx

    以下是一些关键的Spring Boot注解及其详细解释: 1. **@SpringBootApplication**:这是Spring Boot应用程序的核心注解,它包含了`@Configuration`、`@EnableAutoConfiguration`和`@ComponentScan`三个注解的功能。`...

    Android客户端+web服务端实现图片上传

    以下是这些领域的详细解释: 1. **Android客户端开发**: - **Activity和Intent**:在Android应用中,Activity是用户界面的基本单元,而Intent用于启动新的Activity或传递数据。在此场景中,可能使用Intent来启动...

    javaWeb开发PPT大全

    11. **Struts、Spring MVC或JSF框架**:可能会涉及一种或多种主流的JavaWeb框架,讲解它们的架构、优势以及如何使用它们简化开发。 12. **Ajax(Asynchronous JavaScript and XML)**:讲解如何使用Ajax实现页面的...

Global site tag (gtag.js) - Google Analytics