作为一个程序员我还是更喜欢研究技术问题,喜欢动手实干,吹牛/空谈/诡辩实在不是我的强项啊,这两天开会太多,空闲时间太少,抽空研究了下Struts1 RESTFUL 风格URL的设计和实现。
使用到UrlRewriteFilter,文档 http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/3.1/index.html
用起来还算简单,在web.xml中配置一个filter,大家知道filter和Servlet的工作顺序 filter->Servlet->filter
所以这个其实和Struts1的入口org.apache.struts.action.ActionServlet没啥冲突的。
<!-- UrlRewriteFilter filter -->
<!-- UrlRewriteFilter filter -->
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
</filter>
如何用这个?要配置一个urlrewrite.xml
<rule>
<note></note>
<from>/user/(.*)</from>
<to type="forward">/UserAction.do?method=$1</to>
</rule>
<outbound-rule>
<note></note>
<from>/UserAction.do\?method=(.*)</from>
<to>/user/$1</to>
</outbound-rule>
rule
from 定义的是用户看得到的,用户发起的,浏览器地址栏的url
to 定义的是程序内部的URL,这里配置的其实是Struts的某个dispatchAction
outbound-rule
from定义的是程序内部的URL,from里的特殊字符需要转义,to里的不需要转义
to 定义的是程序生成的HTML里的link
比如下面的HTML代码生成的两个link是这样的
http://localhost:8080/url_rewrite_demo/user/get
http://localhost:8080/url_rewrite_demo/user/delete
<a href="<c:url value='/UserAction.do?method=get' />">get</a>
<%request.setAttribute("request_method","delete");%>
<html:link action="/UserAction" paramId="method" paramName="request_method">${request_method}</html:link>
可以看到,struts的html:link也如我们期望的那样生成了期望看到的clean的URL。
基于这个我们可以在struts1的基础上支持RESTFul风格URL的API了,
如果在请求的Header里加上不同的值,根据rewrite配置其实可以render HTML/XML/JSON,这样简单的API就能工作了,暂时还没考虑用户认证+权限什么的。
一个风格清晰的URL如下
/users
/user/1 (GET for read)
/user/1/edit (GET for form, POST for update)
/user/1/delete (GET for form, POST for delete)
/user/create (GET for form, POST for create)