springmvc 3.0 中增加 RESTful URL功能,构造出类似javaeye现在的URL。 rest介绍 , 这里还有struts2 rest构造的一篇文章: 使用 Struts 2 开发 RESTful 服务
简单例子如下,比如如下URL
- /blog/1 HTTP GET => 得到id = 1的blog
- /blog/1 HTTP DELETE => 删除 id = 1的blog
- /blog/1 HTTP PUT => 更新id = 1的blog
- /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请求.
- @RequestMapping(value="/blog/{id}",method=RequestMethod.DELETE)
- public ModelAndView delete(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) {
- blogManager.removeById(id);
- return new ModelAndView(LIST_ACTION);
- }
@RequestMapping @PathVariable如果URL中带参数,则配合使用,如
- @RequestMapping(value="/blog/{blogId}/message/{msgId}",method=RequestMethod.DELETE)
- public ModelAndView delete(@PathVariable("blogId") Long blogId,@PathVariable("msgId") Long msgId,HttpServletRequest request,HttpServletResponse response) {
- }
spring rest配置指南
1. springmvc web.xml配置
- <!-- 该servlet为tomcat,jetty等容器提供,将静态资源映射从/改为/static/目录,如原来访问 http://localhost/foo.css ,现在http://localhost/static/foo.css -->
- <servlet-mapping>
- <servlet-name>default</servlet-name>
- <url-pattern>/static
- @Controller
- @RequestMapping("/userinfo")
- public class UserInfoController extends BaseSpringController{
- //默认多列排序,example: username desc,createTime asc
- protected static final String DEFAULT_SORT_COLUMNS = null;
- private UserInfoManager userInfoManager;
- private final String LIST_ACTION = "redirect:/userinfo";
- public void setUserInfoManager(UserInfoManager manager) {
- this.userInfoManager = manager;
- }
- @RequestMapping
- public ModelAndView index(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) {
- PageRequest<Map> pageRequest = newPageRequest(request,DEFAULT_SORT_COLUMNS);
- //pageRequest.getFilters(); //add custom filters
- Page page = this.userInfoManager.findByPageRequest(pageRequest);
- savePage(page,pageRequest,request);
- return new ModelAndView("/userinfo/list","userInfo",userInfo);
- }
- @RequestMapping(value="/new")
- public ModelAndView _new(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) throws Exception {
- return new ModelAndView("/userinfo/new","userInfo",userInfo);
- }
- @RequestMapping(value="/{id}")
- public ModelAndView show(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {
- UserInfo userInfo = (UserInfo)userInfoManager.getById(id);
- return new ModelAndView("/userinfo/show","userInfo",userInfo);
- }
- @RequestMapping(value="/{id}/edit")
- public ModelAndView edit(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {
- UserInfo userInfo = (UserInfo)userInfoManager.getById(id);
- return new ModelAndView("/userinfo/edit","userInfo",userInfo);
- }
- @RequestMapping(method=RequestMethod.POST)
- public ModelAndView create(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) throws Exception {
- userInfoManager.save(userInfo);
- return new ModelAndView(LIST_ACTION);
- }
- @RequestMapping(value="/{id}",method=RequestMethod.PUT)
- public ModelAndView update(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {
- UserInfo userInfo = (UserInfo)userInfoManager.getById(id);
- bind(request,userInfo);
- userInfoManager.update(userInfo);
- return new ModelAndView(LIST_ACTION);
- }
- @RequestMapping(value="/{id}",method=RequestMethod.DELETE)
- public ModelAndView delete(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) {
- userInfoManager.removeById(id);
- return new ModelAndView(LIST_ACTION);
- }
- @RequestMapping(method=RequestMethod.DELETE)
- public ModelAndView batchDelete(@RequestParam("items") Long[] items,HttpServletRequest request,HttpServletResponse response) {
- for(int i = 0; i < items.length; i++) {
- userInfoManager.removeById(items[i]);
- }
- return new ModelAndView(LIST_ACTION);
- }
- }
上面是rapid-framework 新版本生成器生成的代码,以后也将应用此规则,rest url中增删改查等基本方法与Controller的方法映射规则
- /userinfo => index()
- /userinfo/new => _new()
- /userinfo/{id} => show()
- /userinfo/{id}/edit => edit()
- /userinfo POST => create()
- /userinfo/{id} PUT => update()
- /userinfo/{id} DELETE => delete()
- /userinfo DELETE => batchDelete()
注(不使用 /userinfo/add => add() 方法是由于add这个方法会被maxthon浏览器当做广告链接过滤掉,因为包含ad字符)
4. jsp 编写
- <form:form action="${ctx}/userinfo/${userInfo.userId}" method="put">
- </form:form>
生成的html内容如下, 生成一个hidden的_method=put,并于web.xml中的HiddenHttpMethodFilter配合使用,在服务端将post请求改为put请求
- <form id="userInfo" action="/springmvc_rest_demo/userinfo/2" method="post">
- <input type="hidden" name="_method" value="put"/>
- </form>
另外一种方法是你可以使用ajax发送put,delete请求.
5. 静态资源的URL重写
如上我们描述,现因为将default servlet映射至/static/的子目录,现我们访问静态资源将会带一个/static/前缀.
如 /foo.gif, 现在访问该文件将是 /static/foo.gif.
那如何避免这个前缀呢,那就是应用URL rewrite,现我们使用 http://tuckey.org/urlrewrite/, 重写规则如下
- <urlrewrite>
- <!-- 访问jsp及jspx将不rewrite url,其它.js,.css,.gif等将重写,如 /foo.gif => /static/foo.gif -->
- <rule>
- <condition operator="notequal" next="and" type="request-uri">.*.jsp</condition>
- <condition operator="notequal" next="and" type="request-uri">.*.jspx</condition>
- <from>^(/.*\..*)$</from>
- <to>/static$1</to>
- </rule>
- </urlrewrite>
相关推荐
在Spring 3.0框架中,Spring MVC是一个强大的用于构建Web应用程序的模块,它支持构建RESTful风格的URL,使得应用程序更加符合Web服务的最佳实践。REST(Representational State Transfer)是一种设计模式,强调通过...
在IT行业中,Spring框架是Java企业级应用开发的首选,而Spring MVC是Spring框架的一个重要...文档`spring_3.0_应用springmvc_构造RESTful_URL_详细讲解.docx`应该包含了更详尽的步骤和示例,帮助读者深入理解这一主题。
在本文中,我们将深入探讨如何在Spring 3.0中应用Spring MVC来构建RESTful URL,以实现更加优雅和功能强大的Web服务。REST(Representational State Transfer)是一种架构风格,用于构建基于HTTP协议的Web服务,它...
标签"源码"意味着文章可能深入讲解了Spring MVC框架的内部实现,或者提供了自定义的代码示例。"工具"可能指的是使用了一些辅助工具或库,如IDE、构建工具(Maven或Gradle)、JSON库(Jackson或Gson)等,以帮助开发...
其资源中包括三个文档,仅供学习与参考。 1.spring3mvc真正入门资料 2.spring3.0MVC注解(附实例) 3.spring_3.0_应用springmvc_构造RESTful_URL_详细讲解
本章详细解释了如何使用Spring MVC来构建结构清晰且易于扩展的Web应用程序,并涵盖了控制器、视图解析器和其他关键组件。 #### 使用Spring访问JDBC数据 第四章讨论了如何利用Spring框架来简化JDBC数据访问操作。...
6. **MVC 框架**:Spring MVC 是 Spring 用于构建 Web 应用的模块,提供模型-视图-控制器架构,支持 RESTful 风格的 URL 设计,以及视图解析、数据绑定等功能。 7. **Spring Boot**:Spring Boot 是 Spring 的一个...
它提供模型-视图-控制器(MVC)架构,支持RESTful风格的URL设计,使Web开发更加简洁和灵活。 2. Spring JDBC与ORM集成 Spring JDBC模块简化了数据库操作,通过JdbcTemplate和NamedParameterJdbcTemplate提供模板...
Spring MVC提供了模型-视图-控制器(MVC)架构模式的实现,支持RESTful风格的URL设计,以及视图解析和数据绑定等功能。 总的来说,这份资源共享包含了Spring框架的关键知识点,对于初学者和有一定经验的开发者来说...
总的来说,自定义多视图是Spring MVC中增强灵活性和可扩展性的重要手段,它允许我们根据需求动态地选择和构造视图,从而满足不同用户和系统的交互需求。通过深入理解和实践,你可以有效地利用这一特性来优化你的Web...
文件列表中的"spring技术手册"很可能是涵盖所有这些主题的详细指南,包含了Spring框架的各个方面,从基础到高级特性的讲解,对初学者和有经验的开发者都有很高的参考价值。通过系统学习,你将能熟练掌握Spring,提升...
Spring MVC还支持RESTful风格的URL设计,以及视图解析器、数据绑定和验证等功能。 6. **Spring Boot**:Spring Boot简化了Spring应用程序的启动和配置过程,通过自动配置和“起步依赖”使快速开发成为可能。它内置...
4. **Web层的REST支持**:Spring MVC增加了对RESTful服务的支持,通过`@RequestMapping`注解可以轻松创建RESTful API。 5. **声明式模型验证**:Spring 3.2支持JSR-303/JSR-349标准的声明式模型验证,简化了数据校验...
它包含处理器映射、视图解析、数据绑定等功能,支持RESTful风格的URL设计。 6. **Spring Boot**:为简化Spring应用的初始搭建和运行过程而生,通过默认配置和“起步依赖”简化了项目的创建和配置。Spring Boot可以...
3. **RESTful API设计**:使用HTTP动词、URL路径和状态码来实现RESTful风格的服务。 4. **数据绑定和验证**:了解DataBinder和Validation的使用,以及自定义验证规则。 5. **SpringMVC拦截器**:实现拦截器,用于...
本文将深入探讨如何在Spring RESTful API中返回文件,以此为“032-return-file-from-spring-rest-webservice”这一主题提供详尽的解释。我们将讨论相关的Java技术和Spring MVC框架的核心概念,以及如何实现在REST...
本文将详细讲解如何利用Spring Boot和Spring Data在Spring MVC框架下构建RESTful分页API。 首先,我们要明确资源与表示的概念。在RESTful API设计中,一个页面本身并不是一个独立的资源,而是对资源(如产品)请求...
以下是一些关键的Spring Boot注解及其详细解释: 1. **@SpringBootApplication**:这是Spring Boot应用程序的核心注解,它包含了`@Configuration`、`@EnableAutoConfiguration`和`@ComponentScan`三个注解的功能。`...
以下是这些领域的详细解释: 1. **Android客户端开发**: - **Activity和Intent**:在Android应用中,Activity是用户界面的基本单元,而Intent用于启动新的Activity或传递数据。在此场景中,可能使用Intent来启动...
11. **Struts、Spring MVC或JSF框架**:可能会涉及一种或多种主流的JavaWeb框架,讲解它们的架构、优势以及如何使用它们简化开发。 12. **Ajax(Asynchronous JavaScript and XML)**:讲解如何使用Ajax实现页面的...