проверка с использованием ajax в struts2

Я использовал проверку ajax для проверки следующих

   <tr>
      <td width="20" style='color: red'>
         <img src="images/icon-star.png" width="16" height="16" />
      </td>
      <td id="lblCustomBillNo" style="width: 15%" class="searchCriteriaCellLbl">
         The custom Bill Number
      </td>
      <td width="5" class="searchCriteriaCellLbl">:</td>
      <td class="searchCriteriaCellVal">
          <s:textfield id="customBillNo" name="customBillNo" size="20" maxlength="24" style="width: 200px" />
      </td>
      <td class="errorFlag" style="color: red" valign="middle">
          <s:fielderror fieldName="customBillNo" />
      </td>
  </tr>
  <tr>
      <td width="20" style='color: red'>
        <img src="images/icon-star.png" width="16" height="16" />
      </td>
      <td id="lblBillNo" style="width: 15%" class="searchCriteriaCellLbl">
         <s:property value="%{getText('billNo')}" />
      </td>
      <td width="5" class="searchCriteriaCellLbl">:
      </td>
      <td class="searchCriteriaCellVal">
          <s:textfield label="billNo" id="billNo" name="billNo" size="20" maxlength="24" style="width: 200px" />
      </td>
      <td class="errorFlag" style="color: red" valign="middle">
          <s:fielderror fieldName="billNo" />
      </td>
  </tr>
  <tr>
      <td width="20" style='color: red'>
        <img src="images/icon-star.png" width="16" height="16" />
      </td>
     <td id="lblCarrierNo" style="width: 15%" class="searchCriteriaCellLbl">
        The carrier Number
     </td>
     <td width="5" class="searchCriteriaCellLbl">:
     </td>
     <td class="searchCriteriaCellVal">
        <s:textfield label="carrierNo" id="carrierNo" name="carrierNo" size="20" maxlength="24" style="width: 200px" />
     </td>
     <td class="errorFlag" style="color: red" valign="middle">
        <s:fielderror fieldName="carrierNo" />
     </td>
 </tr>

Я использую следующую интернационализацию для ошибок в файле golbal i18n

errors.required=${getText(fieldName)} requireddd

и этот файл проверки

 <validators>      
     <field name="customBillNo">
        <field-validator type="requiredstring" short-circuit="true">
           <param name="trim">true</param>
           <message key="errors.required" />
        </field-validator>
     </field>
     <field name="billNo">
      <field-validator type="required" short-circuit="true">
        <message key="errors.required" />
       </field-validator>
     </field>
     <field name="carrierNo">
       <field-validator type="required" short-circuit="true">
          <message key="errors.required" />
       </field-validator>
     </field>
   </validators>

и я поставил этот javascript для использования проверки ajax

      function validate(){

            //document.all.loading.style.display = 'block';

            var searchUrl = 'AddEnteringApproval_approval';

            var params = '';

            var elemArray = document.mainForm.elements;
            for (var i = 0; i < elemArray.length;i++)
            {
                var element = elemArray[i];

                var elementName= element.name;
                if(elementName=='formAction')
                    continue;
                params += '&' + elementName+'='+ encodeURIComponent(element.value);
            }

            params += '&struts.enableJSONValidation=true&struts.validateOnly=true';

            createXmlHttpObject(); // this is my function that prepare ajax

            sendRequestPost(http_request,searchUrl,false,params);

            postValidation();

    }

    function postValidation() {
       var form = $('#mainForm');

       var text = http_request.responseText;

       //clear previous validation errors, if any
       StrutsUtils.clearValidationErrors(form);
       alert(text)
       //get errors from response
       //var text = request.responseText;
       var errorsObject = StrutsUtils.getValidationErrors(text);

       //show errors, if any
       if(errorsObject.fieldErrors)
       {
         StrutsUtils.showValidationErrors(form, errorsObject);
       }
       else
       {
         //good to go, regular submit
         form.submit();
       }
    }


       /*  This is one of the functions that doesn't work using the simple theme, so I redefined it.
        This can be changed to clear the previous errors, as it does in the commented example
        cleaning the errors on divErrors.
        As I am just showing the messages with alerts I don't need to clear anything,
        but the method still need to be redefined, even if it is empty.
     */

   StrutsUtils.clearValidationErrors = function(form, errors) {
        //clear the div errors
        //$('#divErrors').empty();
    }


    /* This method is responsible to show the messages.
       The original versions works with the xhrml and css-xhtml theme but doesn't work with the simple theme
       so I override the method with another implementation that shows the messages using alerts.
       You can change the implementation to show the messages as you want,
       but as the previous method this has to be redefined.
     */

    StrutsUtils.showValidationErrors = function(form, errors) {

        if(errors.fieldErrors)
        {alert((errors.fieldErrors))
             for(var fieldName in errors.fieldErrors)
             { 
                 alert("errors.fieldErrors[fieldName]   " + errors.fieldErrors[fieldName]);

               for(var i = 0; i < errors.fieldErrors[fieldName].length; i++)
               {
                   alert('Field ->' + fieldName + '\nError -> ' + errors.fieldErrors[fieldName][i]);
               }
             }
        }
    };

но когда я выполняю код, я не получаю организованного текста JSON, который я показал в окне сообщения об ошибке, имя поля не похоже на имя в сообщении об ошибке, имя второго поля отсутствует, имя третьего поля вырезано (т.е. carrierNo становится rNo ).

вы можете мне помочь. я хочу, чтобы имя поля в ошибке JSON совпадало с текстом сообщения об ошибке

Я только что понял, в чем проблема, но не знаю, почему это происходит и почему. он всегда удаляет первые 6 символов. почему это происходит

введите описание изображения здесь


person user1512999    schedule 05.11.2012    source источник
comment
Проверка на стороне клиента и на стороне сервера - это две разные проблемы. Удалите все детали на стороне сервера из вопроса (включая теги), и есть больше шансов, что кто-то ответит на него.   -  person Quaternion    schedule 06.11.2012
comment
это проверка на стороне сервера с использованием ajax, я помещаю проверочный xml, который я использовал, плюс jvascript, который я использовал для чтения JSON. скажите мне, что вы считаете бесполезным?   -  person user1512999    schedule 06.11.2012
comment
Я только что понял, в чем проблема, но не знаю, почему это происходит и почему. он всегда удаляет первые 6 символов. почему это происходит   -  person user1512999    schedule 06.11.2012


Ответы (1)


ну я разобрался в проблеме. это было но в org.apache.struts2.interceptor.validation.JSONValidationInterceptor

он удаляет 6 первых символов из-за этого неполного оператора if

sb.append((validationAware instanceof ModelDriven) ? ((String)fieldError.getKey()).substring(6) : (String)fieldError.getKey());

эта ошибка присутствует в struts 2.1.8

это должно быть так

sb.append(((validationAware instanceof ModelDriven)) && (fieldErrorKey.startsWith("model.")) ? fieldErrorKey.substring(6) : fieldErrorKey);

это было исправлено в более поздних релизах стоек. я исправил проблему. и я подумал, что должен поделиться информацией с людьми, которые сталкиваются с этой проблемой.

person user1512999    schedule 06.11.2012