可能很多学java web的学僧看到struts 1.x 的章节就直接跳过了,因为这东东"基本没人用"了。我觉得如果不是为了急功近利现学现卖的做网站或者本科生项目和课程设计,struts 1.x 其实也应该抽时间好好看一看。毕竟是为了进一步理解后面的SSH,struts 1.x还是个相对简单的入手点,这样也能和webwork模式的struts 2.x进行对比,对后面的框架能有更好的帮助。
这几天看《Java Web整合开发王者归来》对java web进行一个复习,不过这本一千多页的书讲得要比图书馆里的书细致很多,初学者看看这个或许帮助会大一些。
struts 1.x 我的认识就是反射和注入。
struts 1.x 的控制器就是ActionServlet。struts 1.x 的Action并不是Servlet,但它和Servlet一样实现各种业务,这个过程用到的就是反射。ActionServlet截获指定的请求(默认 *.do)通过struts-config.xml将请求分"配给"给指定的Action,实质是反射到那个Action类并执行它的execute。以填写hello.jsp表单为例,流程就是:
hello.jsp→hello.do→ActionServlet(struts-config.xml)→HelloForm(validate)→HelloAction→execute→forward
这里顺便补充一下反射和RTTI的区别,其实知道RTTI的汉译就能明白。RTTI(运行期类型标识)可以用在检查下塑造型是否正确,而 反射则是查找需要的类。当然还有一个细小的区别就是反射的是类文件可以在网上,而RTTI的class类必须在本地。这部分在《thinking in java》里有详细的说明。
struts-config.xml的配置信息可以说是注入到ActionServlet内部的。如果是小的项目,或许注入要多写不少代码,反而显得麻烦。但是如struts 一样,如果不采用注入,使用这个MVC框架就得修改ActionServlet内部代码了,那就远没有改改struts-config.xml就能用那么简单了。
struts的FormBean是线程安全的,但Action是线程不安全的,建议用final修饰,免得出错。
虽然现在连MyEclipse 10都能自动导入 struts 2.x 了,但这并不意味 struts 1.x 就没用了。我有个同学,为了学习SSH,结果写一个校创项目新闻发布系统时把SSH都导到项目里了……当然他是为了学习,如果是真要做简单的新闻发布系统,我觉得struts 1.x + DAO 足够了。因为struts 1.x不光有标签库,类型转换的功能,它的<data-sources />也可以配置数据库,相比自己写MVC,它的功能是蛮全面的了。
当然,struts 1.x 肯定不适合于特别复杂的项目了,比如它是用FormBean的validate来验证的,即使用Validator也不是很方便。而struts 2.x 的过滤器可以很轻松的的解决验证问题、甚至防盗链、图片水印、日志都能通过过滤器解决。