2012-11-05 5 views
22

Ho una forma con due ModelAttributes uno è cittadino e l'altro è una punizione. I due oggetti sono separati da linguette jquery. Sto riscontrando problemi nel visualizzare correttamente gli elementi sul modulo, alcuni vengono visualizzati e altri no. Intendo gli elementi html.Spring MVC ModelAttribute multipla Sulla stessa forma

io non sono sicuro di come il controller sarebbe guardare quando non v'è più ModleAttributes sulla pagina. Sotto è un esempio del codice:

Pagina

<title>Citizen Registration</title> 

    </head> 

    <body> 
     <div id="tabs"> 

     <ul> 
      <li><a href="#tab1">Citizen Registration</a></li> 
      <li><a href="#tab2">Punishment</a></li> 
     </ul> 


     <div id="tab1"> 
      <form:form id="citizenRegistration" name ="citizenRegistration" method="post" modelAttribute="citizens" action="citizen_registration.htm"> 
       <div id="divRight" class="mainDiv">    
        <div class="divGroup" id="divCharInfo"> 
        <fieldset> 
        <legend>Characteristics Info</legend> 
          <ol>  
           <li><form:label for="photo" path="photo">Select Photo</form:label> 
            <form:input path="photo" type="file" id="photo" title="Upload a photo"/><form:errors path="photo" id="errors"/></li> 

           <li> 
            <label>Select Gender</label> 
            <form:select path="genderId" id="genderId" title="Select Your Gender"> 
            <form:options items = "${gender.genderList}" itemValue="genderId" itemLabel="genderDesc" /> 
            </form:select> 
            <form:errors path="genderId" class="errors"/> 
           </li>    

           <li><form:label for="weight" path="weight">Enter Weight <i>(lbs)</i></form:label> 
            <form:input path="weight" id="weight" title="Enter Weight"/><form:errors path="weight" id="errors"/> 
           </li> 

           <li><form:label for="height" path="height">Enter Height <i>(feet)</i></form:label> 
            <form:input path="height" id="height" title="Enter Height"/><form:errors path="height" id="errors"/> 
           </li> 
               ....................... 


      <div id="tab2"> 
       <form:form id="punishmentRegistration" name ="punishmentRegistration" method="post" modelAttribute="punishment" action="punishment_registration.htm"> 

       <ol> 
        <li> 
         <form:label for ="punishmentId" path="punishmentId">Punishment Number</form:label> 
         <form:input path="punishmentId" id="punishmentId"/><form:errors path="punishmentId" id="errors"/>     
        </li> 

        <li> 
         <form:label for="crimeRecNo" path="crimeRecNo">Select Crime</form:label> 
         <form:select path="crimeRecNo" id="CrimeRecNo" title="Select Crime"> 
         <form:options items = "${crime.crimeList}" itemValue="crimeRecNo" itemLabel="crimeRecNo" title="crimeDesc"/> 
         </form:select> 
         <form:errors path="crimeRecNo" id="errors"/> 
        </li> 

        <li> 
         <form:label for ="monitoringStDate" path="monitoringStDate"> Start Date </form:label> 
         <form:input path="monitoringStDate" id="monitoringStDate"/><form:errors path="monitoringStDate" id="errors"/>     
        </li> 


        <li> 
         <form:label for ="monitoringEnDate" path="monitoringEnDate"> End Date </form:label> 
         <form:input path="monitoringEnDate" id="monitoringEnDate"/><form:errors path="monitoringEnDate" id="errors"/>     
        </li>     
       </ol>    

       </form:form>    
      </div>      

     </div> 

    </body> 
</html> 

controller

@RequestMapping(value="citizen_registration.htm", method = RequestMethod.GET) 
    public ModelAndView loadPage(HttpServletRequest request, 
           HttpServletResponse response, 
           @ModelAttribute Citizens citizens, @ModelAttribute Punishment punishment, 
           BindingResult result, 
           ModelMap m, Model model) throws Exception { 

//code here 

return new ModelAndView("citizen_registration"); 

Questo è il mio codice tuttavia quando faccio funzionare nulla in tab2 viene visualizzato enon tutti gli elementi in tab1 è mostrato.

risposta

26

Non credo se è possibile associare più modelli utilizzando il modulo Spring. In realtà dovresti dare un'occhiata nella forma vincolante della molla. http://static.springsource.org/spring/docs/1.1.5/taglib/tag/BindTag.html Date un'occhiata nel codice di esempio. Non ho testato il codice. Informalo in caso di problemi.

Modello

public class User{ 

private String username; 
private String password; 

..Setter and Getters 
} 

public class UserProfile{ 
private String firstName; 
private String lastName; 

setter and getter 
} 

controller

@Controller 
public class MyController{ 
    @RequestMapping(....) 
    public String newAccountForm(ModelMap map){ 
     User user = new User(); //Would recommend using spring container to create objects 
     UserProfile profile = new UserProfile(); 

     map.addAttribute('user', user); 
     map.addAttribute('profile', profile); 

     return "form" 
    } 




    @RequestMapping(....) 
     public String newAccountForm(@ModelAttrbite('User')User user, BindingResult resultUser, @ModelAttribute('UserProfile')UserProfile userProfile, BindingResult resultProfile){ 

//Check the binding result for each model. If not valid return the form page again 
//Further processing as required. 

     } 
    } 

JSP

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"> 

<form action="" method="post"> 

<spring:bind path="user.username"> 
    <input type="text" name="${status.expression}" value="${status.value}"><br /> 
     </spring:bind> 

<spring:bind path="user.password"> 
    <input type="password" name="${status.expression}" value="${status.value}"><br /> 
     </spring:bind> 

<spring:bind path="profile.firstName"> 
    <input type="text" name="${status.expression}" value="${status.value}"><br /> 
     </spring:bind> 
<spring:bind path="profile.lastName"> 
    <input type="text" name="${status.expression}" value="${status.value}"><br /> 
     </spring:bind> 

<input type="submit" value="Create"/> 
</form> 
+1

e se crei una classe che fa riferimento a queste due classi funzionerà? – devdar

+1

Beh, se si vuole andare lungo le forme primaverili standard. Quindi per associare più modelli è possibile creare una classe modulo contenente i modelli. Ma ho trovato più semplice la forma di rilegatura a molla in quanto eliminano il requisito di implementare una classe extra. Inoltre, la convalida per ciascun modello può essere eseguita separatamente. Inoltre, fornisce anche la funzionalità per associare i modelli annidati. –

+0

Capisco cosa stai dicendo cosa consiglieresti di usare solo moduli separati? – devdar

1

Ho già dato approccio alternativo a questo link here

<form:form method="POST" modelAttribute="applicationGeneralInformation"> 
    <div class="section2"> 
    <h2>General Informaion</h2> 

    <form:input type="hidden" path="id" id="id"/> 
    <label for="app_version">Version</label>: <form:input type="text" id="app_version" path="version"/><br/> 
    <label for="app_func_desc">Description</label>: <form:input type="text" id="app_func_desc" 
                     path="functionalDescription"/><br/> 
    <label for="app_sec_func">Functions</label>: <form:input type="text" id="app_sec_func" 
                    path="securityFunctions"/><br/> 

</div> 
<div class="section2"> 
    <h2>Application Content</h2> 
    <form:form method="POST" modelAttribute="applicationContent"> 
    <div> 
     <h3>CIA Rating</h3> 
     <label for="CIARating">CIA Rating</label>: <form:select type="text" id="CIARating" path="CIARating"> 
     <form:option value="1">1</form:option> 
     <form:option value="2">2</form:option> 
     <form:option value="3">3</form:option> 
     <form:option value="4">4</form:option> 
    </form:select><br/><br/> 
    </div> 
    <div> 
     <h3>Business Continuity and Disaster Recovery</h3> 
     <div> 
      <h4>RTO</h4> 
      <label for="RTO">RTO</label>: <form:select type="text" id="RTO" path="RTO"> 
      <form:option value="1">< 2<sub>Hrs</sub></form:option> 
      <form:option value="2">2<sub>Hrs</sub>-4<sub>Hrs</sub> </form:option> 
      <form:option value="3">4<sub>Hrs</sub>-48<sub>Hrs</sub></form:option> 
      <form:option value="4">> 48<sub>Hrs</sub></form:option> 
     </form:select><br/> 
     </div> 
     <div> 
      <h4>RPO</h4> 
      <label for="RPO">RPO</label>: <form:input type="text" id="RPO" path="RPO"/><br/> 
     </div> 
    </div> 
    </form:form> 
    <input type="submit" value="Submit"> 
</div> 
</form:form>