2015-10-19 4 views
2

У меня есть класс Struts2 действий, как показано ниже, и я ожидаю сообщение actionerror должно отображаться в моей странице JSP с помощью тега: <s:actionerror />Struts2 actionError не отображается на JSP, когда действие реализовано ModelDriven

Однако сообщение не показывать и я обнаружил, что если я изменю метод getModel()return form; на return null;, сообщение об ошибке может быть снова отображено! Как я могу показать сообщение об ошибке в то же время, возвращая объект формы в методе getModel()?

public class StartSearchApplicationAction 
             extends ActionSupport 
            implements ModelDriven, SessionAware { 

    protected Map<String, Object> session; 

    private Formbean form; 

    public String execute() {    
     addActionError("Testing Error Message"); 
     session.put("form", form); 
     return "success"; 
    } 

    public Formbean getModel() { 
     form = (Formbean) session.get("form"); 
     if (form == null) { 
      form = new Formbean(); 
     } 
     return form; 
    } 

    public void setSession(Map<String, Object> session){ 
     this.session = session; 
    } 

} 

Обновлено 20-Окт-2015 - My JSP (это шаблон страницы плитки)

Обратите внимание, что даже изменить заявление <s:if test='%{#session.hasError == "Y"}'> к <s:if test="hasActionErrors()">, результат тот же

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<%@ page language="java" %> 
<%@ page contentType="text/html; charset=UTF-8" %> 
<%@ page errorPage="/jsp/error.jsp" %> 
<%@ taglib prefix="s" uri="/struts-tags"%> 
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%> 

<html> 
<head> 
<title><s:text name="global.heading.title"/></title> 
</head> 

<body> 
<table class="main" border="0" cellspacing="0" cellpadding="0"> 
    <tr> 
    <td> 
     <table border="0" cellspacing="0" cellpadding="0"> 
    <tr> 
      <td width="860" valign="top" bgcolor="#FFFFFF"> 
     <table border="0" valign="top" align="left"> 
<s:if test='%{#session.hasError == "Y"}'> 
        <tr> 
      <table width="500" border="0" cellspacing="0" cellpadding="2" align="center" bgcolor="#006600"> 
      <tr> 
       <td width="16" class="ErrorMessageBoxTitle"><img src="/<s:text name="global.system.root"/>/images/smessage.gif" width="16" height="14" align="absmiddle" alt="System Errors"></td> 
      </tr> 
      <tr> 
       <td colspan="2" class="FixTdSize"> 
       <table width="496" border="0" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF"> 
       <tr> 
        <td align="center" class="FixTdSize"> 
        <table border="0" cellspacing="12" cellpadding="0" width="480"> 
        <tr> 
         <td width="35" class="ErrorMessageTitle"><img src="/<s:text name="global.system.root"/>/images/messager.gif" width="31" height="31" alt="System Errors"></td> 
         <td class="ErrorMessageTitle" width="409">&nbsp</td> 
        </tr> 
        <tr> 
         <td width="35" class="ErrorMessageBody">&nbsp;</td> 
         <td class="label" width="409"><font color=red><s:actionerror/></font></td> 
        </tr> 
        </table> 
        </td> 
       </tr> 
       </table> 
       </td> 
      </tr> 
      </table> 
        </tr> 
      <tr><td>&nbsp;</td></tr>  
</s:if> 
      <tr> 
      <td height="30"><tiles:insertAttribute name="searchpanel"/></td> 
      </tr> 
      <tr> 
      <td><img src="/<s:text name="global.system.root"/>/images/line.gif" width="100%" height="2"></td> 
      </tr> 
      <tr> 
      <td><tiles:insertAttribute name="message"/></td> 
      </tr> 
      <tr> 
      <td><tiles:insertAttribute name="body"/></td> 
      </tr> 
     </table> 
     </td> 
    </tr> 
     </table> 
    </td> 
    </tr> 
</table> 
</table> 

<tiles:insertAttribute name="menu"/> 

</body> 
</html> 
+0

Просто прекратите использовать modeldriven. –

+0

Я хотел бы сохранить класс действия, реализующий ModelDriven, поскольку он приносит мне очень удобно –

+0

* он приносит мне очень удобно * - Как? Не работает валидация? –

ответ

0

после расследования я, наконец, сделал это с ссылками на этот вопрос: Passing parameters to action through ModelDriven in Struts 2

Я думаю, что причиной является перехватчик Modeldriven, который подталкивает модель поверх стека значений (т. 0-index), и поэтому jsp не смог получить доступ к actionError (исходным 0-индексом был класс действия).

Вместо того, чтобы использовать <s:actionerror/>, страница могла отображать actionError с использованием <s:property value="[1].actionErrors[0]"/>, я не уверен, что это хороший подход, но он служит цели.

+0

@ Roman C: Я, наконец, придумал ответ со своего другого сообщения :) спасибо за вашу помощь! Как новичок Struts2, хотел бы спросить, считаете ли вы, что это приемлемый подход? Я беспокоюсь, будут ли другие недостатки. –

Смежные вопросы