Spring MVC как обрабатывать привязку при редактировании объектов

Я как бы новичок в Spring MVC - до сих пор видел множество руководств, но только начал разработку. Я только что столкнулся с этой проблемой:

РЕЗЮМЕ: у меня есть форма с таблицей, содержащей множество пользователей, загруженных из БД и поддерживаемых в модели Spring. Я хочу иметь кнопку редактирования для каждого пользователя, и я хочу вызвать другую форму, чтобы отредактировать этого пользователя, и при этом, чтобы этот пользователь поддерживался в модели, поэтому мне не нужно раскрывать идентификаторы или сопоставлять пользователей со случайными ключами .

У меня есть объект List<User>, который я извлекаю из базы данных с помощью bean-компонента @Service, а затем передаю этот список своему UserController bean-компоненту. Затем в моем контроллере:

@RequestMapping(value="/users", method = RequestMethod.GET)
public ModelAndView showUsers() {       
    List<User> users = userService.getUserList(); //Get from DB. Returns some users.
    UserSet uset = new UserSet(); //Custom object backing the list.
    uset.setUserList(users);

    return new ModelAndView("users", "userset", uset);
}

Это возвращает представление users.jsp и отображает список пользователей в таблице с использованием формы:

<form:form action="#" method="post" modelAttribute="userset">
    <table>
        <tr>
            <th>N.</th>
            <th>Name</th>
            <th>Email</th>
        </tr>
        <c:forEach var="user" items="${userset.userList}"
            varStatus="status">
            <tr>
                <td align="center">${status.count}</td>
                <td><input name="userList[${status.index}].name"
                    value="${user.name}" id="name_${status.index}" /></td>
                <td><input name="userList[${status.index}].email"
                    value="${user.email}" id="email_${status.index}" /></td>
                <td><input type="button" value="Ed." id="edbtn${status.index}"
                    class="edbtn" /></td>
            </tr>
        </c:forEach>
    </table>
    <input type="submit" value="Save" />
</form:form>

Теперь вы можете видеть, что есть кнопка редактирования <input type="button" value="Ed." id="edbtn${status.index}" class="edbtn" /> для каждого пользователя. Что я хочу сделать, так это создать новую однопользовательскую форму, когда я нажимаю на эту кнопку, и привязать к ней мой объект User, чтобы, если я изменю имя и адрес электронной почты, я все равно смогу получить идентификатор на на стороне сервера, чтобы обновить его в базе данных. В приведенной выше многопользовательской форме все поля должны быть отключены или отображаться как ярлыки - я не хочу ничего менять; Я просто хочу показать их там и иметь кнопку для открытия всплывающего или плавающего div с фактической однопользовательской формой внутри.

Кстати, я пытаюсь захватить редактируемого пользователя с помощью следующего контроллера:

@RequestMapping(value="users/edit", method = RequestMethod.POST)
public String edit(@ModelAttribute(value="user") User user, BindingResult bresult) {
    /* Do something here with the user */
    /* Currently the ID returned from user.getId() is null, but the original user shown in the form has an ID != null */
    return "redirect:/users";
}

И я отправляю запрос на редактирование через jQuery:

jq("#edituserbtn").click(function() {
        jq.post("users/edit", {
            name : jq("#edfrm_n").val(),
            email : jq("#edfrm_e").val(),
        }, function(data, status) {
            //jq("#changing").text(data + "; " + status);
        });
    });

Обратите внимание, что #edfrm_n и #edfrm_e будут идентификаторами той однопользовательской формы, которую я хочу использовать здесь, вместо того, чтобы отправлять обратно всю форму. Используя jQuery, я бы также открыл эту однопользовательскую форму и поместил ее поверх всего в середине экрана.

Как этого добиться?

P.S .: Возможно, это не лучший подход для функции редактирования. В таком случае я был бы очень признателен, если вы дали мне несколько советов.

Спасибо


person Azurlake    schedule 20.03.2013    source источник
comment
Как Spring может узнать, какого пользователя вы редактируете, если вы этого не сообщите? Вы должны отправить хотя бы некоторую информацию.   -  person a better oliver    schedule 03.07.2013


Ответы (2)


Я думаю, вам следует изменить существующий код. Вы должны установить идентификатор пользователя как значение кнопки редактирования пользователя, вы можете написать функцию js, аргументами которой являются идентификатор пользователя, имя пользователя и статус. привяжите его к кнопкам. когда вы нажимаете кнопку редактирования, запускается функция js и появляется новый диалог в этом диалоговом окне, в котором вы можете получить три аргумента и показать их. Диалог Я рекомендую вам использовать диалог jQuery, поскольку вы добавили библиотеку jQuery. И вы должны добавить кнопку сохранения в это диалоговое окно, и после редактирования пользовательских данных просто нажмите кнопку сохранения и вызовите ajax для отправки данных на сервер, потому что у него есть идентификатор, чтобы вы знали, какой из них будет обновлен. и сервер вернет статус операции обновления, в функции обратного вызова ajax вы делаете другое со статусом. в случае успеха закройте диалоговое окно и обновите главное окно, в случае неудачи - всплывающее диалоговое окно с предупреждением.

person OQJF    schedule 20.03.2013
comment
Спасибо за ваш комментарий. Это именно то, что я не хочу делать, хотя ... Spring предоставляет способ привязки данных без необходимости распространять свой идентификатор БД повсюду (не важно, скрыт он или нет - они все равно публикуются), поэтому я не ищу такой подход. Это правда, что публикация идентификаторов упрощает задачу - просто запишите этот идентификатор и перейдите в базу данных. Но я говорю о резервных объектах, которые «волшебным образом» связываются с формами представления и другими данными. В любом случае, я ценю ваш ответ :) - person Azurlake; 20.03.2013
comment
Я знаю, что вы сказали, потому что вы используете тег Spring, но поскольку вы используете ajax, в качестве моего эксперимента, это не лучший способ. - person OQJF; 20.03.2013

Ну, я думал, что Spring творит чудеса, а теперь думаю, что нет. Как сказал zeroflagl, Spring должен знать, что вы пытаетесь обновить, поэтому должен быть предоставлен какой-то идентификатор или фактический идентификатор БД.

person Azurlake    schedule 16.04.2014