【问题标题】:Struts2 validation, repopulate all the fields when validation failsStruts2 验证,验证失败时重新填充所有字段
【发布时间】:2014-03-29 12:33:42
【问题描述】:

我有 2 个页面,第一个页面是用户插入数据的地方,第二个页面是用户确认数据的地方(或者可以返回编辑页面)。 问题是当验证失败时,字段中的所有值都会被删除。 有人建议使用prepare(),但是复制所有字段的工作量很大,有没有更快的方法来重新填充所有字段?

第一页(formDatiUtente.jsp):

<%@ page language="java" contentType="text/html;"
     import="java.util.*,it.alm.bean.*,it.alm.delegate.*;"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link href="${pageContext.request.contextPath}/css/stile1.css" rel="stylesheet" type="text/css" />
<title>Registrazione account</title>

<script type="text/javascript" src="${pageContext.request.contextPath}/js/scriptFormUtente.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/scriptDWR.js"></script>
<script type='text/javascript' src='/gestUtenzeLDAP/dwr/engine.js'></script>
<script type='text/javascript' src='/gestUtenzeLDAP/dwr/util.js'></script>
<script type='text/javascript' src='/gestUtenzeLDAP/dwr/interface/DwrAjaxServiceImplEnti.js'></script>
<script type='text/javascript' src='/gestUtenzeLDAP/dwr/interface/DwrAjaxServiceImplTipoUfficio.js'></script>
<script type='text/javascript' src='/gestUtenzeLDAP/dwr/interface/DwrAjaxServiceImplUfficio.js'></script>
<script type='text/javascript' src='/gestUtenzeLDAP/dwr/interface/ComboBean.js'></script>

</head>

<body>
<jsp:include page="header.jsp"/> 
<s:actionerror />

<s:form name="formDatiUtente" action="inviaRichiesta.action" method="post" theme="simple" validate="true">

    <%
        String pathContest=request.getContextPath();
        //Collection clRichAna = (ArrayList)request.getAttribute("clRichAna");
        //String totRich=(clRichAna!=null?""+clRichAna.size():"0");

        //Collection comuni = (ArrayList)request.getAttribute("comuni");
        List <Comune> comuni = CreazioneUtenzaDelegate.getInstance().getComuni();
    %>


<center>
<s:fielderror></s:fielderror>
<table width="48%" class="LISTA" border="0" cellPadding="3" cellSpacing="5" align="center">
                <tr>
                    <td width="35%">
                        <p class="testodx">
                            <s:text name="label.cognome" />
                        </p>
                    </td>
                    <td align="right">
                        <p class="testosx">
                            <s:textfield name="cognome" id="idCognome"
                            size="30" value="%{anagraficaVDR.cognome}" />
                        </p>
                    </td>
                </tr>
                <tr>
                    <td align="right">
                        <p class="testodx"><s:text  name="label.nome" /></p>
                    </td>
                    <td align="left">
                        <s:textfield name="nome" id="idNome" size="30" value="%{anagraficaVDR.nome}" />
                    <td>
                </tr>
                <tr>
                    <td>
                        <p class="testodx"><s:text name="label.dataNascita" /></p>
                    </td>
                    <td>
                        <s:date name="%{anagraficaVDR.dataNascita}" format="dd/MM/yyyy" var="dataFormattata" />
                        <s:textfield name="dataNascita" size="12"
                            value="%{#dataFormattata}" />
                        <br>
                            <p class="testosuggerimento">
                                <s:text name="label.ddmmyyyy" />
                            </p>
                    </td>
                </tr>
                <tr>
                    <td>
                        <p class="testodx"><s:text name="label.qualifica" /></p> 
                    </td>
                    <td>    
                        <s:select 
                            style=" width : 207px;"
                            list="listaQualifiche"
                            listKey="idQualifica"
                            listValue="descrizione"
                            name="qualificaSelezionata"
                            value="%{anagraficaVDR.qualifica.idQualifica}"
                             />
                    </td>
                </tr>




                <tr>
                    <td> 
                        <p class="testodx"> Comune: </p>
                    </td>
                    <td>
                        <s:select 
                            headerKey="-1" headerValue="Seleziona..."
                            style=" width : 207px;"
                            id="idListaComuni"
                            list="listaComuni"
                            listKey="codComune"  
                            listValue="descrizione"
                            onChange="setReloadEnti()"
                            name="comuneSelezionato"
                            value="%{anagraficaVDR.ufficio.comune.codComune}"
                             />
                   </td>
                <tr>
                    <td>
                        <p class="testodx">Ente:</p>
                    </td>
                    <td>
                        <s:select 
                            list="listaEnte" 
                            listKey="idValue"  
                            listValue="value"
                            name="ente" 
                            onChange="setReloadTipoUfficio()" 
                            id="identi" 
                            value="%{anagraficaVDR.ufficio.tipoufficio.ente.idEnte}"
                            style=" width : 207px;"
                            />
                    </td>
                </tr>
                <tr>
                    <td>                        
                        <p class="testodx">Tipo Ufficio:</p>
                    </td>
                    <td>
                        <s:select 
                            list="listaTipoUffici" 
                            listKey="idValue"  
                            listValue="value"
                            name="tipoufficio" 
                            onChange="setReloadUfficio()" 
                            id="idtipouff" 
                            value="%{anagraficaVDR.ufficio.tipoufficio.idTipoUfficio}"
                            style=" width : 207px;"/> 
                    </td>
                </tr>
                <tr>
                    <td>
                        <p class="testodx">Ufficio:</p>
                    </td>
                    <td> 
                        <s:select 
                            list="listaUffici"
                            listKey="idValue"  
                            listValue="value"
                            name="ufficio" 
                            id="iduff" 
                            value="%{anagraficaVDR.ufficio.idufficio}"
                            style=" width : 207px;"/> 
                    </td>
                 </tr>






                <tr>
                    <td>
                        <p class="testodx"><s:text name="label.telefono_Ufficio_reparto" /></p>
                    </td>
                    <td>
                        <s:textfield name="telefono" id="idTelefono_Ufficio_reparto" size="30" value="%{anagraficaVDR.telefono}"/>
                    </td>
                </tr>
                <tr>
                    <td>
                       <p class="testodx"><s:text name="label.email" /></p>
                    </td>
                    <td>
                       <s:textfield name="email" id="idEmail" size="30" value="%{emailVDR}"/>
                       <s:text name="label.@" />
                        <s:select 
                            headerKey="-1" headerValue="Seleziona..."
                            list="dominiMail"
                            listKey="descrizione"  
                            listValue="descrizione"
                            name="ilTuodominio_Email" 
                            value="ilTuodominio_EmailVDR" />
                    </td>
                </tr>
                <tr>
                    <td>
                       <p class="testodx"><s:text name="label.confermaEmail" /></p>
                    </td>
                    <td>
                       <s:textfield name="confermaEmail" id="idConfermaEmail" size="30" value="%{emailVDR}" onfocus="disabilitaIncolla()"/>
                       <s:text name="label.@" />
                        <s:select 
                            headerKey="-1" headerValue="Seleziona..."
                            list="dominiMail"
                            listKey="descrizione"
                            listValue="descrizione"
                            name="ilTuodominio_EmailConferma" 
                            value="ilTuodominio_EmailVDR" />
                    </td>
                </tr>
                <tr>
                    <td>
                       <p class="testodx"><s:text name="label.ip" /></p>
                    </td>
                    <td>
                       <s:textfield name="ip" id="idIp" size="30" value="%{anagraficaVDR.ip}"/>
                       <br> 
                       <p class="testosuggerimento"> <s:text name="label.testoip" /></p>
                    </td>
                </tr>
                <tr>
                    <td class="right">
                        <s:text name="label.checkbox" />
                    </td>
                    <td class="left">
                        <s:checkboxlist list="listaApplicazioni"
                            listKey="idApplicazione"
                            listValue="descrizione" 
                            name="applicazioniSelezionate"
                            value="applicazioniSelezionateDefault" 
                            cssStyle="vertical"/>                   
                    </td>
                </tr>

</table>
<br>
<s:if test="!gestioneAmministratore">
    <s:submit method="execute" cssClass="bottone" key="label.invia" align="center" />
</s:if>    
</center>  

</s:form>
</body>
</html>

提交后转到此处(visualizzaDatiRichiesta.jsp),当用户返回上一页时,我使用隐藏值复制数据(这不是我认为的最佳方式,但我从同事):

<%@ page language="java" contentType="text/html;"
    import="java.util.*,it.alm.bean.*,it.alm.delegate.*;"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link href="${pageContext.request.contextPath}/css/stile2.css" rel="stylesheet" type="text/css" />
<title>Riepilogo dati richiesta</title>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/scriptFormUtente.js"></script>
</head>
<% String pathContest=request.getContextPath();
%>
<body>
<jsp:include page="headerGenerico.jsp"/> <br><br><br>
<s:actionerror />

<s:form action="registrazione.action" method="post" theme="simple">

    <s:hidden name="anagraficaVDR.cognome" value="%{cognome}" />

    <s:hidden name="anagraficaVDR.nome" value="%{nome}" />
    <s:hidden name="anagraficaVDR.dataNascita" value="%{dataNascita}" />
    <s:hidden name="anagraficaVDR.qualifica.idQualifica" value="%{qualificaSelezionata}" />
    <s:hidden name="anagraficaVDR.telefono" value="%{telefono}" />
    <s:hidden name="anagraficaVDR.email" value="%{email}" />
    <s:hidden name="anagraficaVDR.ip" value="%{ip}" />

    <s:hidden name="comuneSelezionatoVDR" value="%{comuneSelezionato}" />
    <s:hidden name="enteSelezionatoVDR" value="%{ente}" />  
    <s:hidden name="tipoUfficioSelezionatoVDR" value="%{tipoufficio}" />    
    <s:hidden name="ufficioSelezionatoVDR" value="%{ufficio}" />    
    <s:hidden name="anagraficaVDR.ufficio.comune.codComune" value="%{comuneSelezionato}" />
    <s:hidden name="anagraficaVDR.ufficio.tipoufficio.ente.idEnte" value="%{ente}" />   
    <s:hidden name="anagraficaVDR.ufficio.tipoufficio.idTipoUfficio" value="%{tipoufficio}" />  
    <s:hidden name="anagraficaVDR.ufficio.idufficio" value="%{ufficio}" />  


    <s:hidden name="qualificaSelezionataDescrizioneVDR" value="%{qualificaSelezionataDescrizione}" />
    <s:hidden name="descrizioneTipoUfficioEUfficioVDR" value="%{descrizioneTipoUfficioEUfficio}" />
    <s:hidden name="ilTuodominio_EmailVDR" value="%{ilTuodominio_Email}" />

    <s:hidden name="applicazioniSelezionateVDR" value="%{applicazioniSelezionate}" />
    <s:hidden name="applicazioniSelezionateDescVDR" value="%{applicazioniSelezionateDesc}" />
<center>
<div class= "divCornicePrimoBlocco">
<table width="900"   class="PRIMORIQUADRO1" border="0" cellspacing="5" cellpadding="0">
     <tr>
         <th align="center" colspan="2">
            <h3>Riepilogo dati richiesta</h3>
         </th>
      </tr>
     <tr >
        <td>
        <s:text name="label.cognome2"/><p class="testoColorato"><s:property value="cognome"/></p>
         <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.............................................................................................................................</p>
        </td>
     </tr>
     <tr>
         <td>
          <s:text name="label.nome2" /><p class="testoColorato"><s:property value="nome"/></p>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..................................................................................................................................</p>
        </td>
     </tr>
     <tr>
        <td>
          <s:text name="label.dataNascita2" ></s:text><p class="testoColorato1"><s:date format="dd/MM/yyyy" name="dataNascita"/></p>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.....................................................................................................................</p>
        </td>
     </tr> 
     <tr>
     <td>
          <s:text name="label.qualifica2"></s:text><p class="testoColorato"><s:property value="qualificaSelezionataDescrizione"/></p>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..............................................................................................................................</p>
        </td>
     </tr>
     <tr>
       <td>
        <s:text name="label.ufficio_Reparto_di_appartenenza2" /><p class="testoColorato2"><s:property value="descrizioneTipoUfficioEUfficio"/></p>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.......................................................................................</p>
       </td>
      </tr>
       <tr>
         <td>
           <s:text name="label.telefono_Ufficio_reparto2" /><p class="testoColorato2"><s:property value="telefono"/></p>
             <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.........................................................................................................</p>
         </td>
      </tr>
       <tr>
         <td >
            <s:text name="label.email2" /><p class="testoColorato"><s:property value="email"/>@<s:property value="ilTuodominio_EmailDesc"/></p>
              <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.................................................................................................................................</p>
         </td>
      </tr>
       <tr>
         <td>
            <s:text name="label.ip2" /><p class="testoColorato3"><s:property value="ip"/></p>
             <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;................................................................................</p>
         </td>
       </tr>
       <tr>
         <td>
           <s:label>Applicativo richiesto</s:label><p class="testoColorato2"><s:property value="applicazioniSelezionateDesc"/></p>
           <p >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.............................................................................................................</p>
         </td>
       </tr>
  </table>
 </div><br>
 <div align="right">

   <s:submit  value="Crea documento" class="bottoneConferma" action="stampaRichiestaPdf" onClick="javascript:creaDocumentoPdf();"/>&nbsp;
   <s:submit  id="idBottoneConferma" value="Conferma" class="bottoneConferma" action="inserisciRichiestaInDB" disabled="true"/>&nbsp;

   <s:submit value="Modifica dati richiesta" class="bottoneModifica" action="inserimentoDati" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </div>
</center>

</s:form>
</body>
</html>

所以,让我们传递给动作,这是相对于第一个jsp的(这扩展了另一个动作):

 public class InserimentoDatiAction extends RegisterAction implements Preparable {

    private static final long serialVersionUID = 1L;

    public InserimentoDatiAction()
    {
    }

    public String execute() 
    {
        refreshDWR();

        return "success";

    }

    public void refreshDWR()
    {
        String idComune = null;
        try
        {
            idComune = getAnagraficaVDR().getUfficio().getComune().getCodComune();
        }
        catch (NullPointerException e)
        {
            //qualche campo � incompleto, le combobox non vengono caricate
        }

        if ( idComune != null)
        {
            DwrAjaxServiceImplEnti dwrEnte = new DwrAjaxServiceImplEnti();
            this.setListaEnte( dwrEnte.get_Ente( idComune ) );
            String idEnte = getAnagraficaVDR().getUfficio().getTipoufficio().getEnte().getIdEnte();
            if ( idEnte != null)
            {
                DwrAjaxServiceImplTipoUfficio dwrTipoUff = new DwrAjaxServiceImplTipoUfficio();
                this.setListaTipoUffici( dwrTipoUff.get_TipoUfficio(idComune, idEnte) );
                String idTipoUff = getAnagraficaVDR().getUfficio().getTipoufficio().getIdTipoUfficio();
                if ( idTipoUff != null)
                {
                    DwrAjaxServiceImplUfficio dwrUff = new DwrAjaxServiceImplUfficio();
                    this.setListaUffici( dwrUff.get_Ufficio(idComune, idEnte, idTipoUff));
                }
            }
        }
    }

    @Override
    public void prepare() throws Exception 
    {
        this.setDominiMail( CreazioneUtenzaDelegate.getInstance().getEmails() );
        this.setListaComuni( CreazioneUtenzaDelegate.getInstance().getComuni() );
        this.setListaApplicazioni( CreazioneUtenzaDelegate.getInstance().getApplicazioni() );
        this.setListaQualifiche( CreazioneUtenzaDelegate.getInstance().getQualifiche() );
        this.getSession().put("listaApplicazioni", this.getListaApplicazioni());
        this.getSession().put("listaQualifiche", this.getListaQualifiche());
    }

    public boolean isGestioneAmministratore()
    {
        return false;
    }

}

这是相对于第二个jsp(确认页面):

public class InviaRichiestaAction extends ActionSupport implements Preparable, SessionAware 
{

    private static final long serialVersionUID = 1L;

    private String cognome;
    private String nome;
    private Date dataNascita;

    private List<Qualifica> listaQualifiche;
    private String qualificaSelezionata;
    private String qualificaSelezionataDescrizione;

    private String comuneSelezionato;
    private String ente;
    private String tipoufficio;
    private String ufficio;


    private String telefono;
    private String email;
    private String confermaEmail;
    private String ilTuodominio_Email;
    private String ilTuodominio_EmailConferma;

    private String ip;

    private String applicazioniSelezionate;
    private String applicazioniSelezionateDesc;
    private String identi;

    private static List<ComboBean> listaTipoUfficio = new ArrayList<ComboBean>();
    private static List<ComboBean> listaUfficio = new ArrayList<ComboBean>();

    //questo blocco di variabili anche se non è usato sta qui 
    //per non generare errori di validazione:
    private List<Comune> listaComuni = new ArrayList<Comune>();
    private List<ComboBean> listaEnte = new ArrayList<ComboBean>();
    private List<Email> dominiMail = new ArrayList<Email>();
    private List<ComboBean> listaTipoUffici = new ArrayList<ComboBean>();
    private List<ComboBean> listaUffici = new ArrayList<ComboBean>();
    private List<Applicazione> listaApplicazioni;


    private Map<String, Object> session;

    public String execute() 
    {       
        qualificaSelezionataDescrizione = BeanCopyUtil.getDescriptionFromBeanList(listaQualifiche, qualificaSelezionata, "getIdQualifica", "getDescrizione");
        setApplicazioniSelezionateDesc(BeanCopyUtil.getDescriptionFromBeanList(listaApplicazioni, applicazioniSelezionate, "getIdApplicazione", "getDescrizione"));
        return "success";
    }

    @Override
    public void prepare() throws Exception 
    {
        listaQualifiche = (List<Qualifica>) this.getSession().get("listaQualifiche");       
        listaApplicazioni = (List<Applicazione>) session.get("listaApplicazioni");
    }

    public String getDescrizioneTipoUfficioEUfficio()
    {
        String descrizioneTipoUfficioEUfficio = "";
        if (listaTipoUfficio!=null && !listaTipoUfficio.isEmpty())
        {
            Iterator<ComboBean> it1 = listaTipoUfficio.iterator();
            while (it1.hasNext())
            {
                ComboBean elem = it1.next();
                if (elem.getIdValue().equals(tipoufficio))
                {
                    descrizioneTipoUfficioEUfficio += elem.getValue();
                    break;
                }
            }
            if (!listaUfficio.isEmpty())
            {
                it1 = listaUfficio.iterator();
                while (it1.hasNext())
                {
                    ComboBean elem = it1.next();
                    if (!elem.getValue().trim().isEmpty() && elem.getIdValue().equals(ufficio))
                    {
                        descrizioneTipoUfficioEUfficio += " - " + elem.getValue();
                        break;
                    }
                }
            }
        }
        return descrizioneTipoUfficioEUfficio;
    }

[...a lot of boring getter and setter...]

}

InserimentoDatiAction 的超类:

public class RegisterAction extends ActionSupport implements SessionAware {
    private static final long serialVersionUID = 1L;

    private Anagrafica anagraficaVDR = new Anagrafica();

    private String comuneSelezionatoVDR;
    private String ilTuodominio_EmailVDR;
    private String applicazioniSelezionateVDR;

    private List<Email> dominiMail;
    private List<Comune> listaComuni;
    private List<Applicazione> listaApplicazioni;
    private List<Qualifica> listaQualifiche;

    private List<ComboBean> listaEnte = new ArrayList<ComboBean>();
    private String enteSelezionatoVDR;
    private List<ComboBean> listaTipoUffici = new ArrayList<ComboBean>();
    private String tipoUfficioSelezionatoVDR;
    private List<ComboBean> listaUffici = new ArrayList<ComboBean>();
    private String ufficioSelezionatoVDR;

    private String qualificaSelezionataDescrizioneVDR;
    private String descrizioneTipoUfficioEUfficioVDR;
    private String applicazioniSelezionateDescVDR;

    private Map<String, Object> session;
[...other less important stuff...]
}

struts.xml的一部分,formDatiUtente是第一个jsp,visualizzaDatiRichiesta是第二个(确认jsp):

<action name="inserimentoDati"
    class="it.alm.action.InserimentoDatiAction">
    <result name="success">/jsp/creazioneUtenza/formDatiUtente.jsp</result>
</action>
<action name="inviaRichiesta"
    class="it.alm.action.InviaRichiestaAction">
    <result name="success">/jsp/creazioneUtenza/visualizzaDatiRichiesta.jsp</result>
    <result name="input">/jsp/creazioneUtenza/formDatiUtente.jsp</result>
    <result name="backToMenuAdmin">/jsp/pannelloDiGestione/menu.jsp</result>           
</action> 

【问题讨论】:

  • 1) 请仅发布代码的相关部分; 2)anagraficaVDR,也就是我们需要看到的最相关的Java部分,不见了; 3)你确定你可以像这样在野外发布(大概)私人/受版权保护的代码吗?小心……
  • 1) 好的 2) anagraficaVDR 只是一个 bean(Anagrafica 类型),通过休眠自动生成,内部有其他 bean 或字符串/日期/整数值,只是 getter 和 setter 3)我删除了最敏感的部分,从技术上讲,这可以是任何东西。
  • 自动生成 when ?当被 JSP 调用时?
  • 抱歉,有误会。它只是一个简单的 bean,(我从 hibernate 生成的)。
  • 是的,但是你在 JSP 中调用它,我在 Action 中找不到它(我可以看到有一个 Getter 但没有属性,也没有初始化它的位置,如果是的话)

标签: java jsp validation struts2


【解决方案1】:

Action1 扩展了包含用于设置值的 AnagraficaVDR 的那个;

Action2 只是简单地扩展了 ActionSupport,它对名为 AnagraficaVDR 的对象一无所知。

当您将表单发布到 Action2 并且验证失败时,INPUT 结果返回第一个 JSP,而第一个 Action 没有支持其数据。

你必须重新考虑一下机制:

  • 如果您想使用来自 AnagraficaVDR 的 ORIGINAL 值重新填充第一个 JSP,您还必须向 Action2 提供 AnagraficaVDR(可能通过在 struts.xml 中声明两个操作指向包含 AnagraficaVDR 的同一操作的两个方法...)

但这通常是可以避免的,因为如果我从原始值更改了 10 个字段,并且其中一个未通过验证,我希望它返回我的 10 个 ALTERED 值,以便能够仅更改失败的一个.使用上面提供的解决方案,它将全部重置为 AnagraficaVDR 值,而不是刚刚输入的值。

那你应该找另一种更简单有效的方法,比如

  • 在第一次执行 Action 时从 AnagraficaVDR 填充 Action1 属性(或 准备)方法,
  • 从 JSP1 中的标签中删除所有 value="%{AnagraficaVDR.something"。*

*注意:这是基于on your previous question 代码,其中标签有name="properties" and value="%{AnagraficaVDR.properties}"

这样,第一个操作将仅在第一次填充来自 AnagraficaVDR 的值,然后在成功或输入的情况下保留输入的值。

【讨论】:

  • 谢谢,你的第二种方法有效,我只是不明白我是在使用它还是两者兼而有之:) 所以,如果我错了,请纠正我,在 InserimentoDatiAction 我添加所有变量现在丢失了(例如:cognome)并在 execute() 中编写类似 cognome = getAnagraficaVDR().getCognome();这适用于所有字段(而且我必须删除 value="%{AnagraficaVDR.something"),对吧?
  • 是的。两种方式都可以,这取决于您;您还可以避免使用所有变量,直接指向实体列表或 DTO 列表。
  • 但是(另一个问题,哈哈!)而不是 jsp 中的隐藏字段,在会话中放置一个对象(例如:anagrafica)是否更干净、更快捷?
  • 我遵循您的建议(删除 value="...")和所有作品,除了复选框列表。当我只插入一张支票,然后我转到第二页然后回到第一页时,我已经正确地检查了一个项目。相反,当我选择更多的一个检查,然后转到第二个然后返回第一个时,不会显示任何检查。但是,如果我调试,则在调用 getApplicazioniSelezionate() 时会出现 2 个(或更多)项(该方法返回一个带有 id 的字符串,例如:“2、5、6”)。我也尝试过使用字符串数组而不是简单的字符串,但也没有用。
  • 复选框在 Struts2 中以特定方式处理。确保你有 CheckboxInterceptor(并且它在 ParamsInterceptor 之前),然后看看这个:stackoverflow.com/a/21292722/1654265
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
相关资源
最近更新 更多