美文网首页
Struts2——Action动态方法调用

Struts2——Action动态方法调用

作者: 黎涛note | 来源:发表于2017-12-09 23:02 被阅读0次
     对于同一个表单,当用户通过不同的按钮提交同一个表单时,系统需要使用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. *为通配符

    相关文章

      网友评论

          本文标题:Struts2——Action动态方法调用

          本文链接:https://www.haomeiwen.com/subject/wrrpixtx.html