传智播客 struts2的特点以及环境的搭配与启动原理

来源:互联网 发布:wifi网络破解器 编辑:程序博客网 时间:2024/05/17 02:54

 

    今天开始学习struts2,先了解一下struts2历史以及特性。J2EE里的框架已经很多了,既然struts1的用户群庞大,为什么还要继续开发出struts2呢?虽然两者看上去似乎就只有版本的区别,但是实际上它们的本质已经有了很大的区别。Struts2是在WebWork2基础发展而来的,它属于MVC框架。因为本质上有很大差别,所以Struts2和struts1在代码编写风格上几乎是不一样的。需要推出struts2的主要是原因有以下一些,同时它们也是struts2有优点(不然也没有存在的价值):
      1.在软件设计上Struts2没有像struts1那样跟Servlet API和struts API有着紧密的耦合,Struts2的应用可以不依赖于Servlet API和struts API。Struts2的这种设计属于无侵入式设计,而Struts1却属于侵入式设计。所谓侵入式,看如下以前的增加学生的Action方法签名:
      public class AddStudentAction extends Action {
            public ActionForward execute(ActionMapping mapping, ActionForm form,
                        HttpServletRequest request, HttpServletResponse response)
                        throws Exception {
            }
      }
    从上可以发现,方法中需要传入request和response对象,这就使Action类依赖了Servlet API,同时前面两个参数是struts1自身的类型,所以该类同样依赖了struts1的API。对比struts1这段代码,在以后将会看到struts2是完全的POJO类,这样复用性也随之提高。
      2.Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能。
      3.Strut2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型。在Struts1中,如果要实现同样的功能,就必须向Struts1的底层实现BeanUtil注册类型转换器才行。
      4.Struts2提供支持多种表现层技术,如:JSP、freeMarker、Velocity等。
      5.Struts2的输入校验可以对指定方法进行校验,解决了Struts1长久之痛。
      6.提供了全局范围、包范围和Action范围的国际化资源文件管理实现。
    因此,可以预见随着时间当天推移,strut2将会逐渐替代struts1成为开发人员的首选框架。先来实际认识struts2,第一步当然是搭建开发环境了,一般都是三步:导入开发Struts2应用需要使用到的jar文件、编写Struts2的配置文件和在web.xml中加入Struts2 MVC框架启动配置。struts2的jar包以及文档可以去官网下载,目前最新版为2.1.8。下载完后解压文件,开发struts2应用需要依赖的jar文件在解压目录的lib文件夹下。不同的应用需要的JAR包是不同的,下面是开发Struts 2程序最少需要的JAR:
      struts2-core-2.x.x.jar :Struts 2框架的核心类库
      xwork-core-2.x.x.jar :XWork类库,Struts 2在其上构建
      ognl-2.6.x.jar :对象图导航语言(Object Graph Navigation Language),struts2框架通过其读写对象的属性
      freemarker-2.3.x.jar :Struts 2的UI标签的模板使用FreeMarker编写
      commons-logging-1.x.x.jar :ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录。
      commons-fileupload-1.2.1.jar 文件上传组件,2.1.6版本后必须加入此文件
    以上就是struts2依赖的最小jar包,特别是最后一个上传组件的jar包,以前版本不是必须的。如果用2.1.6以后的就需要加入lib目录中。
    导入jar包以后,接下来要做的编写struts2的配置文件,该文件和struts1的空文件类似,只是其中的元素换成了<package>,配置文件将在第一个struts2的应用示例中进行详细说明。在这里可以把它看成是和web.xml一样的文件。搭建环境也只需要复制一份空的struts.xml配置文件,这可以从文档或者示例中进行复制,保留好DOCTYPE的声明和根元素<struts>就可以了。
    第三步就是将struts2集成到web应用中,换句话就是说让web程序启动时,能将struts2初始化。在struts1.x中, struts框架是通过Servlet启动的。而在struts2中,struts框架是通过Filter启动的。具体在web.xml中的配置如下:
      <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
      </filter>

      <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
      </filter-mapping>
    以上配置表明,在servlet容器启动的时候,过滤器将被初始化,在初始化过程中,StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。所以默认情况下struts.xml应该放在类路径下,并保持默认的取值。有一点需要说明的就是,在Struts 2.1.3以前,<filter-class>是用的FilterDispatcher类,但现在已经被标注为过时的。所以2.1.3以后的版本就应该用StrutsPrepareAndExecuteFilter类。和struts1一样,struts2读取到struts.xml的内容后,它会以javabean形式存放在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件。到目前为止,struts2的环境基本上就搭建好了,下一篇就来创建第一个struts2的应用。