关于struts2中action 的!匹配

我的ACTION中有doInput,doSave,doDelete等方法,配置文件如下
[code="java"]
/WEB-INF/jsp/login.jsp
/WEB-INF/jsp/save.jsp
/WEB-INF/jsp/delete.jsp
[/code]

但是当jsp页面中有action比如login!save的时候 就报错,说找不到login!save这个action

这个怎么解决?

我看别人写的配置文件中不用把action写成 name="login!*" method="{1}" 这样的吧?

谢谢了

这里用的是struts2.1.8 Filter是StrutsPrepareAndExecuteFilter

难道是codebehind的问题?
[b]问题补充:[/b]
还是不行啊,报
There is no Action mapped for namespace / and action name login!doSave.
这个错
[b]问题补充:[/b]
sunlightcs:
这种方法我已经试过了,是可以的。

我是想知道有多种方法的action,它的定义都要像

这样?

9个回答

在 WebWork2 中,可以使用感叹号(!)来指定要执行(或调用)非 execute 方法,但是还没有一个真正的术语该种方式的定义。在 s2 的讨论中,我们定义了“动态方法调用”这个术语来描述 webwork/s2 对感叹号的使用。

动态方法调用( DMI )通过在 action 名称和要调用的 Action 方法之间添加一个感叹号进行分割,以表示调用 action 中指定的方法(非 exeucte 方法)。如:“ Category ! create.action ”,表示调用 Category Action 中定义的 create 方法。

在 Struts2 中,让动态方法调用可配置,有两个原因: 1 )如果使用的是 POJO action ,动态方法调用可能会引起安全问题; 2 )动态方法调用和从 Struts 1 中引用过来的通配符方法有重叠;如果你的应用涉及到安全,或者习惯在 action 配置中使用感叹号作为通配符的话,需要在 struts 应用的 struts.properties 配置文件中将 struts.enable.DynamicMethodInvocation 设置为 false 。

应该是写成
login!doSave吧

你好象确实没有 login.save 方法啊
应该long!doSave 才行八

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

   使用动态方法调用前必须设置Struts2允许动态方法调用,它是通过设置

struts.enable.DynamicMethodInvocation = true来完成的。

   Struts2有多种方式实现动态方法调用(以下action请求的后缀均设置为do,而非默认的action):

 (1). 修改页面Form的action请求方式

   将页面上action的请求方式改为:action = “ActionName!MethodName.do”,示例:

   Login.jsp

          ……

          var contextPath = “<%=request.getContextPath()%>”;

          <script type=”text/javascript”>

                 function dynamicMethodInvoke(){

                        document.forms[0].action = contextPath + “Login!dynamicMethod.do”;

                        document.forms[0].submit();

}

          </script>

          ……

          <input type=”button” value=”动态方法调用” onclick=”dynamoicMethodInvoke()”/>

          ……

   当点击“动态方法调用”按钮时,执行dynamoicMethodInvoke方法,在此方法中修改提交的action为Login!dynamicMethod.do,它的意思是将表单提交给Login Action的dynamicMethod方法进行处理。

   LoginAction.java

   public class LoginAction {

   ……

   public String dynamicMethod() throws Exception{
                 ……

          return “success”;

}

public String execute() throws Exception{

   ……

   if (…){

          return “error”;

}

……

return “success”

}

}

   通过这种方式,可以在一个Action中包含多个方法,通过指定不同的action属性来提交给Action的不同方法进行处理。

   对于使用动态方法调用的方法,它的声明与系统默认的execute方法的方法声明只有方法名不同,其他的如参数、返回值类型都必须相同。

 (2). 指定action的method属性

   另一种动态调用方式是在struts.xml中指定action的method属性,这样可以让Action类调用指定方法,而不是默认的execute方法来处理请求。示例:

   struts.xml

   ……

   <package name=”demo1” extends=”struts-default”>

          <action name=”Login” class=”com.demo.LoginAction” />

                 <result name=”input”>/input.jsp</result>

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

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

          </action>

          <action name=”Registry” class=”com.demo.LoginAction” method=”registry” />

                 <result name=”input”>/input.jsp</result>

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

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

          </action>

   </package>

   上述配置中两个action的实现类均为com.demo.LoginAction,他们的实现类虽然相同,但处理逻辑却不同,处理逻辑通过method方法指定,其中名为Login的Action对应的处理逻辑为默认的execute方法,而名为Registry的Action对应的处理逻辑则为method指定的registry方法。

 (3). 使用通配符

   仔细看上面struts.xml中两个action的定义,可以发现他们除了name和method属性不同以外,其余的都一样,这种定义相当的冗余,为了解决这种类型的问题,Struts2提供了通配符定义方式。

   在配置<action/>元素时,需要指定name、class、method等属性,这3个属性都支持通配符,在使用通配符定义Action的name属性时,相当于一个元素action定义多个逻辑Action。(2)中的action配置可以更改为:

   <action name=”*Action” class=”com.demo.LoginAction” method=”{1}”>

          <result name=”input”>/input.jsp</result>

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

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

   </action>

上述定义不是定义了一个普通的action,而是定义一系列的action,只要用户请求的URL满足*Action.do的模式,都可通过该Action进行处理,而method属性使用了一个表达式{1},该表达式的值就是name属性中第一个*的值,例如,用户请求的URL为LoginAction.do,则调用com.demo.LoginAction类的Login方法来处理,如果请示的URL为RegistryAction.do的话,则调用com.demo.LoginAction的Registry方法进行处理。

以下配置在class属性中使用通配符:

   <action name=”*Action” class=”com.demo.{1}Action”>

          <result name=”input”>/input.jsp</result>

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

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

   </action>

   此配置中没有指定method属性,所以请示由默认的execute方式来执行,但class中使用了通配符,它的含义与上面一样,例如,当用户请求的为LoginAction.do时,其中*的值为Login,该值传入class属性,即该Action的处理类为com.demo.LoginAction;而如果请求为RegistryAction.do时,则该Action的处理类将变为com.demo.RegistryAction。

   Struts2允许在class属性和method属性中同时使用表达式,示例如下:

不难看出,只要满足*_*模式的Action都会被其处理,例如有Order_Booking.do请求到来,由于第一个*的值为Order,第二个*的值为Booking,那么意味着将会调用com.demo.Order处理类中的Booking方法来处理用户请求。

   Struts2除了允许在name、class、method中使用表达式外,在<result/>元素中也可以使用表达式,如下:

   <action name=”*Action” class=”com.demo.{1}Action method=”{1}” >

          <result name=”success”>/{1}.jsp</result>

   </action>

   当请求为LoginAction.do时,将调用com.demo.LoginAction处理类中的Login方法处理用户的请求,当返回为success时,显示/Login.jsp页面。

   注意:在使用通配符后,除非请求的URL与Action的name属性绝对相同,否则将按Action在struts.xml中定义的先后顺序来决定由哪个Action来处理用户请求。

   对于一些只是简单的转发操作,如超级链接等的请求,可以定义name为*的Action来处理,此外,Struts2框架允许在struts.xml中使用<default-action-ref/>元素定义一个默认Action来处理用户请求:

   <package name=”demo” extends=”struts-default” namespace=”/”>

          <action name=”defaultAction” class=”com.demo.DefaultAction”>

                 <result>/default.jsp</action>

   </package>

的name属性为struts.xml中一个已经定义好的Action。

我用的时候是这样配置的:
[code="java"]
...
[/code]
其中:“name1”是自己写的,在页面调用的时候用到;
XxAction:在ApplicationContext.xml中注入,就是一个Java类
methodName:是要调用的方法,必须在这个Action中存在。

action缺少method=""属性,method=""是你要调用的方法的名称。

我觉得可能是路径问题,你可以在页面上加上<%String path=request.getContextPath();%>,然后在FORM提交的时候action加上<%=path%>先试试看吧!

应该是login!doSave.action吧

login!save.action
!感叹号后面的save,不是你的 种的 save, 而是你的 Login.java Action类中的 save 方法名才对,比如:
[code="java"]
public class Login extends Action{

    public String save(){

       return .....
    }

}

[/code]

不论是 login!save.action 还是 的method的*号通配符,所跟随的都是 Action类中的方法名。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问