Struts2——Action动态方法调用

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

MVC模式:

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

struts2——MVC模式实践者:

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

DMI——Action动态方法调用:

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

[html]

view plain

copy

  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常量启动动态方法调用:

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

[html]

view plain

copy

  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

  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

  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中不同方法:

二、配置method属性

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

[html]

view plain

copy

  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

  1. function regist()

  2. {

  3. form.action

    =

    "regist"

    ;

  4. //login同理

  5. }

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

三、通配符

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

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

    [html]

    view plain

    copy

    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

    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

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

    2. *为通配符

你可能感兴趣的:(Struts2——Action动态方法调用)