web-dev-qa-db-ja.com

ArrayListをコントローラーに返すSpring MVC

私は春が初めてです。ユーザーとともにリストを表示します。すべての行には、ユーザーを削除するためのチェックボックスがあります。

コントローラ:

@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>

リストは正しくレンダリングされます。 「ユーザーの削除」ボタンを押した場合。 @modelAttributeユーザーは空です。また、新しいクラスでリストをラップしようとしましたが、同じ結果が得られます。

何か案は?

9
user1449511

Jspからモデル属性へのフォームデータバインディングが発生しないため、ModelAttributeは空です。コレクションをバインドするためのSpringサンプル " http://developer.ucsd.edu/develop/user-interface/building-a-form/form-b​​inding-with-collections.html " 。これは理解するのに役立ちます。

Springアプリケーションのほとんどは、通常、form:inputと「path」を使用します。データバインディングを行うパラメータ。

5
minion

ミニオンのおかげで、答えが見つかりました

ラッパー:

public class UserListWrapper {

private ArrayList<User> users;

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

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

コントローラ:

@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;

}

}

見る:

<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>

ありがとうございました!

編集:表示していないフィールドも追加することを忘れないでください。

例えば:

IDを追加しないと、返されたUserオブジェクトのIDはNULLになるため、削除は機能しません。

7
user1449511

Spring-mvc selectタグを中心に機能を構築する必要があります。ただし、変更はほとんどありません。リストをPOJOクラスにプッシュします。

public class FormBean {

    private List<String> users;

    public FormBean() {

    }

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

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

マッピングを変更します

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

最後に、c:forEachをスプリングselectタグと交換します。

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

これは、ビューでリダイレクトを使用しているためです。 Flash属性をご覧ください。

更新されたリストを取得できるはずです:)

0
user4584346