首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Struts2中的0配置与CoC(Convention over Configration)

2012-11-09 
Struts2中的零配置与CoC(Convention over Configration)摘要:介绍Struts2中的零配置(Zero Configuration),

Struts2中的零配置与CoC(Convention over Configration)
摘要:介绍Struts2中的零配置(Zero Configuration),以及如何用COC来更好地简化Struts2的配置。在第一章,我使用Maven来创建一个起点项目;第二章,以该项目为例,讲解如何使用Struts2的零配置;第三章,论述第二章中的实现方式的缺陷,然后讲解如何使用COC来改进这些缺陷,并进一步简化Struts2的配置。附件是这篇文章用到的示例代码。

一、从零开始这里,我将建立一个新的示例项目,作为讲解的起点。我使用JDK 6、Maven 2、Eclipse 3.3来建立这个示例,如果读者对Maven2不熟也没关系,这只是个示例。
首先,运行下边的命令:
??? ??? ??? ??? mvn archetype:create -DgroupId=demo.struts -DartifactId=demo-struts-coc -DarchetypeArtifactId=maven-archetype-webapp
这会建立如下的目录结构:<demo-struts-coc>
?|- POM.xml
?|- src
?? ? |- main
???? ? ? |- resources
?? ?? ?? |- webapp
????? ? ? ?? |- index.jsp
?? ? ? ????? |- WEB-INF
? ? ? ?????????? |- web.xml
然后我们在src/main目录下新建一个名为java的目录,用来放置java代码。在src下建立test目录,并在test目录下建立java目录,用来放置测试代码。另外,我这个示例不想使用JSP,所以我将src/main/webapp目录下的index.jsp改为index.html。
现在,需要配置该项目要用到哪些lib。在POM.xml中加入struts2-core:
</demo-struts-coc>目前,这个新特性还在测试阶段,但经过一段时间的使用,我觉得这个特性已经可用。下面我讲一下如何使用它。
1. Actions的定位
以前需要在xml配置文件中配置Action的name和class,如果使用零配置,所带来的一个问题就是如何定位这些Action。我们需要在web.xml中找到struts2的filter的配置,增加一个名为actionPackages的init-param,它的值是一个以逗号分隔的Java包名列表,比如:demo.actions1,demo.actions2。struts2将会扫描这些包(包括这些包下边的子包),在这些包下,所有实现了Action接口的或者是类名以“Action”结尾的类都会被检查到,并被当做Action。
以前,我们写Action必须要实现Action接口或者继承ActionSupport。但是,上面提到的类名以"Action"结尾的类并不需要这样做,它可以是一个POJO,Struts2支持POJO Action!
下面是actionPackages的配置示例:
public class PeopleAction{ public String list(){ return "success"; } public String save(){ return "success"; } public String edit(){ return "success"; }}分别调用的URL是;
(1)*/*/listPeople.action
(2)*/*/savePeople.action
(3)*/*/editPeople.action
这样的话,写起的action不会太多.
ActionConfig actionConfig = new ActionConfig(); actionConfig.setClassName(cls.getName()); actionConfig.setPackageName(actionPackage);

如果这里setClassName里面改成设定cls.getSimpleName()的话 (可能首字母要转成小写),应该就可以更好的适应Spring的情形了,但仔细想想也很难实现,因为这样要求必须在Spring里配置action (否则用Simplename,如果Spring plugin不能load action,则Struts2也无法load到action),实在违背了零配置的初衷。而且没有其他配置的情况下,也很难决定究竟什么时候用simpleName,什么时候用全名。因此,这确实是个两难的问题,也难怪Struts2采用这样的实现了。

话说回来,反正如果要写Spring的配置文件的话,也不在乎在Struts的配置文件里多写一行了,唉……<action name="*/*" method="{2}" name="code">public abstract class BaseAction {protected final String CUSTOM = "custom";private String target;protected final Log logger = LogFactory.getLog(getClass());public String getTarget() {return target;}public void setTarget(String target) {this.target = target;}protected String render(String _target){setTarget(_target);return CUSTOM;}}
然后继承BaseAction

public class UserAction extends BaseAction{private User user;private UserService userService;public void setUserService(UserService userService) {this.userService = userService;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public String test(){user = userService.get(1l);return render("test");}}

这样在action里面,可以通过return render(target)来间接实现零配置转发到指定的jsp页面
URL:http://localhost:8080/workbench/User/test 12 楼 avi2 2007-10-16   downpour 写道楼主的CoC完全采用XML或者Json方式输出,可能多数人还接受不了,可能多数开发者还停留在JSP或者Freemarker的阶段。当然,对此个人有个人的喜欢,我觉得比较好的方式是任何一种方式仅仅提供一种Option,可以在各种Option中任意切换。

事实上,楼主的文章还欠缺了很大的一块,Struts2其实已经相当CoC了。Struts2所提供的CoC,主要包含2个主要的阶段:
1. 根据URL命名映射到相应的Action类进行执行。
这种方式楼主已经进行了介绍,其实就是利用namespace+url映射到package+Action类。
2. 根据URL命名,自动寻找Result
这一点楼主没有说。事实上Struts2提供了一个插件,叫做Codebehind Plugin。它可以自动根据URL去寻找对应目录下的jsp,ftl模板或者vm模板。具体的URL地址在:http://struts.apache.org/2.x/docs/codebehind-plugin.html。详细内容一看就明白了,无须过多解释。

将上述2点结合起来在项目中使用,可以极大程度上简化配置,要是在加上annotation,至少可以减少90%以上的配置。不过要真正做到0配置,我想还是有些难度的。如果真要追求URL漂亮或者URL的Rest化,就不得不改写ActionMapper了。
貌似你的路子比楼主正很多啊 13 楼 kyo100900 2007-10-28   downpour 写道楼主的CoC完全采用XML或者Json方式输出,可能多数人还接受不了,可能多数开发者还停留在JSP或者Freemarker的阶段。当然,对此个人有个人的喜欢,我觉得比较好的方式是任何一种方式仅仅提供一种Option,可以在各种Option中任意切换。

事实上,楼主的文章还欠缺了很大的一块,Struts2其实已经相当CoC了。Struts2所提供的CoC,主要包含2个主要的阶段:
1. 根据URL命名映射到相应的Action类进行执行。
这种方式楼主已经进行了介绍,其实就是利用namespace+url映射到package+Action类。
2. 根据URL命名,自动寻找Result
这一点楼主没有说。事实上Struts2提供了一个插件,叫做Codebehind Plugin。它可以自动根据URL去寻找对应目录下的jsp,ftl模板或者vm模板。具体的URL地址在:http://struts.apache.org/2.x/docs/codebehind-plugin.html。详细内容一看就明白了,无须过多解释。

将上述2点结合起来在项目中使用,可以极大程度上简化配置,要是在加上annotation,至少可以减少90%以上的配置。不过要真正做到0配置,我想还是有些难度的。如果真要追求URL漂亮或者URL的Rest化,就不得不改写ActionMapper了。

downpour能把Codebehind讲明白点吗? 14 楼 williamy 2007-10-28   如果struts 1也能零配置,各位大大,會用struts1還是struts2呢? 15 楼 flashing 2007-10-31   会用struts2,差别不是仅仅的一个1和2的问题,而是模型的问题。 16 楼 seno 2007-12-09   interceptor在哪里配置? 17 楼 allenny 2007-12-18   UI确实很慢,但是我又不得不用S2的标签,请问楼主有什么办法能够改善S2的UI的性能。哪怕只是20%的改善也行啊。 18 楼 gj1237 2008-04-18   哎,java呀~~~~~~~~~~

热点排行