Бобы модели не заполняются

Я написал веб-приложение, в котором есть login.jsp, loginAction и login Beans. Когда я заполняю форму в бинах jsp, в loginbeans заполняются через loginAction. Когда я копирую логику с этих страниц для регистрации пользователя, бины не заполняются. Вот мой код..

<s:form action="login" method="post">
   <p>      <s:textfield    key="username" label="Username" required="true" /><br> 
   <p>  <s:password     key="password" label="Password" required="true" /><br> 
   <p>    <s:submit         value="SignIn"/> <br>            
</s:form>

относительный код в struts.xml

<action name="login" class="com.ActionClasses.LoginAction">
   <result name="success"   type="tiles">welcome    </result>
   <result name="login" type="tiles">login      </result>
   <result name="input" type="tiles">login      </result>
</action>

LoginAction.java

public class LoginAction  extends ActionSupport implements Action, ModelDriven<LoginBeans>{

LoginBeans loginBeans = new LoginBeans();
.
.
.
    @Override
public LoginBeans getModel() {      
    return loginBeans;
}

LoginBeans.java

public class LoginBeans {
private String username;
private String password;
//getters and setters
}

Это все работает нормально, и бобы заполняются. Теперь взгляните на регистрацию пользователя.

registerOphthalmologist.jsp

<s:form action="registerOphthalmologist" method="post">     
    <s:hidden       key="role"          label="role"    value="O"       />
    <s:textfield    key="username"      label="Choose UserName" required="true"/>
    <s:password     key="password"      label="Choose Password" required="true"/>

    <s:textfield    key="givenName"     label="Name"    required="true"/>
    <s:textfield    key="surname"       label="Surname" required="true"/>
    <s:textfield    key="age"           label="Age"     required="true"     value=""/>
    <s:select       key="gender"        label="Gender"  
                        list="#{'M':'Male','F':'Female'}" 
                        required="true"/>

    <s:textfield    key="contactNumber"     name="contactNumber"    label="Contact Number"  required="true"/>
    <s:textfield    key="email"             name="email"            label="email"           required="true"/>
    <s:textfield    key="city"              name="city"             label="City"            required="true"/>
    <s:textfield    key="district"          name="district"         label="District"        required="true"/>
    <s:textfield    key="state"             name="state"            label="State"           required="true"/>
    <s:textfield    key="country"           name="country"          label="country"         required="true"/>
    <s:textfield    key="postalCode"        name="postalCode"       label="Postal Code"     required="true"/>

    <s:textfield    key="degree"            label="Qualification"           required="true"/>
    <s:textfield    key="university"        label="University"              required="true"     value=""/>
    <s:textfield    key="hospitalName"      label="Hospital Name"           required="true"/>
    <s:textfield    key="experience"        label="Years of Experience"     required="true"     value=""/>

    <s:checkbox     key="checkMe"       label="Agree to terms & Conditions"/>
        <s:submit       value="Register"    align="center"/>

</s:form>

относительный код в struts.xml

<action name="register*" class="com.ActionClasses.RegisterAction">
   <result name="success"   type="tiles">   home        </result>
   <result name="input" type="tiles">   register{1} </result>
   <result name="error" type="tiles">   register{1} </result>
</action>

RegisterAction.java

public class RegisterAction extends ActionSupport implements Action,ModelDriven<RegisterBeans>
{
RegisterBeans registerBeans = new RegisterBeans();  
.
.
.
    @Override
public RegisterBeans getModel() {
    // TODO Auto-generated method stub
    return registerBeans;
}

RegisterBeans.java

public class RegisterBeans extends ActionSupport{

private String username;
private String password;
private char role;
private boolean checkMe;

private String givenName;
private String surname;
private int age;
private char gender;

private String hospitalName;
private String institute;
private String university;
private String degree;
private int experience;
private int research;
private int ophthalmologists;

private String contactNumber;
private String email;
private String city;
private String district;
private String state;
private String country;
private String postalCode;
//getters and setters
}

Эти бобы не заполняются. Какую ошибку я здесь делаю? Мой полный файл 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>
<package name="default" extends="struts-default">

    <result-types>
        <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
    </result-types>

    <action name="*Link" method="{1}" class="classes.HomeLinks">
        <result name="home"     type="tiles">home   </result>
        <result name="upload"   type="tiles">upload     </result>
        <result name="register" type="tiles">register   </result>
        <result name="login"    type="tiles">login      </result>
    </action>

    <action name="login" class="com.ActionClasses.LoginAction">
        <result name="success"  type="tiles">welcome    </result>
        <result name="login"    type="tiles">login      </result>
        <result name="input"    type="tiles">login      </result>
    </action>

    <action name="logout" class="com.ActionClasses.LogoutAction">
        <result name="success"  type="tiles">home</result>
    </action>

    <action name="register" class="classes.SpecificRegistrations">
        <result name="Ophthalmologist"  type="tiles">   registerOphthalmologist </result>
        <result name="practitioner"     type="tiles">   registerPractitioner    </result>
        <result name="Researcher"       type="tiles">   registerResearcher      </result>
        <result name="Hospital"         type="tiles">   registerHospital        </result>
        <result name="input"            type="tiles">   register                </result>
    </action>

    <action name="register*" class="com.ActionClasses.RegisterAction">
        <result name="success"  type="tiles">   home        </result>
        <result name="input"    type="tiles">   register{1} </result>
        <result name="error"    type="tiles">   register{1} </result>
    </action>

    <action name="upload" class="com.ActionClasses.UploadAction">
        <interceptor-ref name="fileUpload">
            <param name="maximumSize">3145728</param>
            <param name="allowedTypes">image/png,image/gif,image/jpeg,image/pjpeg, image/jpg</param>
        </interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref>
        <result name="success"  type="tiles">   uploaded    </result>
        <result name="error"    type="tiles">   upload      </result>
    </action>
</package>
</struts>

1 ответ

Потенциальная ошибка:

Удалить extends ActionSupport от твоего

public class RegisterBeans extends ActionSupport{

декларация. В некоторых обстоятельствах это будет рассматриваться как Действие, а это не то, что вы хотите.

Предупреждения:

  1. Избегать использования key атрибут, если вы указываете label а также value тоже используй name вместо. Согласно документам, это

    Установите ключ (имя, значение, метка) для этого конкретного компонента

  2. Всегда указывайте пространство имен как в конфигурации <s:form> атрибут, не очень хорошо работать только с пространством имен по умолчанию.

  3. Будьте осторожны с required="true" атрибутов; он работает в старых версиях Struts, но после перехода на более новую версию он был изменен наrequiredLabel, и с тех пор <s:textfield /> поддерживает динамические атрибуты, они будут отображаться на странице так же, как это (required="true"), а затем интерпретируется браузерами как HTML5 required="required" атрибут, что делает все поля обязательными и без * символ впереди Я встречал это вчера во время переноса старого проекта, это очень раздражает.

  4. Для согласованности объект, представляющий один компонент, должен называться LoginBean или же RegisterBean вместо формы множественного числа LoginBeans или же RegisterBeans, То же самое для переменных экземпляра, вы должны использовать форму множественного числа, только когда это массив, коллекция и т. Д.

  5. ActionSupport определяется как

    public class ActionSupport implements Action, Validateable, ValidationAware, 
                                      TextProvider, LocaleProvider, Serializable {
    

    поэтому его расширение и реализация интерфейса Action являются излишними.

Другие вопросы по тегам