本文主要介绍如何在已有的Struts2框架下添加对RESTful风格URL的支持,同时确保不改变原有系统的URL访问模式。
在传统的Struts2应用中,URL通常是基于Action的名字,如`/actionName.action`。然而,RESTful架构提倡使用更加语义化的URL,比如`/api/v1/record/face`,这种方式更符合HTTP协议的资源定位原则,便于理解和维护。针对这个问题,我们可以采用以下策略来解决:
1. 配置排除规则:
文件中提到的`struts.action.excludePattern`配置是用于排除特定URL模式的,这样这些URL不会被Struts2拦截处理。在这个例子中,排除了以`/cxf/.*`和`/websocket`以及`ws://.*`开头的URL,可能是因为这些URL是用于其他服务,例如Web服务或WebSocket通信,我们不希望它们受到Struts2 RESTful改造的影响。
2. 启用斜杠支持:
`<constant name="struts.enable.SlashesInActionNames" value="true"/>` 这行配置允许在Action名字中使用斜杠,这正是RESTful URL的特点。默认情况下,Struts2不支持Action名中包含斜杠,但启用此设置后,就可以创建类似`api/v1/record/face`这样的Action。
3. 定义RESTful Action:
在`<package>`中定义了多个Action,每个Action对应一个RESTful API。Action的名字遵循RESTful风格,如`api/v1/record/face`,并且都继承自`json-default`和`struts-default`包,这意味着它们会返回JSON格式的结果。`method`属性指定了Action中的具体处理方法,例如`face`、`stranger`等。
4. 结果类型配置:
每个Action配置了一个JSON结果类型,这意味着请求响应将被转换成JSON格式。`<result type="json">`标签内的`<param name="root">result</param>`表示返回结果的根节点名为`result`,这样客户端可以根据这个字段解析响应数据。
5. 命名空间(Namespace):
使用`namespace="/api/v1"`可以将所有RESTful Action归类到同一个命名空间下,这样URL结构更加清晰,也方便管理和扩展。
通过以上配置,Struts2项目可以同时支持传统的Action访问方式和RESTful风格的URL。开发者可以在不改动现有代码的基础上,为新接口引入RESTful设计。这不仅保留了原有系统的兼容性,也提高了新API的可读性和可维护性。对于需要向RESTful过渡的老项目来说,这是一个实用且简单的解决方案。