Struts2——Action动态方法调用

 对于同一个表单,当用户通过不同的按钮提交同一个表单时,系统需要使用Action的不同方法来处理用户请求,这时Action便需要包含多个控制处理逻辑,即一个action中包含多个方法。例如:login界面有“登录”和“注册”两个按钮,分别触发UserAction中的login和regist方法。

<a name="t0" style="box-sizing: border-box; background: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px;"></a>MVC模式:

 经典MVC模式中,事件由控制器(controller)处理,控制器根据事件类型改变视图(view),简言之,每个模型对应一系列的视图列表,不同事件通过控制器触发,获取模型(model)数值,返回不同的视图去呈现。

<a name="t1" style="box-sizing: border-box; background: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px;"></a>struts2——MVC模式实践者:

 Action充当控制器(Controller),浏览器中URL地址输入指定action名称,触发struts核心控制器StrutsPrepareAndExecuteFilter实例化出指定action对象,调用action中指定方法,通过方法返回值,读struts.xml配置文件返回指定jsp页面(view)。

<a name="t2" style="box-sizing: border-box; background: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px;"></a>DMI——Action动态方法调用:

     初学时,action中方法总是比较单一的;例如上述登录和注册的例子,一般会创建两个action类,loginAction 和registeAction,分别写好login和registe相关的业务逻辑;在struts配置文件中也配置两个action: 

[html]

view plain

copy

<embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=16&height=16" wmode="transparent" style="box-sizing: border-box;">

  1. <

    action

    name

    =

    "regist"

    class

    =

    "cn.itcast.shop.user.action.loginAction"

  2. <

    result

    name

    =

    "msg"

    /WEB-INF/jsp/regist.jsp

    </

    result

  3. </

    action

  4. <

    action

    name

    =

    "login"

    class

    =

    "cn.itcast.shop.user.action.registeAction"

  5. <

    result

    name

    =

    "login"

    /WEB-INF/jsp/login.jsp

    </

    result

  6. <

    result

    name

    =

    "loginSuccess"

    type

    =

    "redirectAction"

    index

    </

    result

  7. </

    action

    但实际应用中,action的创建通常按模块划分的;如用户模块便创建一个userAction,关于用户的登录、注册、查询等等方法,均写到userAction中,这边对应本文开头,“系统需要使用Action的不同方法来处理用户请求,这时Action便需要包含多个控制处理逻辑”。这时便涉及到action动态方法调用。
    
    DMI(Dynamic Method Invocation)是指调用aciton并不直接等同于调用某个action的名字,而是通过” **actionname ! methodname”** 的形式,调用指定到action中具体方法执行。
    

以登录注册为例,DMI实施步骤如下:

  1. 设置struts.xml 文件DMI常量启动动态方法调用:

    <constant name="struts. enable. DynamicMethodInvocation" value="true"/>

    2、配置好action result值跳转页面<不同方法的返回值均配置到一个action标签中>

[html]

view plain

copy

<embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=16&height=16" wmode="transparent" style="box-sizing: border-box;">

  1. <

    action

    name

    =

    "userLoginRegist"

    class

    =

    "cn.itcast.shop.user.action.UserAction"

  2. <

    result

    name

    =

    "regist"

    /WEB-INF/jsp/regist.jsp

    </

    result

  3. <

    result

    name

    =

    "login"

    /WEB-INF/jsp/login.jsp

    </

    result

  4. <

    result

    name

    =

    "registSuccess"

    /WEB-INF/jsp/login.jsp

    </

    result

  5. <

    result

    name

    =

    "loginSuccess"

    /WEB-INF/jsp/index.jsp

    </

    result

  6. </

    action

    3、JSP中通过【

action

名 !

方法名】的形式调用指定action中指定方法

[html]

view plain

copy

<embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=16&height=16" wmode="transparent" style="box-sizing: border-box;">

  1. <

    input

    type

    =

    "submit"

    value

    =

    "注册"

    onclick

    =

    "regist()"

  2. lt;script

  3. function regist()

  4. {

  5. <

    span

    style

    =

    "color:#000000;"

    form.action

    =

    "userLoginRegist!regist"

    ;

    </

    span

  6. //login同理

  7. }

  8. lt;/script

     或者还经常用到在jsp中这样去调用:
    

[html]

view plain

copy

<embed id="ZeroClipboardMovie_4" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=16&height=16" wmode="transparent" style="box-sizing: border-box;">

  1. <

    body

  2. <

    a

    href

    <

    span

    style

    =

    "color:#000000;"

    =

    </

    span

    <

    strong

    <

    span

    style

    =

    "color:#000000;"

    "

    </

    span

    <

    span

    style

    =

    "color:#000000;"

    basePath/user/userLoginRegist!regist"

    />

    </

    span

    </

    strong

  3. <

    br

  4. <

    a

    hre

    <

    span

    style

    =

    "color:#000000;"

    f

    =

    </

    span

    <

    strong

    <

    span

    style

    =

    "color:#000000;"

    "

    </

    span

    <

    span

    style

    =

    "color:#000000;"

    basePath/user/userLoginRegist!login"

    />

    </

    span

    </

    strong

  5. </

    body

除了动态方法调用,另外还有两种方式可实现调用同一个action中不同方法:

<a name="t3" style="box-sizing: border-box; background: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px;"></a>二、配置method属性

     通过指定method属性值,调用action中指定方法返回该方法result

[html]

view plain

copy

<embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_5" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&width=16&height=16" wmode="transparent" style="box-sizing: border-box;">

  1. <

    action

    name

    =

    "regist"

    class

    =

    "cn.itcast.shop.user.action.UserAction"

    method

    =

    "regist"

  2. <

    result

    name

    =

    "regist"

    /WEB-INF/jsp/regist.jsp

    </

    result

  3. <

    result

    name

    =

    "registSuccess"

    /WEB-INF/jsp/login.jsp

    </

    result

  4. </

    action

  5. <

    action

    name

    =

    "login"

    class

    =

    "cn.itcast.shop.user.action.UserAction"

    method

    =

    "login"

  6. <

    result

    name

    =

    "login"

    /WEB-INF/jsp/login.jsp

    </

    result

  7. <

    result

    name

    =

    "loginSuccess"

    /WEB-INF/jsp/index.jsp

    </

    result

  8. </

    action

     Jsp直接调用:
    

[html]

view plain

copy

<embed id="ZeroClipboardMovie_6" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_6" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=6&width=16&height=16" wmode="transparent" style="box-sizing: border-box;">

  1. function regist()

  2. {

  3. form.action

    =

    "regist"

    ;

  4. //login同理

  5. }

     不难看出,通过配置method属性实现方法调用,这种做法直接导致:JSP调用一个方法,便需要在配置文件中配置一个action标签;也就是说这种方式是以方法为单位进行配置,调用多少个方法,便需要配置多少个action,而指向的action类全是一个。不可避免的增加了不必要的重复配置,笨拙繁琐。
    

<a name="t4" style="box-sizing: border-box; background: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px;"></a>三、通配符

使用通配符便可解决方法二的弊端。

  1. 在action标签中使用表示action名称,用{N}来表示前面第几个号所匹配的方法。

    [html]

    view plain

    copy

    <embed id="ZeroClipboardMovie_7" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_7" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=7&width=16&height=16" wmode="transparent" style="box-sizing: border-box;">

    1. <

      action

      name

      =

      "*Action"

      class

      =

      "cn.itcast.shop.user.action.UserAction"

      method

      =

      "{1}"

    2. <

      result

      name

      =

      "regist"

      /WEB-INF/jsp/regist.jsp

      </

      result

    3. <

      result

      name

      =

      "login"

      /WEB-INF/jsp/login.jsp

      </

      result

    4. <

      result

      name

      =

      "registSuccess"

      /WEB-INF/jsp/login.jsp

      </

      result

    5. <

      result

      name

      =

      "loginSuccess"

      /WEB-INF/jsp/index.jsp

      </

      result

    6. </

      action

    name="*Action " 代表这个action处理所有以Action结尾的请求

    method= "{1} " 根据前面请求methodname,调用action中的以methodname命名的方法

    例如现在jsp调用login方法

    Form.action=

    ”login

    ”,

    通过读取配置文件,访问loginAction中login方法。如果调用注册,则Form.action=

    ”regist

    ”,

    通过读取配置文件,访问registeAction中login方法。所以通过通配符,我们可以配置为User_ Action method={1},则可以访问User_Action中的*方法,灵活可配。包括result 标签中的name和页面跳转也可以使用通配符进行。形如:

    [html]

    view plain

    copy

    <embed id="ZeroClipboardMovie_8" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_8" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=8&width=16&height=16" wmode="transparent" style="box-sizing: border-box;">

    1. <

      package

      name

      =

      "actions"

      extends

      =

      "struts-default"

      namespace

      =

      "/actions"

    2. <

      action

      name

      =

      "Student*"

      class

      =

      "com.bjsxt.struts2.action.StudentAction"

      method

      =

      "{1}"

    3. <

      result

      /Student{1}_success.jsp

      </

      result

    4. </

      action

    5. <

      action

      name

      =

      "_"

      class

      =

      "com.bjsxt.struts2.action.{1}Action"

      method

      =

      "{2}"

    6. <

      result

      /{1}_{2}_success.jsp

      </

      result

    7. </

      action

    8. </

    package
    
    >
    
    1. {1}、{2}表示第一第二个占位符

    2. *为通配符

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 1.什么是框架 什么是框架,框架从何而来,为什么使用框架? 1).框架(framework)——半成品: 1.是一...
    贾里阅读 2,789评论 0 0
  • strust2框架来历简介: WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的J2E...
    清枫_小天阅读 8,844评论 4 26
  • 1,一个完整的Java Web所涉及的内容包括:(1)Java Bean组件 (2)EJB组件 (3)自定义的JS...
    Mick_小聪阅读 988评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399