和朋友共同开发一个小项目中用到了RESTful风格,在这里总结一下。
首先在Struts2工程中导入所需的jar包
ezmorph-1.0.3.jar
json-lib-2.1-jdk15.jar
struts2-convention-plugin-2.2.1.1.jar
struts2-rest-plugin-2.2.1.1.jar
xstream-1.2.2.jar
以上这些包是实现零配置和REST所必须的jar,缺一不可。
Struts2的Convention插件的主要特点是“约定优于配置”,可能是受到了Ruby on rails框架的启发,Struts2也借鉴了这个创意,看文字中的意思就可以明白,只要我们按照“约定”来开发,就可以摒弃繁琐的XML文件,也就是说,action等类配置完全不必写在struts.xml文件中了。
那么,“约定”又是什么呢?
其实,只要把零配置的jar文件拷贝到工程中WEB-INF/lib文件夹下,就自动实现了零配置。对于Struts2而言,它会自动在你创建的action、actions、struts、struts2这四个包下自动搜索,只要满足2个条件,Struts2就会认为包里的类是Action类,哪2个条件呢?一是:实现了com.opensymphony.xwork2.Action接口的类;二是:类名以“Action”结尾的类。
当然,以上这两个条件是Struts2的默实现,你也可以按自己的想法来做出改变,比如可以搜索以“Controller”结尾的类,怎么改呢?后面会说到。
当Struts2按约定找到了这些符合条件的类以后,就会自动部署这些Action,但在不同的包结构下,访问这些Action的URL也是不同的,请看下面的表格举例:
包
|
访问URL
|
org.crazyit.actions.LoginAction
|
映射到/
|
com.test.action.abc.UserAction
|
映射到/abc
|
org.crazyit.struts2.wage.hr.AddEmployeeAction
|
映射到/wage/hr
|
org.crazyit.struts.auction.bid.BidAction
|
映射到/auction/bid
|
看到上面的表格是不是了解了呢?Struts2总是以action、actions、struts、struts2包为根包,来映射成对应的URL访问路径。
而访问Action的名字,也应遵循两个规则,第一:如果类名包含Action后缀,那么把Action后缀去掉;第二:将以骆驼命名法的类名转成中画线写法,所有的字母都小写,单词之间用中画线分割。比如:
类名
|
映射
|
LoginAction
|
/login.action
|
GetBooks
|
/get-books.action
|
AddEmployeeAction
|
/add-employee.action
|
以上按照这些约定,Strtus2就会自动识别Action类,并正常访问它们了。编写Action则于从前未使用零配置插件一样,没有任何不同。
说完了Action,那么Result如何映射呢?因为很少有Action不返回逻辑视图的,零配置插件也提供了映射Result的约定。默认情况下,Result使用:action的URL + Result返回值 + 后缀 来做约定。例如当一个UserAction返回success时,Strus2就会查找user-success.jsp作为视图资源。而Struts2默认查找的地方在/WEB-INF/content目录下,那当然了,如果视图资源不是jsp文件,那也是一样的。比如LoginAction返回error,并且结果类型为FreeMarker,结果视图为login-error.ftl。
而JSP等视图资源也没有什么特别之处,到此为止,配置全部由约定完成,无需配置struts.xml文件。
但上面曾说过,如果要改变默认搜索包的名字,要怎样呢?只需在struts.xml文件中写入如下配置即可:
<constant name="struts.convention.action.suffix" value="Controller" />
查找以“Controller”结尾的类为Action类
<constant name="struts.convention.package.locators" value="org.demo" />
指定哪些包为搜索Action的根包
<constant name="struts.convention.exclude.packages" value="test" />
排除掉不搜索的包
还有很多可以改变Struts2的默认规则,其他可参阅文档。
而REST插件可以让Struts2实现RESTful风格的URL访问资源方式,具体REST风格是什么,可以参阅《RESTful Webservice》这本书。
其实Struts2本质上是一个MVC框架,而REST插件是将原本的URL转换成RESTful风格的URL而已, REST插件中RestActionMapper负责接收参数,把HTTP的请求方式分别用7个方法来做出处理:
HTTP方法
|
URI
|
调用Action的方法
|
请求参数
|
GET
|
/book
|
index
|
|
POST
|
/book
|
create
|
|
PUT
|
/book/2
|
update
|
id=2
|
DELETE
|
/book/2
|
destory
|
id=2
|
GET
|
/book/2
|
show
|
id=2
|
GET
|
/book/2/edit
|
edit
|
id=2
|
GET
|
/book/new
|
editNew
|
|
而使用了REST插件之后,Action类就不使用execute()方法来处理用户请求了,而是上面的7个方法来实现
这样,如果按RESTful风格对应的HTTP请求如下:
GET /article 对应index()方法,用于查询操作;
GET /article/2007/8/a001对应view()方法,对应于读取操作(查询单条);
POST /article/2007/8/a001对应create()方法,用于新建操作;
PUT /article/2007/8/a001对应update()方法,用于更新操作;
DELETE /article/2007/8/a001对应remove()方法,用于删除操作;
GET /article/2007/8/a001!edit对应edit(); 请求编辑,和REST的四种操作没有对应关系
GET /article/new 或 GET /article/!editNew对应editNew()方法,请求编辑新资源,和REST的四种操作没有对应关系。
还是通过一个例子来看一下,首先建立Action类,依然继承自ActionSuport
@Namespace("/users/operate-history")
@Results(@Result(name="success", location="../../job-collection.jsp"))
public class JobCollectionAction extends ActionSupport implements ServletResponseAware{
private String id;
public String getId() {
return id;
}
@Autowired
private IJobCollectionService jobCollectionService;
@Autowired
private IJobService jobService;
private HttpServletResponse response;
private PageCond pageCond = new PageCond();
public PageCond getPageCond() {
return pageCond;
}
public void setPageCond(PageCond pageCond) {
this.pageCond = pageCond;
}
// 参数,职位id
private String code = new String();
protected void mySearch() throws Throwable{
// 初始化session中保存的权限信息
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
UserDetail curUserDetail = (UserDetail) auth.getPrincipal();
User currentUser = (User) curUserDetail.getCurUserMap().get("user");
List<JobCollection> list= jobCollectionService.search(currentUser, pageCond.getBeginNum(), pageCond.getLength());
pageCond.setCount(jobCollectionService.count());
System.out.println("数量:"+list.size());
HttpServletRequest req= ServletActionContext.getRequest();
req.setAttribute("JobCollectionList", list);
req.setAttribute("pageCond",pageCond);
}
public String index() throws Throwable{
System.out.println("JobCollectionAction-index");
this.mySearch();
return SUCCESS;
}
public String destroy() throws Throwable{
super.addActionMessage("删除id为:"+ id +"的数据");
this.mySearch();
return SUCCESS;
}
}
以上的类中index()方法用于处理不带参数的GET请求,其作用是查询出所有记录。
按以上的配置,使用http://localhost:8080/bee/users/operate-history/job-collection就可以触发该Action类中的index()方法(bee在这里是我的工程名),其中类使用了@Result注解的方式来作了说明,为什么使用了@Result而不按约定走,这主要是我在类中使用了命名空间,我把这个Action配置在了users/operate-history下,如果按约定,那么Struts2就会去WEB-INF/content/users/operate-history下去找jsp文件,这还要建立相应的目录,为了避免麻烦,我使用了注解改成直接在content目录下查找结果页面。
这样,调用了业务逻辑对象查询出数据,就可以跳转到jsp页面上遍历显示了。
而删除在这里要多说一下,因为现在并不支持DELETE和PUT两个操作,所以,我们要在表单中多传一个值来模拟这种方式,方法就是在你的<form>标记中加入一个隐藏域:<input type="hidden" name="_method" value="DELETE"/>,这样,在提交表单的时候,Struts2就会知道你当前的请求方式是DELETE,而执行destory()方法。更新也是一样的,加入PUT隐藏域就可以了。下面这个例子:
<table cellspacing="0" cellpadding="0" border="1">
<tr>
<th>序号</th><th>描述</th><th>发布日期</th><th>操作</th>
</tr>
<s:iterator var="i" value="#request.JobCollectionList" status="s">
<s:form method="POST" theme="simple" action="users/operate-history/job-collection/%{#i.job.id}">
<s:hidden name="_method" value="DELETE"/>
<tr>
<td><s:property value="#s.index+1"/></td>
<td><s:property value="#i.job.jobDescription"/></td>
<td><s:date name="#i.job.publishDate" format="yyyy-MM-dd" /></td>
<td><s:submit value="删除"/></td>
</tr>
</s:form>
</s:iterator>
</table>
以上使用迭代标签将内容输出之后,动态的绑定了action属性:action="users/operate-history/job-collection/%{#i.job.id},目的就是传入相应的id,这样发出请求之后,Action类中的id属性就会赋予相应的值,并且加入了隐藏域以模拟DELETE请求。在destroy()方法中,取得id,就可以调用业务逻辑对象来进行删除记录的操作了。
其他请求大同小异,这里不再多说。
有意思的是,使用http://localhost:8080/bee/action-name/1/XXX这种请求方式,其实XXX可以是任何合法的名字,不仅仅只有editNew和edit,名字你可以自己定,Struts2会查找XXX为名字的方法来调用,比如请求http://localhost:8080/bee/test/1/abc,那么TestAction的public String abc()就会被调用。
分享到:
相关推荐
从 Struts 2.1 开始,Struts 2 改为使用 Convention 插件来支持零配置。Convention 插件彻底地抛弃了配置信息,不仅不需要使用 struts.xml 文件进行配置,甚至不需要使用 Annotation 进行配置。而是由 Struts 2 根据...
通常,开发者可以预期在这个文件夹下找到`web.xml`(Struts2和Tomcat的配置)、`struts.xml`(Struts2的配置)、Java源代码(包含Struts2的动作类和可能的模型类)、以及任何视图资源(如JSP或HTML页面)。...
struts2.1.6 convertion插件(即注释方式配置)的hello...rest插件例子 默认调用 create()方法 struts2.1.6 vistor校验例子 都是我测试例子,写到一块了 有点乱 哪为高手给我说下 rest-plugin有什么好处 项目中有说明文件
2. **配置Struts2**:在struts.xml配置文件中启用REST插件,并配置Action,如: ```xml <constant name="struts.action.extension" value=","/> <package name="rest" namespace="/" extends="struts-default,...
Struts2和REST是两种广泛应用于Web开发的技术。Struts2是一个基于MVC(Model-View-Controller)架构模式的Java框架,它极大地简化了Java Servlet的开发,提供了丰富的功能来构建可维护、可扩展的Web应用程序。REST...
3. **Struts2与REST整合**:为了在Struts2中实现REST,需要配置struts.xml文件,定义Action的namespace和method映射,使它们与HTTP方法相对应。此外,可能还需要使用Struts2的Restful插件,该插件提供了自动映射HTTP...
1. **配置Struts2 REST插件**:首先,需要在`struts.xml`配置文件中引入REST插件。这通常涉及到添加`<constant>`和`<package>`标签,设置相关的配置项,如: ```xml <constant name="struts.enable....
这个插件通过约定优于配置的原则简化了Struts2的应用开发,减少了XML配置文件的需求。以下是对Convention Plugin主要特性和功能的详细解释: 1. **包命名习惯**:Convention Plugin通过类所在的包名来确定Action的...
5. `lib` - 依赖的jar文件,如Struts2的核心库、REST插件以及其他依赖的库。 6. `resources` - 可能包含一些配置文件或其他资源,如国际化文件。 7. `jsp` - JSP页面,用于展示视图。 通过分析和运行这个示例项目,...
以下是对Struts2和Struts2-showcase的详细解释: **Struts2框架** Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web应用框架,用于简化Java企业级应用的开发。它是由Apache软件基金会维护,是...
2. **配置Struts2**:在struts.xml配置文件中,定义REST插件并配置相关的拦截器栈。例如: ```xml <constant name="struts.enable.SlashesInActionNames" value="true"/> <constant name="struts.mapper....
Convention插件是Struts2提供的一种自动化配置方式,它旨在减少XML配置文件的数量,提高开发效率。这篇详尽的指南将深入讲解Struts2的Convention配置,让你更好地理解和应用这一特性。 首先,了解什么是Conventions...
第二版删除了第一版中第18章的内容(Struts 2和Struts 1整合部分),全面介绍了Struts 2.1新增的Convention和REST支持。《Struts 2.1权威指南》最后配备的两个常用的实例也都升级为基于Struts 2.1运行,读者可通过这两...
3. **struts2-config-browser-plugin.jar** - 用于在Web应用中浏览器查看Struts配置的插件。 4. **xwork-core.jar** - XWork框架是Struts2的基础,包含了Action、Result、Interceptor等概念的实现。 5. **ognl.jar**...
struts2-convention-plugin.jar,自动化配置插件;struts2-json-plugin.jar,JSON支持;还有其他插件和依赖的jar包。 - 可能还包括第三方库,如Spring、Hibernate、Log4j等,这些是常见的Java企业开发框架和日志工具...
- Struts2拥有丰富的插件生态系统,如REST插件、Ajax插件、Freemarker和Velocity模板插件等,可以扩展框架的功能。 9. **与Spring的整合** - 使用`struts2-spring-plugin`,可以直接在Spring容器中管理Action实例...
这个插件主要的功能是让Struts2应用程序能够轻松地处理JSON(JavaScript Object Notation)数据格式,使得Web应用可以方便地进行JSON序列化和反序列化,从而实现与前端的Ajax交互。 Struts2是一个基于Model-View-...
5. 还有其他如Struts2的测试插件、REST插件、JMX插件等,为开发者提供了更丰富的功能选择。 使用Struts2.1.6时,开发者需要根据项目需求选择合适的jar包和插件,并结合Struts2的配置文件(通常为struts.xml)进行...
在项目中结合使用Convention插件和REST风格的URL,可在`struts.xml`中配置如下常量: ```xml <constant name="struts.convention.action.suffix" value="Controller"/> <constant name="struts.convention.action....
Struts2 Convention 插件是Struts2框架的一个重要组件,自版本2.1起,它取代了Codebehind Plugin,旨在实现Struts2的零配置目标,简化开发流程。这个插件通过遵循一系列预定义的命名约定,自动地映射Action、结果...