`

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 对常用的接口进行了重新封装,比如 HttpServletRequest HttpServletResponse HttpServletContext 等。 以下是 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.static template 、和 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 发送请求时, FilterDispatcher doFilter() 方法自动调用,这个方法非常关键。首先, Struts2 对请求对象进行重新包装,此次包装根据请求内容的类型不同,返回不同的对象,如果为 multipart/form-data 类型,则返回 MultiPartRequestWrapper 类型的对象,该对象服务于文件上传,否则返回 StrutsRequestWrapper 类型的对象, MultiPartRequestWrapper StrutsRequestWrapper 的子类,而这两个类都是 HttpServletRequest 接口的实现。

 

2
0
分享到:
评论

相关推荐

    Struts2的第一个实例helloworld

    Struts2的入门小实例helloworld,jar包齐全,可以运行。

    Struts2 实例 HelloWorld

    本章完成一个HelloWorld实例开发的演示,目的是使读者可以对struts2有一个整体的认识,熟悉glassfish2的使用,主要讲解了一个简单的Struts2应用的HelloWorld实例,这个例子可以帮助读者快速入门,获得开发Struts2...

    struts框架-helloworld

    第一个struts框架的完成,使用eclipse写的。第一次写其实是在半年前,现在再重新写,真是错误连篇,最讨厌的是报404错误。首先检查tomcat部署时,有什么错误,针对性解决,大多是因为jar包多了或者少了。有时,jar包...

    第二章 Struts2 下的HelloWorld 源码 1

    Struts2 下的HelloWorld 源码 1

    [Struts 2权威指南--基于WebWork核心的MVC开发(高清完整版) 1/12

    第1章 Struts 2概述,第2章 Struts 2下的HelloWorld,第3章 Struts 2基础,第4章 深入Struts 2,第5章 Struts 2的类型转换,第6章 文件的上传和下载.,第7章 Struts 2的拦截器,第8章 Struts 2的输入校验,9.2 ...

    Struts2 chm文档

    2.truts 2权威指南——第2章 Struts 2下的HelloWorld.doc 3.Struts 2权威指南——第3章 Struts 2基础.doc 4.Struts2.0系列(1-15) 5.Struts2中用Spring实现IoC.doc 6.Struts2中的零配置与CoC(Convention over ...

    Struts2 in action中文版

    第一部分 Strut 2:一个全新的框架 第1章 Struts 2:现代Web框架 2 1.1 Web应用程序:快速学习 2 1.1.1 构建Web应用程序 2 1.1.2 基础技术简介 3 1.1.3 深入研究 6 1.2 Web应用程序框架 7 1.2.1 什么是框架 7 1.2.2 ...

    struts项目搭建

    二、第一个Struts 2.0应用程序——Hello World 下面我们进行臭名昭著的Hello World程序。几乎所有语言的第一个程序都是Hello World。在src目录上右键,新建一个类,参数如下: 类的内容如下: package ...

    struts入门[文字版][中文].

    第二章 HelloWorld你的第一个Struts程序 第三章 MVC概述 第四章 Model模型 第五章 View页面视图 第六章 Controller控制器 第七章 使用Struts连接池 第八章 Struts的异常处理 第九章 Struts的国际化 第十章 Plug-in ...

    struts2 总结入门学习文档 教你如何搭建一个struts2环境

    struts2 总结入门学习文档 教你如何白手起家搭建Struts2开发环境、编写第一个struts2应用helloworld、属性介绍、接口、拦截器介绍、struts2标签等。93页

    Struts2.0中文教程权威版

    Struts 2权威指南——第1章 Struts 2概述.doc Struts 2权威指南——第2章 Struts 2下的HelloWorld.doc Struts 2权威指南——第3章 Struts 2基础.doc 01 为Struts 2.0做好准备 02 常用的Struts 2.0的标志(Tag) 03 ...

    Strust代码 hello world

    Struts基础开发,开发第一个struts程序,包括struts开发环境的配置。

    struts2_demo.rar_Java编程_Java_

    里面包括了10个小故事,每个故事都针对一个经典的知识点:第一个故事,讲述如何在Struts2.0里开发你的Hello world第二个故事,模拟登陆,主要是看formbeean对象在action里怎么用第三个故事,操作调用自己的方法,而...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...

    Struts Web设计与开发大全

    01章:本书第1章的工程,只需直接使用JBuider 2005打开即可; 02章:猜数字工程; 03章:登录用例和常用Web组件开发工程以及数据库脚本; 05章:实体Bean开发示例,该示例仅供参考; 08-11章:标记库taglib1应用...

    helloworld

    帮你创建第一个struts2,了解struts2的工作流程和原理。

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...

Global site tag (gtag.js) - Google Analytics