我正在尝试使用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;
}
}
答案 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>