Struts2概念及第一个Struts2项目(HelloWorld)

Struts2是 Struts社区和 WebWork社区的共同成果,我们甚至可以说, Struts2是 WebWork的升级版,他采用的正是 WebWork的核心,所以, Struts2并不是一个不成熟的产品,相反,构建在 WebWork基础之上的 Struts2是一个运行稳定、性能优异、设计成熟的 WEB 框架。

之前看多一些struts2课程视频,感觉讲得非常棒。但是今天吕海东老师讲的struts2课程,我感到受益匪浅。

他讲课风格是通俗易懂、概念结合程序实例,感觉收获真的非常之大啊。

在此学生希望吕老师身体健康、工作顺心。

 

一:认识Struts2

1:Struts2是一个基于JavaEE框架(request/response)

2:实现了JavaWeb MVC的VC功能

View(V)功能: ⑴输入:Struts2 FormatTag 如<s:textfield />||<input type="text" />

                          ⑵输出:DataTag(类似于${})+LogicTag(<c:foreach/>)+I18NTag      

Controller(C)功能:⑴取得表单数据⑵数据验证⑶数据类型转换⑷调用Model曾方法⑸传递数据⑹跳转到页面 

二:Strut2中C、V的具体作用

㈠核心控制器:FilterDispatcher

㈡拦截器:Interceptor

㈢Action:实现具体控制器

㈣Result:负责导航 ->实现转发功能

㈤ActionContex:保存请求中所有数据

㈥ValueStack:保存Action数据

㈦OGNL:表达式语言(类似于EL)

三:Struts2的工作原理

 

下载的 Struts2源代码文件是一个名叫 struts-2.1.0-src.zip的压缩包,里面的目录和文件非常多,读者可以定位到 struts-2.1.0-src"struts-2.0.10"src"core"src"main"java 目录下查看 Struts2的源文件,如图 14所示。

 

(图 14)

 

主要的包和类

Struts2框架的正常运行,除了占核心地位的 xwork的支持以外, Struts2本身也提供了许多类,这些类被分门别类组织到不同的包中。从源代码中发现,基本上每一个 Struts2类都访问了 WebWork提供的功能,从而也可以看出 Struts2与 WebWork千丝万缕的联系。但无论如何, Struts2的核心功能比如将请求委托给哪个 Action处理都是由 xwork完成的, Struts2只是在 WebWork的基础上做了适当的简化、加强和封装,并少量保留 Struts1.x中的习惯。

以下是对各包的简要说明:

 

 

包名

说明

org.apache.struts2. components

该包封装视图组件, Struts2在视图组件上有了很大加强,不仅增加了组件的属性个数,更新增了几个非常有用的组件,如 updownselect、 doubleselect、 datetimepicker、 token、 tree等。

另外, Struts2可视化视图组件开始支持主题 (theme),缺省情况下,使用自带的缺省主题,如果要自定义页面效果,需要将组件的 theme属性设置为 simple。

org.apache.struts2. config

该包定义与配置相关的接口和类。实际上,工程中的 xml和 properties文件的读取和解析都是由 WebWork完成的, Struts只做了少量的工作。

org.apache.struts2.dispatcher

Struts2的核心包,最重要的类都放在该包中。

org.apache.struts2.impl

该包只定义了 3个类,他们是 StrutsActionProxy、 StrutsActionProxyFactory、 StrutsObjectFactory,这三个类都是对 xwork的扩展。

org.apache.struts2.interceptor

定义内置的截拦器。

org.apache.struts2.util

实用包。

org.apache.struts2.validators

只定义了一个类: DWRValidator。

org.apache.struts2.views

提供 freemarker、 jsp、 velocity等不同类型的页面呈现。

下表是对一些重要类的说明:

 

类名

说明

org.apache.struts2.dispatcher. Dispatcher

      该类有两个作用:

       1、初始化

       2、调用指定的 Action的 execute()方法。

org.apache.struts2.dispatcher. FilterDispatcher

      这是一个过滤器。文档中已明确说明,如果没有经验,配置时请将 url-pattern的值设成 /*。

      该类有四个作用:

       1、执行 Action

       2、清理 ActionContext,避免内存泄漏

       3、处理静态内容( Serving static content)

       4、为请求启动 xwork’s的截拦器链。

com.opensymphony.xwork2. ActionProxy

       Action的代理接口。

com.opensymphony.xwork2. ctionProxyFactory

      生产 ActionProxy的工厂。

com.opensymphony.xwork2.ActionInvocation

      负责调用 Action和截拦器。

com.opensymphony.xwork2.config.providers. XmlConfigurationProvider

      负责 Struts2的配置文件的解析。

Struts2的工作机制

3.1Struts2体系结构图

       Strut2的体系结构如图 15所示:

 

 (图 15)

3.2Struts2的工作机制

      从图 15可以看出,一个请求在 Struts2框架中的处理大概分为以下几个步骤:

1、客户端初始化一个指向 Servlet容器(例如 Tomcat)的请求;

2、这个请求经过一系列的过滤器( Filter)(这些过滤器中有一个叫做 ActionContextCleanUp的可选过滤器,这个过滤器对于 Struts2和其他框架的集成很有帮助,例如: SiteMesh Plugin);

3、接着 FilterDispatcher被调用, FilterDispatcher询问 ActionMapper来决定这个请求是否需要调用某个 Action;

4、如果 ActionMapper决定需要调用某个 Action, FilterDispatcher把请求的处理交给 ActionProxy;

5、 ActionProxy通过 Configuration Manager询问框架的配置文件,找到需要调用的 Action类;

6、 ActionProxy创建一个 ActionInvocation的实例。

7、 ActionInvocation实例使用命名模式来调用,在调用 Action的过程前后,涉及到相关拦截器( Intercepter)的调用。

8、一旦 Action执行完毕, ActionInvocation负责根据 struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个 Action链)一个需要被表示的 JSP或者 FreeMarker的模版。在表示的过程中可以使用 Struts2框架中继承的标签。在这个过程中需要涉及到 ActionMapper。

 

3.3Struts2源代码分析

      和 Struts1.x不同, Struts2的启动是通过 FilterDispatcher过滤器实现的。下面是该过滤器在 web.xml文件中的配置:

代码清单 6 : web.xml (截取)

    < filter >

       < filter-name > struts2 </ filter-name >

       < filter-class >

           org.apache.struts2.dispatcher.FilterDispatcher

       </ filter-class >

    </ filter >

    < filter-mapping >

       < filter-name > struts2 </ filter-name >

       < url-pattern > /* </ url-pattern >

    </ filter-mapping >

       Struts2建议,在对 Struts2的配置尚不熟悉的情况下,将 url-pattern配置为 /*,这样该过滤器将截拦所有请求。

      实际上, FilterDispatcher 除了实现 Filter 接口以外,还实现了 StrutsStatics 接口,继承代码如下:

代码清单 7 FilterDispatcher 结构

public class FilterDispatcher implements StrutsStatics, Filter {

}

StrutsStatics 并没有定义业务方法,只定义了若干个常量。 Struts2 对常用的接口进行了重新封装,比如 HttpServletRequestHttpServletResponseHttpServletContext 等。 以下是 StrutsStatics 的定义:

代码清单 8 StrutsStatics.java

public interface StrutsStatics {

    /**

     * Constant for the HTTP request object.

     */

    public static final String HTTP_REQUEST = "com.opensymphony.xwork2.dispatcher.HttpServletRequest" ;

    /**

     * Constant for the HTTP response object.

     */

    public static final String HTTP_RESPONSE = "com.opensymphony.xwork2.dispatcher.HttpServletResponse" ;

    /**

     * Constant for an HTTP request dispatcher} .

     */

    public static final String SERVLET_DISPATCHER = "com.opensymphony.xwork2.dispatcher.ServletDispatcher" ;

    /**

     * Constant for the servlet context} object.

     */

    public static final String SERVLET_CONTEXT = "com.opensymphony.xwork2.dispatcher.ServletContext" ;

    /**

     * Constant for the JSP page context} .

     */

public static final String PAGE_CONTEXT = "com.opensymphony.xwork2.dispatcher.PageContext" ;

    /** Constant for the PortletContext object */

    public static final String STRUTS_PORTLET_CONTEXT = "struts.portlet.context" ;

}

    容器启动后, FilterDispatcher 被实例化,调用 init(FilterConfig filterConfig) 方法。该方法创建 Dispatcher 类的对象,并且将 FilterDispatcher 配置的初始化参数传到对象中(详情请参考代码清单 10 ),并负责 Action 的执行。然后得到参数 packages ,值得注意的是,还有另外三个固定的包和该参数进行拼接,分别是 org.apache.struts2.statictemplate 、和 org.apache.struts2.interceptor.debugging ,中间用空格隔开,经过解析将包名变成路径后存储到一个名叫 pathPrefixes 的数组中,这些目录中的文件会被自动搜寻。

代码清单 9 FilterDispatcher.init() 方法

    public void init(FilterConfig filterConfig) throws ServletException {

        this .filterConfig = filterConfig;      

        dispatcher = createDispatcher(filterConfig);

        dispatcher.init();      

        String param = filterConfig.getInitParameter( "packages" );

        String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging" ;

        if (param != null ) {

            packages = param + " " + packages;

        }

        this . pathPrefixes = parse(packages);

}

代码清单 10 FilterDispatcher.createDispatcher() 方法

    protected Dispatcher createDispatcher(FilterConfig filterConfig) {

        Map<String,String> params = new HashMap<String,String>();

        for (Enumeration e = filterConfig.getInitParameterNames(); e.hasMoreElements(); ) {

            String name = (String) e.nextElement();

            String value = filterConfig.getInitParameter(name);

            params.put(name, value);

        }

        return new Dispatcher(filterConfig.getServletContext(), params);

   }

    当用户向 Struts2 发送请求时, FilterDispatcherdoFilter() 方法自动调用,这个方法非常关键。首先, Struts2 对请求对象进行重新包装,此次包装根据请求内容的类型不同,返回不同的对象,如果为 multipart/form-data 类型,则返回 MultiPartRequestWrapper 类型的对象,该对象服务于文件上传,否则返回 StrutsRequestWrapper 类型的对象, MultiPartRequestWrapperStrutsRequestWrapper 的子类,而这两个类都是 HttpServletRequest 接口的实现。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值