`

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”压缩包中应该包含了所有必要的库文件,确保项目能够正常运行。 接下来,创建一个简单的Action类。在Struts2中,Action类需要继承自`com.opensymphony.xwork2.ActionSupport`...

    struts2 helloworld程序

    在这个"Struts2 HelloWorld"程序中,我们将深入理解Struts2的基本结构和配置,以及如何创建第一个简单的应用。 首先,让我们从环境搭建开始。为了运行Struts2的HelloWorld程序,你需要安装Java Development Kit ...

    Struts2 实例 HelloWorld

    ### Struts2 实例 HelloWorld 知识点解析 #### 一、概述 在学习Struts2框架时,通常会从最简单的“Hello World”实例开始。这种实例不仅可以帮助初学者快速上手,还能让大家对Struts2的工作原理有一个基本的理解。...

    Struts2_HelloWorld

    这个"Struts2_HelloWorld"项目是初学者学习Struts2框架的理想起点。它提供了一个简单的示例,帮助开发者理解如何在实际环境中设置和运行一个基本的Struts2应用。 首先,我们需要了解Struts2的核心概念。Struts2是...

    Struts2系列(一)——永远的HelloWorld

    本篇文章将引导你逐步了解如何使用Struts2创建你的第一个"Hello, World!"应用程序,同时解决项目中可能出现的依赖问题。 在开始之前,确保你已经安装了Java开发环境(JDK)和Apache Maven或Apache Ant,这两个工具...

    struts2,helloworld例子

    这个“struts2,helloworld例子”是针对初学者的一个典型教程,旨在帮助开发者快速理解和掌握Struts2的基本用法。 首先,我们需要在MyEclipse这样的集成开发环境中搭建Struts2项目环境。这通常包括以下几个步骤: 1...

    struts2学习笔记1-HelloWorld项目

    本篇学习笔记将引导我们从零开始,通过一个简单的"HelloWorld"项目,了解Struts2的基础知识。 首先,我们需要在本地环境中搭建Struts2的开发环境。这包括安装JDK、配置Java环境变量、下载Apache Struts2的最新版本...

    struts2 HelloWorld最小必备包

    这个"struts2 HelloWorld最小必备包"是初学者入门Struts2框架的起点,它包含了运行一个简单的"Hello, World!"示例所需的所有核心组件。 1. **Struts2 Core** (`struts2-core-2.5.2.jar`): 这是Struts2框架的核心...

    第二章 Struts2 下的HelloWorld 源码 1

    本章节我们将深入解析“第二章 Struts2 下的HelloWorld 源码 1”这一主题,通过分析源代码,理解Struts2的核心工作原理以及其基本配置。 在Struts2中,HelloWorld程序是初学者入门的经典示例,它帮助我们快速掌握...

    IntelliJ IDEA 2017.3创建第一个Struts2项目

    在本文中,我们将深入探讨如何使用IntelliJ IDEA 2017.3版本来创建一个基于Struts2框架的第一个Web应用程序。Struts2是一个强大的、开源的MVC(Model-View-Controller)框架,它简化了Java Web开发,提高了代码的可...

    struts2制作helloworld

    对于初学者来说,"Struts2制作HelloWorld"是理解并掌握该框架的第一步。下面我们将深入探讨这个过程涉及的主要知识点。 1. **Struts2项目的搭建**:创建一个Struts2项目通常包括以下几个步骤: - 引入Struts2的...

    第一个struts2 程序

    本教程将深入探讨如何创建并运行你的第一个Struts2程序。 首先,我们需要了解Struts2的核心概念。Struts2框架提供了一种分层架构,它通过Action类处理用户请求,Action类与业务逻辑交互,并通过Result返回视图。...

    Struts2学习笔记(一) 环境的搭建与HelloWorld程序

    4. **创建第一个Action**:在src/main/java目录下创建一个新的Java类,例如`HelloWorldAction`,实现Struts2的Action接口。代码如下: ```java package com.example.helloworld; import ...

    Eclipse创建最简单的struts2项目

    现在我们可以创建第一个Struts2动作类。在src目录下创建一个包(例如com.example.struts2),然后创建一个Java类,如"HelloWorldAction",继承自`com.opensymphony.xwork2.ActionSupport`。在这个类中,定义一个返回...

    Struts 2 自学之路: 1 准备工作及helloworld

    本文将引导你踏上Struts 2的自学之旅,从准备工作开始,逐步介绍如何创建并运行你的第一个“Hello, World!”程序。 ### 1. Struts 2 框架简介 Struts 2是Apache软件基金会的一个开源项目,它是基于MVC(Model-View-...

    struts2完整的Hello Word例子。

    Struts2是一个强大的MVC(Model-View-Controller)框架,广泛应用于Java Web开发中。在本示例中,"struts2完整的Hello Word例子"是帮助开发者理解并熟悉...对于初学者,理解并实践这些步骤是掌握Struts2的第一步。

    struts2初学者第一个实例

    对于初学者来说,理解并动手实践Struts2的第一个实例是非常重要的,这将帮助他们快速掌握该框架的基本用法。下面,我们将详细讲解如何创建并运行一个简单的Struts2应用实例。 首先,你需要确保已经安装了Java SDK和...

    struts框架-helloworld

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

    struts2经典实例

    这个例子简单地演示了如何设置Struts2环境,创建第一个Action并显示简单的输出。 通过以上这些实例,你可以逐步学习和掌握Struts2的配置、Action、拦截器、结果类型、OGNL表达式、数据绑定、国际化、安全等方面的...

Global site tag (gtag.js) - Google Analytics