在struts2中将消息从操作传递到JSP

时间:2012-10-18 01:48:13

标签: struts2 struts action

我正在尝试使用addActionMessage()addActionError()将操作中的消息和错误(例如execute())传递到转发的页面。

在JSP中,我使用:

<s:if test="hasActionMessages()">
   <s:actionmessage/>
</s:if>

显示此类消息。

但没有显示任何消息。我想知道是否有人可以解决这个问题,或建议另一种解决方案。我是Struts和Web开发的新手,我不确定将消息从操作传递到页面的正确模式是什么。

编辑:动作映射代码和java代码

<action name="myAddUser" class="org.any.backend.action.UserAdminAction" method="addUser">
  <result name="success" type="redirectAction">myUserAdmin</result>
  <result name="input" type="redirectAction">myUserAdmin</result>
</action>

Java代码:

    public String addUser() throws Exception {
    // check duplicate
    for (User u : userList)
        if (u.getUserName().equals(userName)) {
            addActionError("A user with the same user name already exists. Choose another user name. ");
            return INPUT;
        }
    if (userName != null && !userName.isEmpty() && password != null && !password.isEmpty()) {
        User newUser = new User();
        newUser.setUserName(userName);
        newUser.setPassword(password);
        userList.add(newUser);
        addActionMessage("User " + userName + " added. ");
        return SUCCESS;
    } else {
        addActionError("User name and password cannot be empty");
        return INPUT;
    }
}

3 个答案:

答案 0 :(得分:1)

在Action Class中使用session.setAttribute(...)。和jsp中的<logic:present .... >标记。 希望这会对你有所帮助。

答案 1 :(得分:1)

您的代码是对的。

也许您正在使用REDIRECT-ACTION结果类型或CHAIN。 它们都会丢失操作消息和错误,迫使您将它们放入会话中(并在显示后清除它们)。

编辑:我假设您正在使用块

<s:if test="hasActionErrors()">
       <s:actionerror />
</s:if>
<s:if test="hasActionMessages()">
       <s:actionmessage/>
</s:if>

并且不仅是发布的,或者您永远不会看到错误,只会看到消息...

答案 2 :(得分:1)

正如我所看到您正在使用重定向操作,您仍然可以使用其中一个拦截器保留操作错误/消息。

http://struts.apache.org/2.3.1.2/docs/message-store-interceptor.html

这是struts.xml中的一个例子

    <action name="submit"
        class="com.dummy.SubmitAction">             

        <interceptor-ref name="store">
            <param name="operationMode">STORE</param>
        </interceptor-ref>
        <interceptor-ref name="defaultStack" />

        <result name="success" type="redirectAction">
            <param name="actionName">view</param>
            <param name="asnid">${id}</param>
        </result>           

    </action>

    <action name="view"
        class="com.dummy.ViewUserAction">
        <interceptor-ref name="store">
            <param name="operationMode">RETRIEVE</param>
        </interceptor-ref>  
        <interceptor-ref name="defaultStack" >
            <param name="workflow.excludeMethods">execute</param>           
        </interceptor-ref>  

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

    </action>