2015-06-10 5 views
2

Я создал проект Struts2, в котором я использовал проверку на основе XML. Модель класса RegistrationForm показан нижеКак выполнить проверку XML при использовании ModelDriven?

package com.projects; 

import com.opensymphony.xwork2.ActionSupport; 

public class RegistrationForm implements Serializable{ 

    private static final long serialVersionUID = 1L; 
    private String fname; 
    private String lname; 
    private int numbr; 

    public int getNumbr() { 
    return numbr; 
    } 
    public void setNumbr(int numbr) { 
    this.numbr = numbr; 
    } 
    public String getFname() { 
    return fname; 
    } 
    public void setFname(String fname) { 
    this.fname = fname; 
    } 
    public String getLname() { 
    return lname; 
    } 
    public void setLname(String lname) { 
    this.lname = lname; 
    } 
} 

RegistrationFormAction.Java

package com.projects; 

import com.opensymphony.xwork2.ActionSupport; 
import com.opensymphony.xwork2.ModelDriven; 

public class RegistrationFormAction extends ActionSupport implements ModelDriven<RegistrationForm> { 
private RegistrationForm registrationForm; 
public RegistrationForm getRegistrationForm() { 
    return registrationForm; 
} 
public void setRegistrationForm(RegistrationForm registrationForm) { 
    this.registrationForm = registrationForm; 
} 

public RegistrationForm getModel(){ 
    registrationForm=new RegistrationForm(); 
    return registrationForm; 
} 
public String execute(){ 
    return "success"; 
} 
} 

struts.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
    "http://struts.apache.org/dtds/struts-2.0.dtd"> 
<struts> 

<constant name="struts.devMode" value="true" /> 
<package name="dd" extends="struts-default"> 

    <interceptors> 
     <interceptor-stack name="defaultStack"> 
     <interceptor-ref name="exception" /> 
     <interceptor-ref name="alias" /> 
     <interceptor-ref name="servletConfig" /> 
     <interceptor-ref name="prepare" /> 
     <interceptor-ref name="i18n" /> 
     <interceptor-ref name="chain" /> 
     <interceptor-ref name="debugging" /> 
     <interceptor-ref name="profiling" /> 
     <interceptor-ref name="scopedModelDriven" /> 
     <interceptor-ref name="modelDriven" /> 
     <interceptor-ref name="params"/> 
     <interceptor-ref name="validation"/> 
     <interceptor-ref name="fileUpload" /> 
     <interceptor-ref name="checkbox" /> 
     <interceptor-ref name="staticParams" /> 
     <interceptor-ref name="conversionError" /> 
     <interceptor-ref name="workflow"/> 
     </interceptor-stack> 
    </interceptors> 

     <action name="submitForm" class="com.projects.RegistrationFormAction"> 
     <interceptor-ref name="defaultStack" /> 
     <result name="success">/WelcomePage.jsp</result> 
     <result name="input">/RegistrationForm.jsp</result> 
    </action> 
</package> 
</struts> 

RegistrationFormAction-validation.xml

<!DOCTYPE validators PUBLIC 
"-//Apache Struts//XWork Validator 1.0.3//EN" 
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> 

<validators> 
<field name="registrationform"> 
     <field-validator type="visitor"> 
     <param name="appendPrefix">false</param> 
    <message/> 
    </field-validator> 
</field> 

</validators> 

RegistrationForm-validation.xml

<!DOCTYPE validators PUBLIC 
"-//Apache Struts//XWork Validator 1.0.3//EN" 
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> 

<validators> 
<field name="fname"> 
    <field-validator type="requiredstring"> 
    <message>First Name can't be blank</message> 
</field-validator> 
</field> 

<field name="lname"> 
    <field-validator type="requiredstring"> 
    <message>Last Name can't be blank</message> 
    </field-validator> 
</field> 
<field name="numbr"> 
    <field-validator type="int"> 
    <param name="min">1</param> 
    <param name="max">10</param> 
    <message>Number between 1 to 10</message> 
</field-validator> 
</field> 
</validators> 

но проверка не работает.

+1

Не используйте modeldriven. –

+1

'<имя поля =" registrationform ">' должно быть '<имя поля =" registrationForm ">'. –

+1

Это работает. Спасибо тонну –

ответ

3

Здесь очень много вещей! Я отправлю их в порядке появления в вопросе:

  1. никогда не делают POJO расширяет ActionSupport:

    public class RegistrationForm extends ActionSupport { 
    

    должен стать

    public class RegistrationForm implements Serializable { 
    
  2. Лучше возвращение SUCCESS чем "success" к предотвращать опечатки (но это нормально);

  3. Стек intercetpor настройка имеет четыре проблемы:

    • вы переопределение существующего basicStack, это рискует нарушить POLA, особенно если другие люди будут работать над этим проектом; вместо этого лучше использовать собственное имя, например. myStack;

    • Вы используете только три перехватчика, и это подозрительно; в то время как многие из перехватчиков по умолчанию могут быть отброшены, многие другие должны быть всегда сохранены, особенно при проверке, например. ConversionError Перехватчик, или Workflow Перехватчик и т. Д. Read how the whole thing works. Как правило, вы должны удалить Interceptor только тогда, когда знаете точно что он делает, и вы абсолютно уверены вам это не нужно (и не понадобится).

    • При использовании ModelDriven (что обычно не рекомендуется, потому что в основном бесполезна и источником проблем, когда не эксперты с ним), вы должны поставить ModelDriven перехватчик перед темParameters перехватчик, в противном случае при запуске параметры перехватчик, модель еще не будет нажата, и сеттеры будут искаться в действии, например.setFname(), вместо этого на модели (в результате нулевых свойств в модели, а также в предупреждении

      Unexpected Exception caught setting 'fname' on 'class RegistrationFormAction: Error setting expression 'fname' with value ['Sumit', ]

      из-за отсутствующих сеттеров в действии).

    • Наконец, если вы действительно используете код, который вы в курсе, то вы не используете стек неправильно вы создали, потому что 1) по умолчанию один является defaultStack, не basicStack, так наиважнейшая basicStack не имеет эффекты и 2) вы не использовали <default-interceptor-ref> для изменения ссылки на стек по умолчанию, а также не использовали <interceptor-ref> внутри тега <action>, чтобы указать другой стек перехватчика только для этого действия.
  4. Вы смешиваете 1.0.2 и 1.0.3 в DOCTYPE файлов проверки XML, делаете все 1.0.3 (и замечаете, что они перенесли с OpenSymphony на Apache); то изменить:

    в

    <!DOCTYPE validators PUBLIC 
        "-//Apache Struts//XWork Validator 1.0.3//EN" 
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> 
    
  5. Убедитесь, что файл RegistrationFormAction-validation.xml находится в папке действия, в то время как RegistrationForm-validation.xml находится в папке RegistrationForm.java.

  6. Избегать ModelDriven, потому что, как говорит Стивен Янг,

    You Must Tame Complexity to Become a Better Programmer

  7. Как отметил комментарий AleksandrM, есть также опечатка в

    <field name="registrationform"> 
    

    что должен быть

    <field name="registrationForm"> 
    
+1

Он начинает работать. Вы поняли многое для меня. Большое спасибо. –

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