- 浏览: 915089 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (537)
- Java SE (114)
- Struts (18)
- Hibernate (25)
- Spring (3)
- Page_Tech (41)
- Others (87)
- Database (29)
- Server (24)
- OpenSource_Tools (15)
- IDE_Tool (22)
- Algorithm (28)
- Interview (22)
- Test (28)
- Hardware (1)
- Mainframe (25)
- Web application (4)
- Linux (3)
- PHP (17)
- Android (1)
- Perl (6)
- ubuntu (1)
- Java EE (9)
- Web Analysis (5)
- Node.js (2)
- javascript (2)
最新评论
-
一键注册:
request.getRequestURL()和request.getRequestURI() -
SuperCustomer:
...
SED的暂存空间和模式空间 -
juyo_ch:
讲得挺好理解的,学习了
java 死锁及解决 -
chinaalex:
最后一题答案正确,但是分析有误.按照如下过程,上一行为瓶,下一 ...
zz智力题 -
liaowuxukong:
多谢博主啦,弱弱的了解了一点。
C++/Java 实现多态的方法(C++)
[摘要]: 介绍如何改写Struts2的Restful2ActionMapper来支持REST风格的URL映射。
Note: 不 久前写了一篇文章《使用Restful2ActionMapper让Struts2支持REST风格的URL映射》,但后来发现有些不对,Struts2 的Restful2ActionMapper并不按我想的那样运行。因为在我的实验项目中,我是改写了这个Restful2ActionMapper的。 Struts2自己带的Restful2ActionMapper稍嫌复杂,而且我对它的有些地方的处理不甚满意,所以自己写了一个,没有使用Struts2自己的Restful2ActionMapper进行调试。特此向大家道歉,并修正该文档。另外,我对我改写的这个Restful2ActionMapper的代码进行了一些删减调整,将代码附于文后。
一、概述
REST是由 Roy Fielding 在他的论文《Architectural Styles and the Design of Network-based Software Architectures》中提出的一个术语。关于REST,请参考:http: //www.redsaga.com/opendoc/REST_cn.pdf
在REST的定义中,一个Web应用总是使用固定的URI向外部世界呈现(或者说暴露)一个资源,并使用不同的HTTP请求方法来处理对资源的CRUD (创建、读取、更新和删除)操作。除了我们所熟知的GET和POST这两种HTTP请求方法,HTTP还有HEAD、PUT、DELETE等请求方法。我 们在Web应用中处理来自客户端的请求时,通常只考虑GET和POST,并使用某种URL映射将URL映射到对资源的某种操作。而REST架构风格则要求 使用HTTP的GET、POST、PUT、DELETE来分别表示资源的读取、创建、更新、删除,而URI保持不变。举例来说, /article/2007/8/a001这个URI表示一篇文章,表示形式为:/article/{year}/{month}/{id},对这个资源 的CRUD操作如下(下面的表示形式中,我省去了http://host/context/namespace这样的前缀):
读取:GET /article/2007/8/a001
创建:POST /article/2007/8/a001
更新:PUT /article/2007/8/a001
删除:DELETE /article/2007/8/a001
如果我们用传统的struts或webwork的开发方法,我们可能会定义一个ArticleAction,定义好CRUD的method,并使用不同的 URI映射来表示这几种操作。比如,我们可能会使用这样的URI来读取article:/getArticle.action?year= 2007&month=8&id=a001,并使用这样的URI来删除article:/deleteArticle.action? year=2007&month=8&id=a001,或者,把这几种操作用相同形式的URI来表示:/article.action? method=get&year=2007&month=8&id=a001。显然,REST风格的URI表示更友好。
Struts2和Webwork2都带了一个RestfulActionMapper来支持REST风格的URI映射,但是它的功能太弱了,表现形式也很 呆板。Struts2(我使用的是Struts 2.0.9)中还有一个Restful2ActionMapper,可以更好地支持REST风格。
从struts2的官方文档中可以找到关于Restful2ActionMapper的说明: Improved restful action mapper that adds several ReST-style improvements to action mapping, but supports fully-customized URL's via XML.
我查看了Restful2ActionMapper的源码,对它有些地方的处理有异议,所以改写了这个类。以下的配置中,请使用文后附上的Restful2ActionMapper代替Struts2原来的类。
二、配置和使用
现在,我们配置struts2使它使用Restful2ActionMapper。在Web项目中,修改struts.properties文件(它最终会发布到你的web应用的WEB-INF/classes目录中):
struts.mapper.class=org.apache.struts2.dispatcher.mapper.Restful2ActionMapper
struts.enable.SlashesInActionNames=true
当然,你也可以在struts.xml里进行配置,请参考struts2的相关文档。
(这里,请将struts.mapper.class这行修改为使用我修改后的Restful2ActionMapper)
这里有个小建议,许多人在WEB-INF/web.xml里对struts2的配置是让struts2处理所有扩展名为action的url,也就是设置url-pattern为*.action。 我的建议是,不要使用扩展名来作为url-pattern,使用基于路径的匹配形式会更好,我一般是使用“/app/*”作为url-pattern。至于扩展名,我一般是在struts.properties文件中指定:
struts.action.extension=html,xml,json
或者,不要扩展名:
struts.action.extension=
不过,这些都是题外话。
现在,以上面讲到的article为例,我们定义ArticleAction。按照Restful2ActionMapper的规则,URL与method的对应关系如下:
GET /article => public String index(); 资源索引;
GET /article/2007/8/a001 => public String view(); 对应于读取操作;
POST /article/2007/8/a001 => public String create(); 创建资源;
PUT /article/2007/8/a001 => public String update(); 更新资源;
DELETE /article/2007/8/a001 => public String remove(); 删除资源;
GET /article/2007/8/a001!edit => public String edit(); 请求编辑资源,和REST的四种操作没有对应关系;
GET /article/!editNew => public String editNew(); 请求编辑新资源,和REST的四种操作没有对应关系。
后两种方式似乎和REST没什么关系,但为传统的Web应用开发提供了方便。比如edit(),服务器返回一个表单页面。但是,如果我们让应用服务器只返 回xml或json,那么这个edit()是可以不要的,有读取操作就够了。(也许把view方法改为read更贴切点)。
按照这些规则,我们在ArticleAction中定义view()、create()、update()、remove()等method,并在这个action中定义year、month、id的getter/setter方法:
- package app;
- public class ArticleAction {
- private String year, month, id;
- ...
- getter/setter methods for year,month,id
- ...
- public String view() { ... }
- public String index() { ... }
- public String create() { ... }
- public String update() { ... }
- public String remove() { ... }
- }
然后我们需要配置这个action,使它能与形如/article/{year}/{month}/{id}的URL对应起来。我们在相应的struts2的action配置文件中加入如下几行:
- <action name="article/*/*/*" className="app.ArticleAction">
- <param name="year">{1}</param>
- <param name="month">{2}</param>
- <param name="id">{3}</param>
- <result name="..." type="..."/>
- </action>
OK!现在已经可以使用这个action了。当然,这还需要浏览器客户端的支持。当你的客户端以GET来请求/article/2007/8/a001 时,struts2就会调用ArticleAction的view方法,而PUT请求则会对应到update方法,DELETE请求会对应到remove 方法... 但是,如果你的客户端只支持GET和POST怎么办?Restful2ActionMapper的文档中提到:To simulate the HTTP methods PUT and DELETE, since they aren't supported by HTML, the HTTP parameter "__http_method" will be used.对于只支持GET和POST的传统网页,我们可以增加一个"__http_method"参数来模拟PUT和DELETE,比如:POST /article/2007/8/a001&__http_method=DELETE。随着Javascript和Ajax框架的发展,我们已 经可以使用PUT和DELETE等方法。Ajax使用XmlHttpRequest进行操作时,在发送请求之前,可以通过设置RequestType的方 式来完成对请求方法的设定。 三、不足之处Restful2ActionMapper对REST风格的支持是不完全的。在REST风格中,我们可以使用同一个URI来获取同一个资源的多种表现形 式。在发送HTTP请求时,只要我们在请求头中指定一个Accept参数,那么服务器就可以通过判断该参数来决定返回什么类型的数据。如果Accept为 text/xml,服务器会返回xml格式的数据,如果Accept为text/json,则会返回json格式的数据,但URI是固定的。而 Restful2ActionMapper只是作了URI的映射,并没有考虑返回数据的格式问题。要让struts2支持完全的REST风格,我们不得不 对它进行改造,或者,等待它的改进。另外,Restful2ActionMapper所定义的URL映射规则也有一个小小的“陷阱”。比如,GET /user/1表示读取id为1的user,但按照Restful2ActionMapper的定义,/user/new会对应到action的 editNew方法,如果这个"new"就是某个用户的id呢?为了避开这个陷阱,我宁愿使用/user/!editNew这种丑陋的形式。事实上,随着 客户端技术的发展,我们完全可以不使用editNew方法而构造输入页面,然后向服务器发送POST来创建资源。同样,edit方法也不是必要的。 (注:我修改后的Restful2ActionMapper去除了/user/new这种形式的映射) 四、其它有个struts2的插件,叫jsonplugin,可以让struts2很方便地支持json输出。而Adobe Spry Framework、YUI-ext、DOJO等都能很好地支持json,并能很好地支持HTTP的各种请求方法。我推荐struts2的用户使用 jsonplugin和Adobe Spry Framework或YUI-ext(或其它UI Framework)。Struts2只输出json格式的结果(最好还能输出xml),而UI和数据装配交给Adobe Spry/YUI-ext等去做。这样的组合会让你更好更方便地使用REST风格。五、修改后的Restful2ActionMapper这里我附上修改后的Restful2ActionMapper,大家可以在此基础上进行扩充。比如,我前面提到Restful2ActionMapper 不能根据Accept请求头来返回不同格式的数据,其实也是可以进行改进的。我看到已经有人在读过我这篇文章后提出一种方案,类似于这样的:/user/a001/xml => 返回xml格式的result /user/a001/json => 返回json格式的result /user/a001/... 这是一种办法,另外,根据url的扩展名来做,也是一种办法。但是这都不是好方案!我前面已经提过,按照REST风格,一个Web应用总是使用固定的 URI向外部世界呈现(或者说暴露)一个资源,而前面这两种方案只是使URL友好点而已,并不真正符合REST风格。当然,这样也不错了,也是不错的方 案,其实ROR中也有类似的做法。 但我们还有更好的方案,我提个思路,然后大家自行对Restful2ActionMapper进行改进: 在Action中可以设置一个consumeMime属性,并写好对应的getter/setter方法。在Restful2ActionMapper返 回mapping之前,提取request的Accept头信息,然后将该信息放到mapping.params之中。action的各个method最 后只返回consumeMime,这样就可以在action的配置文件中按consumeMime来配置result了。 下面,附上修改后的Restful2ActionMapper代码: java 代码
|
发表评论
-
struts1 vs struts2
2012-06-07 10:55 1061struts1 2001年6月发布str ... -
struts中通过action跳转到外网(框架页面)
2010-04-26 16:26 2302HttpSession session = arg2.getS ... -
struts中利用ExceptionHandler处理异常
2010-02-03 18:14 698在Struts1.X的版本中加入了对异常的处理 ... -
Struts+spring, 多模块Struts配置文件
2010-01-13 10:41 11731. web.xml ... <init-param&g ... -
struts1.2多模块开发
2010-01-13 10:24 1466一、多个配置文件的支持和模块的支持支持多个配置文件,是指你能够 ... -
struts1.2与spring整合手记
2010-01-12 16:51 1058相关文章: spring入门编程问题集锦 ... -
Struts action mapping (controller的inputforward属性)
2010-01-12 16:22 31301. Full action 这可以说是Struts ac ... -
Struts1.2 控制流程----面试时可用
2010-01-12 15:34 1081有的同学问我如何向面 ... -
深入Struts1.1(下)
2010-01-12 15:21 989在Struts 1.1中,除了DynaActionForm以外 ... -
深入Struts1.1(中)
2010-01-12 15:19 756ActionServlet 我们首先来 ... -
深入Struts 1.1(上)
2010-01-12 15:18 908作为基于MVC模式的Web应 ... -
struts1.x执行流程分析
2010-01-12 14:49 1456先来整体的了解一下Struts的工作流程. 在实现一个基于S ... -
一步一步学习 Struts
2009-11-05 16:22 815专栏: 一步一步跟我学Struts2 (17) 如何学习S ... -
Struts2 OGNL
2009-11-05 15:27 1261众所周知,Strut 2的Action类通过属性可以获得所有相 ... -
struts2验证信息重复出现解决方案
2009-10-17 10:33 1271今天遇到一个很蠢的问题,所以写下来给自己留个教训。 ... -
strust2标签实践总结
2009-10-06 00:42 14391:输出action中属性值,在jsp页面中显示用:<s ... -
关于Spring , Struts结合学习
2009-09-30 13:28 875关于Spring , Struts结合学习。 一、前言 刚 ...
相关推荐
01 为Struts 2.0做好准备 02 常用的Struts 2.0的标志(Tag) 03 Struts 2.0的Action讲解 04 在Struts 2.0中国际化(i18n)您的应用程序 05 转换器(Converter)——Struts 2.0中的魔术师 06 在Struts 2.0中实现表单...
在这个"struts2.0+rest入门Demo"中,我们可以预期包含以下关键部分: 1. **Action类**:这是Struts2的核心,通常继承自`ActionSupport`,并覆盖`execute()`方法,处理用户请求。在RESTful设计中,Action可能对应于...
Struts 2.0系列(MAX),pdf格式,全方位介绍struts2: 常用的Struts 2.0的标志(Tag)介绍 Struts 2.0的Action讲解 在Struts 2.0中国际化(i18n)您的应用程序 转换器(Converter)——Struts 2.0中的魔术师 在Struts ...
JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0JavaEE源代码 Struts2.0...
Struts2.0是Java Web开发中的一个强大框架,它基于Model-View-Controller(MVC)设计模式,为开发者提供了构建可维护性高、结构清晰的Web应用程序的工具。这个"Struts2.0视频教程+struts2.0中文教程"包含的资源旨在...
Struts2.0是Java Web开发领域中的一款流行框架,它是Struts1.x与WebWork框架的结合体,继承了两者的优点并进行了创新。在Struts2.0中,核心概念之一是Action,它被设计为一个简单的POJO(Plain Old Java Object),...
Struts2.0是Java Web开发中的一个热门框架,它基于Model-View-Controller(MVC)设计模式,为开发者提供了构建动态Web应用程序的强大工具。API文档是理解任何框架核心功能的关键,对于Struts2.0也不例外。让我们深入...
Struts2.0是一款强大的Java Web框架,它在MVC(Model-View-Controller)设计模式的基础上,提供了灵活且强大的架构来构建企业级的Web应用程序。这个“Struts2.0 Jar包”包含了所有必要的库文件,使得开发者可以便捷...
Struts2.0 jar包是Java Web开发中的一个重要组件,它是Apache Struts框架的一个特定版本。Struts2是一个基于MVC(Model-View-Controller)设计模式的开源框架,用于构建可维护性高、结构清晰的Java应用。该框架极大...
Struts 2.0 是一个基于 Model-View-Controller (MVC) 设计模式的Java Web应用程序框架。它并非Struts 1的直接升级,而是源自WebWork框架,提供了更强大的特性和灵活性。Struts 2的核心是Action,它是业务逻辑处理的...
struts2.0的数据校验框架struts2.0的数据校验框架struts2.0的数据校验框架struts2.0的数据校验框架
### Struts 2.0 详细配置解析 #### 一、Struts 2.0 简介 Struts 2.0 是一个基于 Java 的开源框架,用于开发 Web 应用程序。它继承了 Struts 1.x 的优点,并在架构上进行了改进,更加灵活且易于扩展。Struts 2.0 ...
Struts2.0是Java Web开发中非常重要的一个MVC框架,它是在原有的Struts1.x基础上进行改进和发展而来的。这个"三大框架中文文档中的struts2.0开发手册"为程序员提供了一份详尽的参考资料,帮助他们理解和掌握Struts...
Struts 2.0是Java Web开发中的一个关键框架,它是Apache软件基金会的顶级项目,融合了原本独立的Struts 1.x和WebWork框架的优势,为开发者提供了一个强大、灵活且可扩展的MVC(Model-View-Controller)架构。...
Struts2.0是Java Web开发中一个非常重要的框架,它是Apache软件基金会的Struts项目的一个版本,专门用于构建基于MVC(Model-View-Controller)设计模式的Web应用程序。Struts2.0的出现极大地简化了Java Web开发,...
Struts2.0是Java Web开发中一个非常重要的框架,它是Apache软件基金会的Jakarta项目下的一个开源产品,主要用于构建MVC(Model-View-Controller)模式的应用程序。本入门案例将带你逐步了解如何使用Struts2.0来创建...
Struts2.0是Java Web开发中的一个强大框架,它基于Model-View-Controller(MVC)设计模式,为开发者提供了构建可维护性高、结构清晰的Web应用程序的工具。这个"Struts2.0学习系列"旨在帮助初学者及进阶者深入理解并...
Struts2.0 是一个非常流行的Java Web框架,它基于MVC(Model-View-Controller)设计模式,用于构建高效、可维护的企业级应用程序。这个压缩包包含了Struts2.0的核心jar文件以及可能的源代码,使得开发者可以直接查看...
Struts 2.0是Java Web开发中一个非常重要的MVC框架,它为构建基于J2EE的企业级应用提供了强大的支持。本指南将深入探讨Struts 2.0的核心概念、设计模式、配置以及实际应用中的最佳实践。下面,我们将详细讲解Struts ...