2015-02-19 17 views
7

Sono nuovo alla primavera. Visualizzo un elenco con gli utenti. Ogni riga ha una casella di controllo per rimuovere gli utenti.Spring MVC passando ArrayList indietro al controller

Controller:

@Controller 
public class AdminController { 

    @Autowired 
    private UserDao userDao; 

    @RequestMapping(value = "/admin", method = RequestMethod.GET) 
    public ModelAndView adminPage() { 
     ModelAndView model = new ModelAndView(); 
     model.addObject("users", userDao.findAll()); 
     model.setViewName("admin"); 
     return model; 

    } 

    @RequestMapping(value = "admin/remove", method = RequestMethod.POST) 
    public ModelAndView removeUser(@ModelAttribute(value = "users") ArrayList<User> users) { 
     ModelAndView model = new ModelAndView(); 
     //UPDATE USERS HERE 
     model.setViewName("redirect:/admin"); 
     return model; 

    } 

JSP:

<form:form action="/admin/remove" method="POST" modelAttribute="users"> 
      <table class="table table-striped"> 
       <thead> 
        <tr> 
         <th>Firstname</th> 
         <th>Lastname</th> 
         <th>Email/login</th> 
         <th>Profession</th> 
         <th>Select<th> 
        </tr> 
       </thead> 
       <tbody> 
        <c:forEach var="user" items="${users}"> 
         <tr> 
          <td>${user.firstName}</td> 
          <td>${user.lastName}</td> 
          <td>${user.login}</td> 
          <td>${user.profession}</td> 
          <td><input type="checkbox" value="${user.delete}"/></td> 
         </tr> 
        </c:forEach> 
       </tbody> 
      </table>    
      <input type="submit" value="Delete user(s)" class="btn-danger" /> 
      <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> 
      </form:form> 

L'elenco è reso correttamente. Se premo il pulsante "Elimina utente/i". Gli utenti di @modelAttribute sono vuoti. Ho anche provato a completare l'elenco in una nuova classe, ma ottengo gli stessi risultati.

Qualche idea?

risposta

0

Questo perché si sta utilizzando un reindirizzamento: nella visualizzazione. Dai un'occhiata a Flash Attributi:

Si dovrebbe essere in grado di ottenere l'elenco aggiornato :)

+0

Sono i dati prima del reindirizzamento vuoto. vedi "// AGGIORNA UTENTI QUI" nel controller. – user1449511

+0

Questa non è una risposta valida per la domanda. Dai un'occhiata alla mia risposta come perché è vuota. – minion

+0

Il mio male. Ho interpretato erroneamente il tuo problema, mi spiace :( –

1

Si dovrebbe costruire la funzionalità intorno a primavera-mvc selezionare il tag. Poche modifiche sarebbero comunque nell'ordine, spingete un elenco a una classe POJO, ad es.

public class FormBean { 

    private List<String> users; 

    public FormBean() { 

    } 

    public List<String> getUsers() { 
     return users; 
    } 

    public void setUsers(List<String> users) { 
     this.users = users; 
    } 
} 

cambiare la vostra mappatura per

@RequestMapping(value = "admin/remove", method = RequestMethod.POST) 
    public ModelAndView removeUser(@ModelAttribute(value = "formBean") FormBean formBean) { 

infine, scambi il vostro c: forEach con molle selezionare tag, in modo da qualcosa come

<form:form action="/admin/remove" method="POST" modelAttribute="formBean"> 
    ... 
<form:select path="users" items="${users}" multiple="true" /> 
    ... 
</form> 
6

Grazie a minion, ho trovato la risposta

Wrapper:

public class UserListWrapper { 

private ArrayList<User> users; 

public ArrayList<User> getUsers() { 
    return users; 
} 

public void setUsers(ArrayList<User> users) { 
    this.users = users; 
} 

Controller:

@Controller 
public class AdminController { 

@Autowired 
private UserDao userDao; 

@RequestMapping(value = "/admin", method = RequestMethod.GET) 
public ModelAndView adminPage() { 
    ModelAndView model = new ModelAndView(); 
    UserListWrapper wrapper = new UserListWrapper(); 
    wrapper.setUsers(new ArrayList<User>(userDao.findAll())); 
    model.addObject("userListWrapper",wrapper); 

    model.setViewName("admin"); 
    return model; 

} 

@RequestMapping(value = "admin/remove", method = RequestMethod.POST) 
public ModelAndView removeUser(@ModelAttribute(value = "userListWrapper") UserListWrapper userListWrapper) { 
    ModelAndView model = new ModelAndView(); 
    userDao.removeFlaggedUsers(userListWrapper.getUsers()); 
    model.setViewName("redirect:/admin"); 
    return model; 

} 

}

Vista:

<form:form action="/admin/remove" method="POST" modelAttribute="userListWrapper"> 
     <table class="table table-striped"> 
      <thead> 
       <tr> 
        <th>First name</th> 
        <th>Last name</th> 
        <th>Email/login</th> 
        <th>Profession</th> 
        <th>Select<th> 
       </tr> 
      </thead> 
      <tbody> 
       <c:forEach varStatus="us" var="user" items="${userListWrapper.users}" > 
        <tr> 
         <td><form:input type="hidden" path="users[${us.index}].firstName"/>${user.firstName}</td> 
         <td><form:input type="hidden" path="users[${us.index}].lastName"/> ${user.lastName}</td> 
         <td><form:input type="hidden" path="users[${us.index}].login"/>${user.login}</td> 
         <td><form:input type="hidden" path="users[${us.index}].profession"/>${user.profession}</td> 
         <td><form:checkbox path="users[${us.index}].delete" value="${user.delete}"/></td> 
     <form:input type="hidden" path="users[${us.index}].id"/> 
        </tr> 
       </c:forEach> 
      </tbody> 
     </table>    
     <input type="submit" value="Delete user(s)" class="btn-danger" /> 
     <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> 
     </form:form> 

Grazie!

MODIFICA: non dimenticare di aggiungere anche i campi che non vengono visualizzati.

Ad esempio:

Se non aggiungere l'ID, la tua eliminazione non funzionerà perché l'id nell'oggetto utente restituito sarà NULL.

+0

Puoi accettarlo come risposta: ho fornito il link invece di fornire direttamente la risposta in quanto sarà utile per capire il flusso di rilegatura. – minion

Problemi correlati