2018-05-16 XWORK

About XWork

xwork2 是一个通用的命令模式框架,它构成了struts2 的核心。
它的特点:

  • 基于简单的配置界面,灵活且可定制的配置,允许你使用xml,编程甚至产品集成来配置
  • 通过拦截器来定制和拓展,来适应任何请求、响应的环境
  • 使用OGNL 来构建类型转换和动作属性验证
  • 强大的基于运行时属性和验证拦截器的验证框架

Overview

xwork 是一个以action 接口为中心的命令式框架,你通过实现action接口来定义一个action类,然后XWORK讲安装和执行你的aciton类。xwork是这个来自广为认识的mvc框架webwork。但是xwork可以单独使用.所以了解xwork的图层非常重要和action是怎么安装和运行的。本届介绍xwork的核心层和提供一个简单的如何执行操作的示例。

  • Action Interface
  • ActionProxy interface
  • ActionInvocation interface
  • ActionContext
  • A simple example

Actions

actions 是基本的执行单元.

The Action Interface

它是所有的actions必须implements的基本interface,
它提供了几个标准的返回值,像“SUCCESS”“INPUT”和只包含一个execute方法

     public interface Action {
          public static final String SUCCESS = "success";
          public static final String NONE = "none";
          public static final String ERROR = "error";
          public static final String INPUT = "input";
          public static final String LOGIN = "login";

          public String execute() throws Exception;
      }

一般,Actions可以简单继承一个com.opensymphony.xwork.ActionSupport.class 它实现了Action接口和提供了默认的命令行为.


ActionProxy

Action的生命周期通过ActionProxy来维护。ActionProxy是xwork API的顶层和应该是设置和操作的起点。xwork提供了一个工厂作为实例化action proxis 的起点。每个xwork层的大部分实现都隐藏在接口后面,所以覆盖之前的实现完成定制变得非常容易。
示例演示了如何获取ActionProxy的默认impl(DefaultActionProxy.java)

  ActionProxyFactory.getFactory().createActionFactory("","viewBook","objectMap");

如果我要注册自己的ActionProxy的实现,那么我可以在工厂内这样做

    class CustomizedActionProxyFactory extends DefaultActionProxyFactory{
        createActionProxy(...){ 
                  return new CustomizedActionProxy(...); 
        }
    }

    ActionProxyFactory.setFactory(new CustomizedActionProxyFactory());
    ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(...);

ActionInvocation

在ActionProxy代理层下方,存在一个ActionInvocation Interface。
ActionInvocation表示持有动作实例的动作的执行状态以及在动作处理之前/之后包装的任何拦截器。


ActionContext

ActionContext在Action调用期间以命名对象的形式提供对执行环境的访问。为每个调用创建一个新的ActionContext,允许开发人员以线程安全的方式访问/修改这些属性。ActionContext提供了许多可用的属性,通常由框架设置为适当的值。在WebWork 2中,ActionContext会话映射包装了一个底层的HttpSession对象。这允许访问特定于环境的属性,而无需将核心框架绑定到特定的执行环境。
ActionContext是通过静态ActionContext.getContext()方法获取的。 ActionContext是一个线程局部变量,因此ActionContext的属性将相对于当前的请求线程。 ActionContext有多种常用属性的方法,以及可用于应用程序特定属性的get()和set()方法。


A simple example

Lets look at a simple example starting with a simple javabean.

public class Book {
    String id;
    String title;
    Set authors;
    public void setId(id){ this.id = id; }
    public void setTitle(String title){ this.title = title; }
    public void setAuthors(Set authors){ this.authors = authors; }
    public String getId(){ }
    public String getTitle{ }
    public Set getAuthors{ }
}

让我们先说我们要从数据源里面取回一个book对象并通过它返回给调用者,我们可以写一个Action来处理这个事情。一个action一般来说就事一个简单的class,为一个要求就是它实现了Action接口。这些日子里,你将看到很多拥有excecute方法的actions(验证,类型转换等都可以分离出来,以提供关注的良好分离)。action执行的目的通常是提供访问和操作你的数据。执行的结果是用一个简单的字符串表示,它应该是执行结束后定义一个委托。所以结果可能是一个成功的字符串,一个失败的字符串,一个转发字符串,或者其他。在我们当前的例子中,如果发现结果是‘success’,那么这个book对象可以填充在action中,如果书没有找到,那么返回的就是‘notFound’。
从这里,您可以很容易地拥有一个控制对象设置来返回图书,或者如果书未找到,可以将请求转发到不同的库存源。

public class ViewBookAction  implements Action{
    Book book;
    String id;

    public String execute() throws Exception{

        // lets pretend we have a data access object that will return a book from storage
        book = bookDAO.findById(id, Book.class);
        if(book != null) return "success";
        return "notFound";
    }
    public Book getBook(){ return this.book; }
    public setId(String id){this.id = id; }
}

现在我们定义了一个简单的action模板,让我们设置一个action proxy,和执行这个action。

Setting up XWork to execute the action:

// obtain inputs from the caller. For this example, we can just define some dummy params.
Map paramMap = new HashMap();
paramMap.put("id", "0123456789");

// set the ActionContext parameters
Map context = new HashMap();
context.put(ActionContext.PARAMETERS, paramMap);

// create an action proxy with no namespace, action alias (defined in xwork.xml), and a map of the context info
ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy("","viewBook", context);

// we have the action proxy instance, lets execute it and retrieve the action
String result = proxy.execute();
if ("success".equals(result)){
   ViewBookAction action = (ViewBookAction) proxy.getAction();

   // return info back to caller or just print to screen for this example
   System.out.println(action.getBook().getTitle());
} else if("notFound".equals(result){
   // forward to another inventory source
} else {
   throw new RuntimeException("Im lazy");
}

尚未完成,我们需要定义一些配置在xowrk.xml中,所以XWork可以根据我们在createActionProxy(...)方法中提供的动作别名找到适当的类来执行。

<xwork>
     <include file="xwork-default.xml"/>
    <package name="default" extends="xwork-default">
       <action name="viewBook" class="com.opensymphony.xwork.example.ViewBookAction"/>
    </package>
</xwork>

Next------XWork Core Concepts

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容