明晰了Struts2的学习途径,我们需要一些参考资料来进行学习。Struts2来源于Webwork2,所以绝大多数原本Webwork2的优秀学习资料,都非常值得我们去学习阅读。在这里,我来简单小节一下当前市面上的Struts2的学习资料。
1. Struts2自带的reference和sample ———— 推荐指数:5颗星
Struts2自带的reference和sample在Struts2的发行包中间都有包含,请大家各自参阅即可。
Struts2的reference基本上是wiki形式的,每个小专题的篇幅不长,但是讲解非常到位,也非常易读。而其中所举例的代码也比较贴近实际,应该能够说明绝大多数问题。
我这里另外想提一下的是Struts2官方网站上另外一个挺有价值的链接:
http://cwiki.apache.org/S2PLUGINS/home.html。
这个链接列出了目前Struts2的一些plugin。当然,如果你有兴趣,也可以自己写plugin,并到官网上去announce一把。Struts2的很多特性,有了plugin的支持,会变得更加优秀。大家可以顺着这个链接去扫一遍所有的plugin,看看他们到底是干嘛的,或许你会有非常意外的收获。
2. moxie同学早在2004年的作品:《最新的Webwork教程》 ———— 推荐指数:5颗星
moxie同学是国内比较早研究Webwork的人,并且在当时Webwork资料缺乏的情况下,他贡献了这篇难能可贵的入门级教程。这份文档的错误很少,对于Webwork核心的概念的理解准确到位,是入门者学习Webwork或Strus2的极佳读物。
这个是他在Javaeye上的原帖地址:
http://www.iteye.com/post/29205
可惜的是他所贴出的地址已经无法访问,我会尽快找出这份原始资料并上传成附件供大家参考的。
3. Javaeye上对于moxie教程的补充系列和讨论 ———— 推荐指数: 4颗星
在04年以后,Javaeye一度曾经热火朝天的进行Webwork/XWork的宣传,事实也证明了Robbin的眼光,Webwork2与Struts合并成为Struts2,以Webwork2为基础,并且逐渐发展为Web层最重要的开发框架之一。
在这个过程中,Javaeye上涌现出一批非常好的帖子,包括moxie, Quake Wang, Tin等同学都贡献了极佳的文章,我在这里简单推荐几篇值得一读的文章:
[moxie] WebWork2多模块解决方法:
http://www.iteye.com/topic/6529
[moxie] 在WebWork2 Action中如何自动设置Array、List、Map:
http://www.iteye.com/topic/8770
[Tin] webwork 2.2 中如何给Collection赋值:
http://www.iteye.com/topic/17939
[zhuam] WebWork2.x源码分析:
http://www.iteye.com/topic/10347
[moxie] 纠正WebWork2的Model-driven(模型驱动)Action:
http://www.iteye.com/topic/12505
[Quake Wang] 对于moxie的《WebWork教程》补充 - [文件上传]:
http://www.iteye.com/topic/10697
[Quake Wang] 对于moxie的"WebWork教程"补充 - [类型转化]:
http://www.iteye.com/topic/10507
[曹晓钢] webwork2 action和Spring结合的两种方式:
http://www.iteye.com/post/44853
针对这些文章,大家最好是带着问题去读,把这些文章当作是专题、最佳实践来读,而不是当作真正的文档来读,这样效果是最好的。当然,这里绝大多数文章是Webwork2的,大家完全可以忽略这个名词,把它当作Struts2来读,并吸取其中的精华部分。
Javaeye在Webwork2和Struts2方面的贡献远远不止我上述列出的这些文章。还有无数的革命先辈曾经贡献过非常好的文章,在这里就不一一列举了,大家可以根据需要,使用论坛的搜索功能。
4. 夏昕同学的开源文档:《Webwork2 开发指南》 ———— 推荐指数: 3颗星
《Webwork2 开发指南》的下载地址为:
http://wiki.redsaga.com/confluence/display/RSTEAM/Home。
夏昕同学的开源文档系列曾经一度伴随早期的开源框架学习者读过枯燥的学习生涯。不过相比其他两本开发指南,这本书的质量我认为着实一般。所以大家可以有选择性的阅读。针对其中的某些作者的观点,也不必奉若神灵。
5. 网友Max贡献的系列教程 ———— 推荐指数: 3颗星
系列教程的地址:
http://www.blogjava.net/max/category/16130.html
我看论坛上有不少人是看着这个教程入门的:
ray_linn 写道
我觉得你也不用全写了, Max的那几篇struts 2.0真的写得相当不错,做点适当的补充就成了。
http://www.blogjava.net/max/category/16130.html
这个教程我事先没有读过,见到网友列出了链接,我也就顺便去看了一下整个系列的文章。应该说Max同学非常认真努力的在试图完成这整个系列的文章,并且也针对Struts2的方方面面做了一些分类讲解。不过我对这个系列文章的看法是:可以通过扫读的方式阅读,针对里面的示例代码,就不用去尝试了,而某些观点,也不要深究了。因为其中的某些代码是存在问题的,也不是很贴近实际,其中的讲解也存在着不小的问题。
在这里我简单列举几处非常明显而不该犯的错误:
我们首先来看看其第一篇文章:
http://www.blogjava.net/max/archive/2006/10/10/74353.html。其中写到有关Struts2的Action的测试的代码:
package tutorial;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldTest {
@Test
public void testExecute() {
HelloWorld hello = new HelloWorld();
hello.setName("World");
String result = hello.execute();
assertTrue("Expected a success result!", ActionSupport.SUCCESS.equals(result));
final String msg = "Hello, World!";
assertTrue("Expected the default message!", msg.equals(hello.getName()));
}
}
对此,我深表遗憾。也请广大读者不要被这样的代码所误导。Struts2的Action的正确的测试方式,请参考:
http://struts.apache.org/2.0.14/docs/guides.html <--- 官网文档首页中对测试Action的链接
http://fassisrosa.blogspot.com/2006/11/unit-testing-struts-20.html <--- 官网文档中讲述测试Action所引用的链接
我们再来看看Max同学对Struts2中非常核心的功能Interceptor的讲解:
http://www.blogjava.net/max/archive/2006/12/06/85925.html
抛开示例不谈,从他给出的这幅图来看,至少还缺少了拦截器中的重要定义:PreResultListener。同时,由于没有结合源码进行讲解,事实上他也无法表示出它时序图中Interceptor的真正实现机制,至少无法准确指出before,after,以及preResultListener这样的程序插入点在拦截器中的调用顺序。有一定Struts2拦截器知识的人都知道,Struts2中的拦截器的核心是沿着拦截器链的一串拦截器的递归调用。正因为有着这一串的递归调用,才使得before,after,以及preResultListener这样的程序插入点能够按照规则有序执行。
如果我们同样参考一下Struts2官方的reference对拦截器的讲述呢:
http://struts.apache.org/2.0.14/docs/interceptors.html
大家可以看到,在官方讲解的最后,用了一个简单的示例清晰地说明Action与拦截器的调用顺序和执行关系。大家完全可以进行一下比较,到底是那边的讲解更能让你明白一些。
再来看看Max同学在国际化章节上的答疑:
http://www.blogjava.net/max/archive/2006/11/01/78536.html
max 写道
可能大家会问为什么一定要通过Action来访问页面呢?
你可以试一下不用Action而直接用JSP的地址来访问页面,结果会是无论你在下拉列表中选择什么,语言都不会改变。这表示不能正常运行的。其原因为如果直接使用JSP访问页面,Struts 2.0在web.xml的配置的过滤器(Filter)就不会工作,所以拦截器链也不会工作。
这就更加让人有点摸不着头脑了,"直接使用JSP访问页面,Struts 2.0在web.xml的配置的过滤器(Filter)就不会工作",你的web.xml不是配置的匹配/*作为你的Filter的响应URL规则嘛?为什么Filter会不工作?这里不免有点答非所问了。
可能文章中还有一些其他的问题,我就不一一指出了。对于这样的网络教程,我的态度是你可以读,但是需要精读,并且需要足够的思考来辨别真伪,否则,可能会被之忽悠。
6. 以《Struts2权威指南》为首的有价书籍 ———— 推荐指数: 负
这类书籍我的推荐指数为负数的最重要的理由在于,这些书籍都很贵。我首先不去评论这些书写得好坏,单就这价钱,我认为大家还是省下这些钱捐助希望工程吧。因为事实上,网络上已经有足够的教学资料和教学文章,我们不必舍近求远,还搭上人民币。
这类书籍的其他问题,我在《Struts2的学习途径》中已经阐述,在这里我就不再一一列举了。