- 浏览: 520484 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (422)
- 重要 (12)
- BUG解决备忘录 (32)
- 环境搭建 (17)
- 开源组件 (4)
- 数据库 (16)
- 设计模式 (4)
- 测试 (3)
- javascript (5)
- Android (14)
- jdk相关 (9)
- struts2 (10)
- freemark (3)
- 自定义扩展及工具类 (5)
- jdk5新特性及java基础 (13)
- ssh及其他框架 (15)
- linux (32)
- tcp-ip http协议 (8)
- 服务器集群与负载均衡 (34)
- 项目管理相关 (11)
- 实用小技术 (10)
- 架构相关 (14)
- firefox组件 (11)
- spider (6)
- 产品设计 (11)
- PHP (1)
- ws (4)
- lucene (10)
- 其他 (2)
- BI (1)
- NoSQL (3)
- gzip (1)
- ext (4)
- db (6)
- socket (1)
- 源码阅读 (2)
- NIO (2)
- 图片处理 (1)
- java 环境 (2)
- 项目管理 (4)
- 从程序员到项目经理(一):没有捷径 (1)
- bug (1)
- JAVA BASE (8)
- 技术原理 (0)
- 新框架新技术 (1)
- 量化与python (1)
- 系统编程 (0)
- C语言 (0)
- 汇编 (0)
- 算法 (0)
最新评论
-
hyspace:
别逗了,最后一个算法根本不是最优的,sort(function ...
数组去重——一道前端校招试题 -
washingtin:
楼主能把策略和路由的类代码贴出来吗
Spring + iBatis 的多库横向切分简易解决思路 -
sdyjmc:
初略看了一下,没有闹明白啊,均衡负载使用Nginx,sessi ...
J2EE集群原理 I -
shandeai520:
谢谢大神!请教大神一个问题:假如我有三台服务器,连接池的上限是 ...
集群和数据库负载均衡的研究 -
hekuilove:
给lz推荐一下apache commonsStringUtil ...
request 获取 ip
- /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
首先,我们带着如下三
个问题
查看本文。
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请求.
- @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. spring mvc 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/* </ url-pattern >
- </ servlet-mapping >
- < servlet >
- < servlet-name > springmvc </ servlet-name >
- < servlet-class > org.springframework.web.servlet.DispatcherServlet </ servlet-class >
- < load-on-startup > 1 </ load-on-startup >
- </ servlet >
- <!-- URL重写filter,用于将访问静态资源http://localhost/foo.css 转为http://localhost/static/foo.css -->
- < filter >
- < filter-name > UrlRewriteFilter </ filter-name >
- < filter-class > org.tuckey.web.filters.urlrewrite.UrlRewriteFilter </ filter-class >
- < init-param >
- < param-name > confReloadCheckInterval </ param-name >
- < param-value > 60 </ param-value >
- </ init-param >
- < init-param >
- < param-name > logLevel </ param-name >
- < param-value > DEBUG </ param-value >
- </ init-param >
- </ filter >
- < filter-mapping >
- < filter-name > UrlRewriteFilter </ filter-name >
- < url-pattern > /* </ url-pattern >
- </ filter-mapping >
- <!-- 覆盖default servlet的/, springmvc servlet将处理原来处理静态资源的映射 -->
- < servlet-mapping >
- < servlet-name > springmvc </ servlet-name >
- < url-pattern > / </ url-pattern >
- </ servlet-mapping >
- <!-- 浏览器不支持put,delete等method,由该filter将/blog?_method=delete转换为标准的http delete方法 -->
- < filter >
- < filter-name > HiddenHttpMethodFilter </ filter-name >
- < filter-class > org.springframework.web.filter.HiddenHttpMethodFilter </ filter-class >
- </ filter >
- < filter-mapping >
- < filter-name > HiddenHttpMethodFilter </ filter-name >
- < servlet-name > springmvc </ servlet-name >
- </ filter-mapping >
2. webapp/WEB-INF/springmvc-servlet.xml配置,使用如下两个class激活@RequestMapping annotation
- <bean class = "org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
- <bean class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
完整配置
- <beans default -autowire= "byName" >
- <!-- 自动搜索@Controller 标注的类 -->
- <context:component-scan base-package = "com.**.controller" />
- <bean class = "org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
- <bean class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
- <!-- Default ViewResolver -->
- <bean id="viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver" >
- <property name="viewClass" value= "org.springframework.web.servlet.view.JstlView" />
- <property name="prefix" value= "/pages" />
- <property name="suffix" value= ".jsp" ></property>
- </bean>
- <bean id="messageSource" class = "org.springframework.context.support.ResourceBundleMessageSource" p:basename= "i18n/messages" />
- <!-- Mapping exception to the handler view -->
- <bean id="exceptionResolver" class = "org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" >
- <!-- to /commons/error.jsp -->
- <property name="defaultErrorView" value= "/commons/error" />
- <property name="exceptionMappings" >
- <props>
- </props>
- </property>
- </bean>
- </beans>
3. Controller编写
- /**
- * @RequestMapping("/userinfo") 具有层次关系,方法级的将在类一级@RequestMapping之一,
- * 如下面示例, 访问方法级别的@RequestMapping("/new"),则URL为 /userinfo/new
- */
- @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" ;
- /**
- * 通过spring自动注入
- **/
- 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 >
发表评论
-
求鱼不如求渔 Welcome to MICKY's HOME Spring中加载ApplicationContext.xml文件的方式【转
2013-03-08 10:43 8291.利用ClassPathXmlApplication ... -
小试Bean Validation
2012-03-18 21:56 859数据校验是任何一个应用程序都会用到的功能,无论是显示层还是持久 ... -
Hibernate-Validation的使用
2012-03-18 11:56 1448以前弄过hibernate-validation的,可今天 ... -
springMVC3 基于注解的输入验证
2012-03-18 00:51 1606在pom.xml中加入,他需要validation-api ... -
pring3.0支持restful实例
2012-03-16 11:59 1091最近在研究spring3.0以及传说中的restful,还 ... -
Spring REST
2012-03-16 11:40 1189前面介绍过Spring的MVC结合不同的view显示不同的 ... -
设计 REST 风格的 MVC 框架
2012-03-16 11:38 949简介: 传统的 JavaEE MVC 框架如 Struts ... -
Spring MVC REST 例子
2012-03-16 03:17 1229package com.benx; ... -
ibatis存储过程调用(转载)
2011-08-14 17:11 10941 ibatis 调用oracle函数示例 2 ... -
通通透透理解ThreadLocal
2011-02-23 18:06 730概述 我们知道Spring通过各种DAO模板类降低了开发者使 ... -
乐观锁与悲观锁
2011-02-23 17:49 865文章转自网上好像是玉米田的,忘记了锁( locking ) 业 ... -
spring 依赖注入到直接new 对象
2010-09-16 15:50 1009当为遗留系统加入spring时,经典问题就是遗留系统需要引用s ... -
Spring注解入门
2010-06-03 17:11 8341. 使用Spring注解来注入属性 1.1. 使用注解 ... -
Spring2.0用注解实现事务管理
2010-06-03 15:50 894Spring2.0 框架的事务处理有两大类: 1 ...
相关推荐
在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 MVC 是一个强大的Java框架,用于构建Web应用程序,特别是对于基于模型-视图-控制器(MVC)架构的应用。在本文中,我们将深入探讨如何利用Spring MVC创建RESTful服务,这些服务可以处理字符串、JSON和XML数据...
在本文中,我们将深入探讨如何在Spring 3.0中应用Spring MVC来构建RESTful URL,以实现更加优雅和功能强大的Web服务。REST(Representational State Transfer)是一种架构风格,用于构建基于HTTP协议的Web服务,它...
在本文中,我们将深入探讨如何在Spring 3.0中整合MVC框架与RESTful服务,并结合Maven构建项目。RESTful(Representational State Transfer)是一种软件架构风格,用于设计网络应用程序,尤其适用于Web服务。Spring ...
本书共计10章,分别介绍了快速搭建Spring Web应用、精通MVC结构、URL映射、文件上传与错误处理、创建Restful应用、保护应用、单元测试与验收测试、优化请求、将Web应用部署到云等内容,循序渐进地讲解了Spring MVC4...
Spring 3 MVC框架是Java开发者广泛使用的构建Web应用的工具,它为开发RESTful API提供了强大的支持。本教程将深入探讨如何利用Spring 3 MVC实现RESTful服务。 首先,理解REST的基本原则至关重要。RESTful架构有以下...
Spring3.0 MVC是Spring框架的重要组成部分,专注于构建高性能、健壮的Web应用程序。这个框架具有高度可配置性,允许开发者将各个逻辑和功能模块进行分离,增强了代码的可维护性和可扩展性。Spring MVC不仅能够独立...
这个"最全最经典spring-mvc教程"应该会详细讲解上述所有概念,并可能通过实例演示如何配置、创建和调试Spring MVC项目。对于想要深入理解和使用Spring MVC的开发者来说,这是一份非常宝贵的资源。通过学习这个教程,...
2. **第2部分:在Spring 3.0 MVC中创建Hello World应用程序** - 通过一个简单的示例来展示如何快速启动一个Spring MVC项目。 3. **第3部分:在Spring 3.0 MVC中进行表单处理** - 探讨如何使用Spring MVC处理表单提交...
这份PPT很可能涵盖了Spring MVC 3.0的基本概念、配置、控制器、模型绑定、视图解析、拦截器以及如何构建RESTful服务等内容。通过学习,开发者能够了解如何创建Controller、配置DispatcherServlet、处理请求和响应,...
Spring MVC 3.0作为Spring框架的一部分,专门用于构建Web应用程序,提供了优雅的模型-视图-控制器(MVC)架构模式。同时,MyBatis 3.0作为一个轻量级的持久层框架,以其简单易用和高度灵活的特点,成为了数据库操作...
**Spring 3.0 MVC**是Spring框架的一个重要组成部分,专注于构建Web应用程序。相较于之前的版本,Spring 3.0 MVC引入了许多重要的改进和新特性,使其成为企业级Web开发的首选框架之一。 - **Spring MVC作为Web组件*...
在Spring 3.0中,Spring MVC添加了对RESTful服务的支持,通过以下关键组件实现: 1. **@RestController**:这是一个注解,用于标记控制器类,表明该类将处理HTTP请求并返回JSON或XML等资源。与传统的@Controller...
首先,Spring MVC 4基于Servlet 3.0规范,这意味着它可以利用异步处理能力,提高了Web应用的性能。通过AsyncSupport和AsyncConfigurer接口,开发者可以轻松地创建异步控制器,处理高并发场景。 控制器(Controller...
《Spring 3.0 MVC 框架深度解析与实战指南》 在现代Web开发中,Spring框架以其强大的功能和灵活性备受青睐,尤其是其MVC模块,为构建高性能、易于维护的Web应用提供了坚实的基础。本文将深入探讨Spring 3.0版本的...
Spring MVC是一种基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,使用了IoC容器,支持RESTful风格的应用程序开发。Spring MVC通过分离模型(Model)、视图(View)和控制器(Controller)来简化Web开发...
Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构,使开发者能够有效地分离业务逻辑、数据处理和用户界面。在"Spring MVC 4.2.3"版本中,我们看到了一系列的...
Spring 3.0 MVC 和 REST 是 Java Web 开发中的重要组成部分,它们为构建现代、高效的应用程序提供了强大的框架支持。本文将深入探讨这两个概念以及如何通过一个入门实例来理解它们。 Spring MVC(Model-View-...
Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序提供模型-视图-控制器(MVC)架构。在Spring MVC 4.0版本中,它引入了许多改进和新特性,以提升开发效率和应用程序的性能。 1. **依赖注入**:Spring ...