Struts2.1 REST
2009-07-03 17:15
Struts
2.1增加了REST插件,通过REST插件提供REST支持。REST插件以Convention插件为基础,因此无需使用XML进行配置管理。
Struts 2.1通过REST插件完全可以提供让人和机器客户端共同使用的资源,并支持Ruby On Rails风格的URL。
RestActionMapper简介
从本质上来看,Struts 2依然是一个MVC框架,最初设计Struts 2时并没有按REST架构进行设计,因此Struts 2本质上并不是一个REST框架。
但因为Struts 2提供了良好的可扩展性,因此允许通过REST插件将其扩展成支持REST的框架。REST插件的核心是RestActionMapper,它负责将Rails风格的URL转换为传统请求的URL。
用WinRAR打开struts2-rest-plugin-2.1.6文件,看到该文件里包含一个struts-plugin.xml文件,该文件中包含如下一行:
<!-- 定义支持REST的ActionMapper -->
<bean type="org.apache.struts2.dispatcher.mapper.ActionMapper"
name="rest" class="org.apache.struts2.rest.RestActionMapper" />
通过查看RestActionMapper的API说明,我们发现它可接受如下几个参数:
struts.mapper.idParameterName:用于设置ID请求参数的参数名,该属性值默认是id。
struts.mapper.indexMethodName:设置不带id请求参数的GET请求调用Action的哪个方法。该属性值默认是index。
struts.mapper.getMethodName:设置带id请求参数的GET请求调用Action的哪个方法。该属性值默认是show。
struts.mapper.postMethodName:设置不带id请求参数的POST请求调用Action的哪个方法。该属性值默认是create。
struts.mapper.putMethodName:设置带id请求参数的PUT请求调用Action的哪个方法。该属性值默认是update。
struts.mapper.deleteMethodName:设置带id请求参数的DELETE请求调用Action的哪个方法。该属性值默认是destroy。
struts.mapper.editMethodName:设置带id请求参数、且指定操作edit资源的GET请求调用Action的哪个方法。该属性值默认是edit。
struts.mapper.newMethodName:设置不带id请求参数、且指定操作edit资源的GET请求调用Action的哪个方法。该属性值默认是editNew。
提示:在RestActionMapper的方法列表中,我们看到setIdParameterName、setIndexMethodName、 setGetMethodName、setPostMethodName、setPutMethodName、setDeleteMethodName、 setEditMethodName、setNewMethodName等方法,这些方法对应为上面列出的方法提供setter支持。
通常情况下,我们没有必要改变RestActionMapper的参数,直接使用这些参数的默认值就可支持Rails风格的REST。根据前面介绍可以看出:支持REST风格的Action至少包含如下7个方法:
index:处理不带id请求参数的GET请求。
show:处理带id请求参数的GET请求。
create:处理不带id请求参数的POST请求。
update:处理带id请求参数的PUT请求。
destroy:处理带id请求参数的DELETE请求。
edit:处理带id请求参数,且指定操作edit资源的GET请求。
editNew:处理不带id请求参数,且指定操作edit资源的GET请求。
如果请求需要向服务器发送id请求参数,直接将请求参数的值附加在URL中即可。表12.3显示了RestActionMapper对不同HTTP请求的处理结果。
表12.3 RestActionMapper对HTTP请求的处理
HTTP方法 URI 调用Action的方法 请求参数
GET /book index
POST /book create
PUT /book/2 update id=2
DELETE /book/2 destroy id=2
GET /book/2 show id=2
GET /book/2/edit edit id=2
GET /book/new editNew
不幸地是,标准HTML语言目前根本不支持PUT和DELETE两个操作,为了弥补这种不足,REST插件允许开发者提交请求时额外增加一个_method请求参数,该参数值可以为PUT或DELETE,用于模拟HTTP协议的PUT和DELETE操作。
RestActionMapper简介
从本质上来看,Struts 2依然是一个MVC框架,最初设计Struts 2时并没有按REST架构进行设计,因此Struts 2本质上并不是一个REST框架。
但因为Struts 2提供了良好的可扩展性,因此允许通过REST插件将其扩展成支持REST的框架。REST插件的核心是RestActionMapper,它负责将Rails风格的URL转换为传统请求的URL。
用WinRAR打开struts2-rest-plugin-2.1.6文件,看到该文件里包含一个struts-plugin.xml文件,该文件中包含如下一行:
<!-- 定义支持REST的ActionMapper -->
<bean type="org.apache.struts2.dispatcher.mapper.ActionMapper"
name="rest" class="org.apache.struts2.rest.RestActionMapper" />
通过查看RestActionMapper的API说明,我们发现它可接受如下几个参数:
struts.mapper.idParameterName:用于设置ID请求参数的参数名,该属性值默认是id。
struts.mapper.indexMethodName:设置不带id请求参数的GET请求调用Action的哪个方法。该属性值默认是index。
struts.mapper.getMethodName:设置带id请求参数的GET请求调用Action的哪个方法。该属性值默认是show。
struts.mapper.postMethodName:设置不带id请求参数的POST请求调用Action的哪个方法。该属性值默认是create。
struts.mapper.putMethodName:设置带id请求参数的PUT请求调用Action的哪个方法。该属性值默认是update。
struts.mapper.deleteMethodName:设置带id请求参数的DELETE请求调用Action的哪个方法。该属性值默认是destroy。
struts.mapper.editMethodName:设置带id请求参数、且指定操作edit资源的GET请求调用Action的哪个方法。该属性值默认是edit。
struts.mapper.newMethodName:设置不带id请求参数、且指定操作edit资源的GET请求调用Action的哪个方法。该属性值默认是editNew。
提示:在RestActionMapper的方法列表中,我们看到setIdParameterName、setIndexMethodName、 setGetMethodName、setPostMethodName、setPutMethodName、setDeleteMethodName、 setEditMethodName、setNewMethodName等方法,这些方法对应为上面列出的方法提供setter支持。
通常情况下,我们没有必要改变RestActionMapper的参数,直接使用这些参数的默认值就可支持Rails风格的REST。根据前面介绍可以看出:支持REST风格的Action至少包含如下7个方法:
index:处理不带id请求参数的GET请求。
show:处理带id请求参数的GET请求。
create:处理不带id请求参数的POST请求。
update:处理带id请求参数的PUT请求。
destroy:处理带id请求参数的DELETE请求。
edit:处理带id请求参数,且指定操作edit资源的GET请求。
editNew:处理不带id请求参数,且指定操作edit资源的GET请求。
如果请求需要向服务器发送id请求参数,直接将请求参数的值附加在URL中即可。表12.3显示了RestActionMapper对不同HTTP请求的处理结果。
表12.3 RestActionMapper对HTTP请求的处理
HTTP方法 URI 调用Action的方法 请求参数
GET /book index
POST /book create
PUT /book/2 update id=2
DELETE /book/2 destroy id=2
GET /book/2 show id=2
GET /book/2/edit edit id=2
GET /book/new editNew
不幸地是,标准HTML语言目前根本不支持PUT和DELETE两个操作,为了弥补这种不足,REST插件允许开发者提交请求时额外增加一个_method请求参数,该参数值可以为PUT或DELETE,用于模拟HTTP协议的PUT和DELETE操作。