推开Struts 2的大门-Struts 2 框架和配置(3)

1.4  Struts 2概述

从字面上看,Struts 2好像是Struts 1的升级版本,其实Struts 2更像是WebWorkApache之所以命名为Struts 2,笔者认为有如下原因:

Struts 1.X是目前应用最早的一种MVC架构,经过了多年的考验,被广大Java开发者所接受,大量的Java Web应用中使用了Struts 1.X,证明了Struts 1出色的稳定性和可用性。Struts 1成为Apache成功的产品之一。

WebWork兴起时间比较短,尽管展示了其更加先进的技术优势,但是被开发者接受需要时间的验证,至少国内目前使用WebWork架构开发案例比较少,更多使用WebWork架构搭建的系统一般都是出于学习和测试的目的。

Apache接手WebWork项目后,有意于借助Struts 1.X在业界的成功来推广Struts 2Struts 2非常类似于WebWork框架,而不是Struts 1.X框架,是以WebWork为核心来实现的。

Struts 1.X过渡到Struts 2所改变的东西比较多,但是只要领会了MVC设计思想和Java Web开发的理念,读者会发现,Struts 2将比Struts 1.X更加简单,更加灵活。如果读者熟悉WebWork框架,那么学习Struts 2是一件比较容易的事情。

1.4.1   Struts 2框架

Struts 2相对于Struts 1.X,将实现用户业务逻辑(Action)同Servlet API分离开,这种分离机制,是采用了拦截器或者拦截器栈(拦截器链)。拦截器是Struts 2的核心内容之一。

Struts 2内建了多个拦截器和拦截器栈(由多个拦截器形成的拦截器链),将用户的Web请求进行拦截处理,从而提供了更加丰富的功能,例如数据类型转换、国际化、文件上传等。图1.9所示是Struts 2框架结构图,Struts 2框架中的处理大概分为以下几个步骤:

 

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

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

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

 如果ActionMapper决定需要调用某个ActionFilterDispatcher把请求的处理交给ActionProxy

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

  ActionProxy创建一个ActionInvocation实例。

  ActionInvocation实例使用命名模式来调用,回调Actionexecute方法,该execute方法先获取用户请求参数,然后它会调用业务逻辑组件来处理用户的请求。在调用Action的过程前后,涉及到相关拦截器(Interceptor)的调用。

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

由于印刷原因,读者不能够根据图上的不同颜色来区分结构。下面使用文字进行介绍。

— Servlet Filter:包括ActionContextCleanUpOther FiltersFilterDispatcher

— Struts CoreStruts核心模块,包含ActionMapper、标签库、ActionProxyActionInvocationResult

— 拦截器(Interceptor)。

— 用户创建代码:这部分包含struts.xmlAction、视图(JSP等)。

从上面的描述读者可以看到,实现一个Struts应用,只需要配置struts.xml文件、编写Action代码和相关视图资源文件即可。图1.10所示是Struts 2架构图,从图中可以看到,从用户请求到Action执行,过程中间布满了拦截器,这些拦截器可以在Action执行之前或者执行之后来运行。拦截器是Struts 2核心内容之一,后面将会详细介绍。

说明

Struts 2框架流程图和WebWork框架流程图相互比较,读者会发现两者极其相似,进一步说明了Struts 2框架是WebWork的升级版本。、

1.10  Struts 2架构图

1.4.2   Struts 2配置文件

Struts 2配置文件是用户请求(View)和业务逻辑模块(ModelAction之间联系的桥梁,开发者可以通过修改Struts 2的配置文件,来快速适应业务需求,它是整个Struts 2的精髓之一。当然,熟悉Struts 1WebWork框架的读者对配置文件一定不会陌生。Struts 2框架配置文件一般可以分为两类:struts.xml文件和属性资源文件。

1.配置Actionstruts.xml文件

配置Actionstruts.xml文件,也包括用户自己定义的*.xml文件,然后通过include指令包含到struts.xml文件中。struts.xml文件包含了Action的定义,同时定义了Action返回值对应的视图资源(result),还有命名空间信息等。

说明

struts.xml文件是Struts 2框架的核心配置文件,开发者可以建立独立的配置文件,在struts.xml中使用include指令包含进来,后面章节将会做详细介绍。

 

1)代码1.5就是一个struts.xml的例子。

 

 

图1.10 Struts 2架构图
1.4.2 Struts 2配置文件
Struts 2配置文件是用户请求(View)和业务逻辑模块(Model)Action之间联系的桥梁,开发者可以通过修改Struts 2的配置文件,来快速适应业务需求,它是整个Struts 2的精髓之一。当然,熟悉Struts 1和WebWork框架的读者对配置文件一定不会陌生。Struts 2框架配置文件一般可以分为两类:struts.xml文件和属性资源文件。
1.配置Action的struts.xml文件
配置Action的struts.xml文件,也包括用户自己定义的*.xml文件,然后通过include指令包含到struts.xml文件中。struts.xml文件包含了Action的定义,同时定义了Action返回值对应的视图资源(result),还有命名空间信息等。
说明
struts.xml文件是Struts 2框架的核心配置文件,开发者可以建立独立的配置文件,在struts.xml中使用include指令包含进来,后面章节将会做详细介绍。
 
(1)代码1.5就是一个struts.xml的例子。

 

代码1.5  配置文件struts.xml示例

<?xml version="1.0" encoding="GBK"?> 

<!DOCTYPE struts PUBLIC   

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  

    "http://struts.apache.org/dtds/struts-2.0.dtd"> 

<struts> 

    <!--开始Struts 2配置-->   

    <!--配置Struts 2pachageAction必须配置在其中-->

<package name="pla" extends="struts-default">

        <!--配置Action-->

        <action name="login" class="pla.LoginAction"> 

            <!--配置Action的返回值success视图-->

            <result name="success">/welcome.jsp</result> 

            <!--配置Action的返回值error视图-->

            <result name="error">/ error.jsp</result> 

            <!--配置Action的返回值input视图-->

                <result name="input">/ input.jsp</result>

        </action> 

    </package> 

    </struts> 

上面配置文件struts.xml中定义了一个Action

<action name="login" class="pla.LoginAction"> 

2Action名字是“login”,对应的Class就是“pla.LoginAction”,当用户在浏览器输入http://127.0.0.1/8080/...login.action请求时,Struts 2将调用pla.LoginAction进行业务处理。处理后,返回result值。LoginAction内容如代码1.6所示。

代码1.6  业务控制器LoginAction

package pla;

public class LoginAction {

//设置属性

    private String username,password;

    //定义属性的gettersetter方法

    public String getUsername() {

        return username;

    }

    public void setUsername(String username) {

        this.username = username;

    }

    public String getPassword() {

        return password;

    }

    public void setPassword(String password) {

        this.password = password;

    }

//Action默认执行方法

    public  String execute()throws Exception{

        if (getUsername().equals("test")){

          //返回success字符串

            return "success";

        }else{

          //返回input字符串

            return "input";

        }

     }

}

3)在Action中,判断getUsername()是否为“test”,如果是,则返回字符串"success",而struts.xml配置文件中定义了对应的视图资源:

<!—配置Action的返回值success视图-->

      <result name="success">/welcome.jsp</result>

可以看到,配置文件定义了resultname元素为success,对应视图资源为/welcome.jsp,那么当用户请求参数Username为“test”时,Struts 2会将/welcome.jsp页面展示给用户。

4)如果系统中还有一个处理Login业务的Action,内容如代码1.7所示。

代码1.7  业务控制器LoginAction01

package pla;

 

import com.opensymphony.xwork2.Action;

import com.opensymphony.xwork2.ActionContext;

public class LoginAction01 implements Action {

    //设置属性

    private String username,password;

    //定义属性的gettersetter方法

public String getUsername() {

        return username;

    }

    public void setUsername(String username) {

        this.username = username;

    }

    public String getPassword() {

        return password;

    }

    public void setPassword(String password) {

        this.password = password;

    }

    //Action默认执行方法

public String execute() throws Exception {

        if (getUsername().equals("test")){

            //不同于LoginAction的业务实现逻辑

          Dosomething();

            return "success";

        }else{

            return "input";

        }

    }

}

5)当用户业务逻辑发生变化时,需要调用LoginAction01来实现,那么通过修改配置文件,可以非常方便、快捷地进行调整,只需要修改Action中的class属性即可:

<action name="login" class="pla.LoginAction01"> 

提示

通过配置文件来调换Action等模块,类似于灵活的“热插拔”技术。

 

2.属性资源文件

另一类配置文件是属性资源文件,例如struts.properties文件。资源文件中一般采用固定的Key-Value格式,用于定义Struts 2全局或者局部的资源数据,例如国际化、Struts 2开发模式等信息。Struts.properties文件示例见代码1.8

代码1.8  struts.properties文件示例

#设置字符集

struts.i18n.encoding=UTF-8

#该属性指定Http的请求后缀

struts.action.extension=do,action 

#该属性设置当struts.xml文件改变后,系统是否自动重新加载该文件

struts.configuration.xml.reload=false

#指定当前应用默认的国际化地区信息

struts.locale=en_us

注意

有过Struts 1.X开发经验的读者会发现,Struts 2框架的Action只是一个普通的Java类(POJO),这是同Struts 1.X的重要区别之一。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值