2012-11-05 12 views
22

Mam formularz z dwoma atrybutami Modelu, jeden z nich to obywatele, a drugi to kara. Te dwa obiekty są oddzielone kartami jquery. Mam problemy z wyświetlaniem elementów w formularzu, aby wyświetlać poprawnie niektóre są wyświetlane, a inne nie. Mam na myśli elementy html.Spring MVC Multiple ModelAttribute Na tym samym formularzu

Nie jestem pewien, jak wyglądałby kontroler, gdy na stronie znajduje się wiele ModleAttributes. Pod jest próbka kodu:

Page

<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"); 

To jest mój kod jednak gdy uruchamiam go nic w Karta2 jest wyświetlany oraznie wszystkich elementów wyświetla się tab1.

Odpowiedz

26

Nie sądzę, że można powiązać wiele modeli za pomocą formularza Spring. W rzeczywistości powinieneś rzucić okiem na wiosenną formę wiążącą. http://static.springsource.org/spring/docs/1.1.5/taglib/tag/BindTag.html Zobacz przykładowy kod. Nie testowałem kodu. Poinformuj o wszelkich problemach.

model

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

co będzie, jeśli utworzysz jedną klasę, która odwołuje się do tych dwóch klas? – devdar

+1

Dobrze, jeśli chcesz iść wzdłuż standardowych form sprężynowych. Następnie, aby powiązać wiele modeli, możesz utworzyć klasę formularzy zawierającą modele. Zauważyłem jednak, że sprężysta forma wiązania jest łatwiejsza, ponieważ eliminują wymóg wdrożenia dodatkowej klasy. Ponadto walidację dla każdego modelu można wykonać osobno. Zapewnia również funkcję do wiązania modeli zagnieżdżonych. –

+0

Rozumiem, co mówisz, co poleciłbyś po prostu użyć oddzielnych formularzy? – devdar

1

już dał alternatywnego podejścia w ten 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> 
Powiązane problemy