rest plugin 学习(一)

[size=small]1.官方介绍的地址:

[url]http://struts.apache.org/2.1.6/docs/rest-plugin.html[/url]


2.struts.xml文件配置
必须和convention插件配合使用。但是如果直接使用肯定会报错,会报index方法找不到,由其是我们在使用config-browser插件时。原因是restful插件默认一个action执行方法是"index"。而原来action的默认方法是"execute"。我们可以改变restful插件的配置


(1) <constant name="struts.mapper.indexMethodName" value="execute"/>

默认访问一个action是"index"方法,改成"execute"和以前统一。restful插件还可以配置其他访问方法:getMethodName="show",postMethodName="create",putMethodName="update",deleteMethodName="destroy",
editMethodName="edit", newMethodName="editNew"。

(2) <constant name="struts.action.extension" value="action,do,,xhtml,xml,json"/>
<constant name="struts.rest.defaultExtension" value="xhtml" />
<constant name="struts.rest.handlerOverride.EXTENSION" value="xhtml" />

扩展名可以指定为空。restful插件默认指定xhtml为扩展名,则直接返回html页面。".json"则返回json结构串,struts2使用jsonlib实现,".xml"则返回xml格式串,struts2使用xstream实现。关键是ContentTypeHandlerManager来判断请求。通过这种方式,jsonplugin也没有什么用处了。不过通过测试,序列化xml是非常慢的,好在现在xml用处并不多,所以可以暂不考虑。但是json的使用是非常频繁的,如果用struts2默认的jsonlib非常慢,有其他插件如flexjson,jsonplugin等都比较快。我们可以覆盖原有的handle,按照扩展名指定不同的handle。

(3) <constant name="struts.actionProxyFactory" value="rest" />
<constant name="struts.mapper.class" value="rest" />
使用rest代理及mapper。

(4) <constant name="struts.mapper.idParameterName" value="id" />

访问一个资源的唯一标识名称。例如:访问"/xxx/orders"则是访问一个orders的列表,如果"/xxx/orders/1" 则访问id为1的数据。
通过实践,发现restful插件有不方便的地方:
1. 只能传一个值id就是id,要是想传多个值怎么办? 如"/xxx/orders/2009-01-12/sd/1/23"这样的地址如何处理?
2. 传参会和方法名混淆。如"/xxx/orders/new" 默认是访问action的editNew方法而不是访问一个id="new"的资源,这都是写死在mapper类中的。如"/xxx/orders/id/edit"是访问action的edit方法,必须带一个参数,自己定义的其他action方法的访问形式也必须是/xxx/orders/id/methodName,如果这个方法不需要id这个参数,也没有办法。


(5)默认拦截器配置,严格按照顺序。 modelDriven在restful插件非常有用,如果不实现modelDriven接口,则如果调用json和xml会把action的全部属性都序列化,非常耗费资源。
[/size]


<package name="ctid-rest" extends="rest-default">
<interceptors>
<interceptor-stack name="restDefaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="modelDriven">
<param name="refreshModelBeforeResult">true</param>
</interceptor-ref>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
</package>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值