zoukankan      html  css  js  c++  java
  • Struts2之action 之 感叹号 ! 动态方法调用

    struts2的动态方法调用的方式:

    1、第一种方式:设置method属性

    在Action类中定义一个签名与execute方法相同、只是名字不同的方法,如定义为:

    public String login() throws Exception{}

    然后在struts.xml文件中加一个<action>元素,并设置它的method属性。代码如下(核心代码):

    <action name="loginMethod"

           class="com.chp.LoginAction" method="login">

    <result>/result.jsp</result>

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

    </action>

    struts.xml部分内容

    然后在JSP中表单的action设置为loginMethod。这样,Struts2就会去调用LoginAction中的loigin方法,而不会去调用execute()方法。

    2、第二种方式:改变表单的action的设置内容

    同第一种方式,定一个login方法。只是不需要改变struts.xml文件的内容。然后,在JSP页面中,设置表单的action为loginMethod!login.action。(等价于配置文件里 method="login" )这样,Struts2也会去调用login方法,而不调用execute方法。其中,表单action="loginMethod!login.action" 中,loginMethod为struts.xml文件中<action> 元素的name属性值,login.action中的login为Action类中的方法名。注意:login.action的action不能少。

    3、第三种方式:使用通配符

    首先同上面两种方式,定一个login方法,然后在struts.xml文件中配置如下内容:

    <action name="*Action"  class="com.xuxinhua1984.struts2.i18n.LoginAction" method="{1}">

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

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

    </action>

    struts.xml部分内容

    然后在JSP页面中,设置表单的action为loginAction,此处login为Action类中的方法名,这样struts.xml中的*Action就可以和loginAction模糊匹配了,然后,method="{1}"就相当于method="login"。这样一来就回到了第一种方式。

    另外,这种方式甚至结果类型对应的物理视图都可以用通配符。例如,如果想让登录失败后返回登录页,可以设置<result name="error">/{1}.jsp</result>。这样,此处的{1}也会被*号实际的内容替代,此处为login,所以就转发回login.jsp页面了。

    Struts2支持动态方法调用,它指的是一个Action中有多个方法,系统根据表单元素给定的action来访问不同的方法,而不用写多个Action。

    struts2中无需配置就可以直接调用Action中非execute方法的方式,就是使用struts2的动态动态方法调用。

    动态方法调用(Dynamic method Invoc)是在action的名字中使用感叹号"!"来标示要调用的方法名,其语法格式为 actionName!methodname.action
    例如我们的配置如下:
    <action name="login" class="com.chp.action.LoginAction">
    <result type="json"></result>
    </action>   
    当请求/login!query.action时,将调用LoginAction的query()方法,当请求/login!save.action时,将调用LoginAction的save()方法

    注意:第二种方式:感叹号方式(需要开启),官网不推荐使用这种方式,建议大家不要使用.
    用这种方式需要先开启一个开关
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    将此常量设置为true,这种方式才能使用
    第三种方式:通配符方式(官网推荐使用)
    首先得关闭开关
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />

  • 相关阅读:
    【计算机视觉】OpenCV篇(2)
    【计算机视觉】OpenCV篇(1)
    傅立叶分析与小波分析整理
    极简Python DeBug工具——PySnooper
    透过SourceTree再谈Git
    佳文赏析:How to uninstall Linux
    AI佳作解读系列(四)——数据增强篇
    AI佳作解读系列(三)——深度学习中的合成数据研究
    java基础 序列化反序列化流 实现Serializable 接口 自动装载序列号到对象文本文件如修改不能反序列化对象文本,除非自定义long型常量 打印流
    java基础IO流 复制键盘录入的目录,复制其中的.java文件到指定目录,指定目录中有重名,则改名 对加密文件计算字母个数
  • 原文地址:https://www.cnblogs.com/haopengchen/p/8309117.html
Copyright © 2011-2022 走看看