Моя форма не заполняется повторно при сбое проверки

У меня есть простая страница с полем firstName и полем lastName, оба из которых обязательны. Когда я ввожу только одно поле, я получаю правильное сообщение об ошибке, но теряю введенное значение. У меня есть геттеры и сеттеры для полей, и страница правильно использует значения, если я их ввожу. Кажется, все настроено так же, как в моем предыдущем проекте, и я не потерял данные на этих страницах. Я знаю, что этот вопрос задавали раньше, но я не могу найти ничего плохого в моем коде на основе этих ответов, поэтому я надеюсь, что кто-то увидит, что я делаю неправильно.

Мой JSP-код:

<s:form action = "sign" validate="true" method="post" id="sign" >
<s:hidden name="dateSigned"></s:hidden>    
<div class="row">
    <div class = "col-md-7 col-xs-12">
        <div class="col-md-3 col-sm-3 col-xs-12"><label for="firstName" class="pull-right"><span class="required">*</span><s:text name="firstName"></s:text>:</label></div>
        <div class="col-md-3 col-sm-3 col-xs-12"><s:textfield name = "firstName" id = "firstName" value="" maxlength="50" class="form-control" onchange="dirtyFlag();" tabindex="4"/></div>
        <div class="col-md-3 col-sm-3 col-xs-12"><label for="lastName" class="pull-right"><span class="required">*</span><s:text name="lastName"></s:text>:</label></div>
        <div class="col-md-3 col-sm-3 col-xs-12"><s:textfield name = "lastName" id = "lastName" value="" maxlength="50" class="form-control" onchange="dirtyFlag();" tabindex="5"/></div>
    </div>
</div>
   <div class="row">
        <s:submit method="save" key="button.save" cssClass="submit" onclick="clearDirtyFlag();" tabindex="1"/>
    </div>

Мои действия на стойках:

        <action name="sign" class="gov.mo.dnr.egims.controller.request.RequestorSignatureAction">           
        <result name="success" type="tiles">reqSign</result>
        <result name="input" type="tiles">reqSign</result>
        <result name="error" type="tiles">error</result>
        <result name="ownerSignature" type="redirectAction">
            <param name="actionName">owner</param>
            <param name="namespace">/req</param>
            <param name="requestId">${requestId}</param>
        </result>           
    </action>  

Код моей плитки:

    <definition name="reqSign" extends="baseLayout">
    <put-attribute name="navbar"
        value="/WEB-INF/pages/request/nav_secondary.jsp" />
    <put-attribute name="content"
        value="/WEB-INF/pages/request/RequestorSignature.jsp" />
</definition>

Мои типы результатов struts2 и код перехватчика:

        <result-types>
        <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
    </result-types>  
    <interceptors>
        <interceptor name="validUser" class="gov.mo.dnr.egims.controller.interceptors.ValidUser" />
        <interceptor-stack name="validUserStack">
            <interceptor-ref name="validUser" />
            <interceptor-ref name="defaultStack" />
        </interceptor-stack>
        <interceptor name="userInRole" class="gov.mo.dnr.egims.controller.interceptors.UserInRole">
            <param name="rolesList">Administrator,Geologist,Requestor,Reviewer, User</param>
        </interceptor>
        <interceptor-stack name="userInRoleStack">
            <interceptor-ref name="userInRole" />
        </interceptor-stack>
    </interceptors>     

Мой xml проверки:

<validators>

<field name="firstName">
    <field-validator type="requiredstring">
        <param name="trim">true</param>
        <message key="errors.required" />
    </field-validator>      
    <field-validator type="regex">
        <param name="regex">^[ a-zA-Z0-9'\-,.!:#@/]*$</param>
        <message key="errors.invalidCharacter"/>
    </field-validator>
    <field-validator type="stringlength">
        <param name="maxLength">50</param>
        <message key="errors.maxlength"></message>
    </field-validator>
</field>


<field name="lastName"> 
        <field-validator type="requiredstring">
        <param name="trim">true</param>
        <message key="errors.required" />
    </field-validator>      
    <field-validator type="regex">
        <param name="regex">^[ a-zA-Z0-9'\-,.!:#@/]*$</param>
        <message key="errors.invalidCharacter"/>
    </field-validator>
    <field-validator type="stringlength">
        <param name="maxLength">50</param>
        <message key="errors.maxlength"></message>
    </field-validator>
</field>

Any help would be appreciated, thanks!

Вот запрошенный код dirtyFlag() (и связанный с ним код):

//needToConfirm used by confirm exit
var needToConfirm = false;

//default string message to display before leaving a page when data on the page has changed
//these changes were made to allow the message displayed before exiting to be customized
var defaultWarningMessage = "There is unsaved data on this screen.  Do you want to exit anyway?";
var dirtyWarningMessage = defaultWarningMessage;

//this line intercepts attempts to leave the page via clicking the X button.
window.onbeforeunload = function ()
{
if (needToConfirm)
{   
    var outMessage = dirtyWarningMessage;
    setDirtyWarningMessage(defaultWarningMessage);
    return outMessage;
}
// no changes - return nothing              
}

//function to set the string message to display before leaving a page when data on the page has changed
function setDirtyWarningMessage(inMessage)
{
dirtyWarningMessage = inMessage;
}

//function to set dirty flag
function dirtyFlag()
{
//alert ("Dirty flag set");
needToConfirm = true;
}

//function to clear dirty flag
function clearDirtyFlag()
{
//alert ("Dirty flag cleared");
needToConfirm = false;
}


//function to confirm close
function confirmClose()
{
if (needToConfirm)
{
    var agree=confirm("Some data on the page is modified. Do you wish to leave the page without saving changes?");
    if (agree == true)
    {
        needToConfirm = false;
        window.close();
    }
    else
    {
        return false;
    }
} 
else 
{
    window.close();
}
}

person ponder275    schedule 17.02.2016    source источник
comment
У вас есть ошибки проверки?   -  person Roman C    schedule 17.02.2016
comment
Да, сообщение Фамилия обязательно. отображается в верхней части страницы, если я оставлю поле «Фамилия» пустым, чего я и хочу. Но все, что я набрал в поле «Имя», потеряно.   -  person ponder275    schedule 17.02.2016
comment
Опубликуйте код для clearDirtyFlag() и dirtyFlag().   -  person Roman C    schedule 17.02.2016


Ответы (1)


Угадай, что ?

<s:textfield name = "firstName" 
               id = "firstName"

            value = "" 

        maxlength = "50" 
            class = "form-control" 
         onchange = "dirtyFlag();" 
         tabindex = "4"/>

value="" заставляет значение всегда быть пустым.

  • Используйте value="%{firstName}" или
  • удалите его и дайте name="firstName" выполнить эту работу (рекомендуется).
person Andrea Ligios    schedule 17.02.2016
comment
Не могу поверить, что я этого не видел. Я сравнивал его с кодом, который работал несколько раз и каждый раз промахивался. Я бы дал вам +10, если бы это было разрешено. Спасибо! - person ponder275; 18.02.2016
comment
Ну, +10 недоступен, но ответ можно принять... :) - person Andrea Ligios; 18.02.2016
comment
Извините, я забыл, что галочка и голосование - это разные элементы. - person ponder275; 18.02.2016