powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / spring mvc, коллекции и command object
5 сообщений из 5, страница 1 из 1
spring mvc, коллекции и command object
    #37842005
tepka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги,
Попробую без лишних слов описать суть проблемы.
1) Есть доменный объект SomeBean.
2) Есть сервер-сайд который по определенным критериям дёргает из базы коллекцию объектов List<SomeBean>
3) Надо jsp которая в цикле выводит всю коллекцию SomeBean'ов юзеру в браузер с возможностью редактирования полей каждого объекта SomeBean.
4) Надо contller который получит от jsp этот самый модифицированный юзером List<SomeBean>

Кагбэ мне красивенько реализовать 3 и 4ый пункты?

PS.
Я знаю, что стандартное решение это обернуть коллекцию List<SomeBean> в какой нить другой объект например SomeListBean, дать ему один метод сеттера и один геттера и одно поле. Нечто типа такого
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class SomeListBean{    
    private List<SomeBean> someListBean

    public  List<SomeBean> getList() {
        return  List<SomeBean>;
    }

    public  void setList(List<SomeBean> someListBean) {
        this.someListBean = someListBean;
    }
}



Мне подобное решение кажется костыльным (писать прокси-объект, под коллекцию-объект, для работы с объектом из коллекции). А в случаи если у меня будет много различных коллекций, например List<SomeBean1> и List<SomeBean2> и List<SomeBeanХ> мне под каждый придётся писать свою обёртку?
Нет ли какого то другого способа реализации довольно таки штатного функционала?
...
Рейтинг: 0 / 0
spring mvc, коллекции и command object
    #37842046
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ух, так выразился - "доменный объект" - пришлось полезть в википедию, чтобы убедиться в том, что это то, что я думаю. Одним словом, DTO бизнес-модели. За "сервер-сайд" не полез, посмеялся так. Так что, считай, "без лишних слов" не получилось ... (сорри за лирическое отступление).
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Controller
public class SomeController {
	@RequestMapping(value = "editBeanList")
	public ModelAndView editBeanList() {
		List<SomeBean> beans = yourDAO.getBeans();
		ModelAndView result = new ModelAndView("your_jsp.jsp");
		result.addObject("beans", beans);
		return result;
	}
}


Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?xml version="1.0" encoding="UTF-8"?>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="core" %>
<!DOCTYPE html>
<html>
...
	<form action="your_mapping">
<core:forEach items="${beans}" var="bean">
		field 1: <input type="text" value="${bean.field1}" name="${bean.field1}_${bean.id}"/>
		field 2: <input type="text" value="${bean.field2}" name="${bean.field2}_${bean.id}"/>
</core:forEach>
		<input type="hidden" value="${beans.size()}" name="beanListLength"
		<button type="submit" name="submit"/>
	</form>
</html>


И в том же SomeController можно обработать форму:
Код: java
1.
2.
3.
4.
5.
6.
	@RequestMapping(value = "your_mapping")
	public ModelAndView editBeanList(HttpServletRequest request) {//можно сделать сложный маппинг для удобства, в т.ч. @RequestParam
		int beanListLength = Integer.parseInt(request.getParameter("beanListLength"));
		// дальше можно либо получить Enumeration имен параметров и в цикле их обработать
		// либо по очереди брать со списка List<SomeBean> и из реквеста вытягивать значение, коответствующее параметрам бина
	}

В общем, пример примитивненький, его можно обыграть чуть "веселее", автоматизации, что ли, добавить, но принцип все равно останется похожим - модель кидаем представлению, а по команде из вьюшки в контроллере обрабатываем измененную полученную модель. Единственное - писал тут ручками, поэтому сильно примитивизировал обработку в контроллере - типа, для лучшего понимания (а можно пользоваться моделью - облегчает работу).
...
Рейтинг: 0 / 0
spring mvc, коллекции и command object
    #37842061
tepka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IDVsbruckУх, так выразился - "доменный объект" - пришлось полезть в википедию, чтобы убедиться в том, что это то, что я думаю.
простите) Я не профессиональный разработчик, разработка моё хобби и просто на форумах использую терминологию учебников. В спринге почему то такие объекты в документациях называют доменные объекты. В учебниках hibernate сущности базы данных. Вообще я не знаю как такие объекты называют люди)
Ваш подход интересный тем что очень простой и понятный и кагбэ выглядящий очевидным) и я его в ряде своих контроллеров использую (правда до конца не понятно, зачем вы дёргаете beanListLength, можно обойтись и без него, но это мелочи)

Но к сожалению ваш подход тоже костыльный) Вы пихаете в JSP коллекцию объектов(List<SomeBean>), далее получается параметры из HttpServletRequest и заново конструируете коллекцию объектов(List<SomeBean>). Что не правильно ИМХО. Ибо парсить regexp'ами параметр name="${bean.field1}_${bean.id}" попахивает индус-кодом) а представ те, что у меня таких полей 20 штук. И каждое надо парсить, а если дальше фантазировать то как правило в любых проектах не один доменный объект используется, а как правило десятки и сотни, в некоторых энтырпрайз решениях я видел базы данных на тысячи таблиц, т.е. 1000и доменных объектов. А в один прекрасный момент я решил добавить(или изменить) в объект SomeBean еще одно поле. В таком же коде никто ни в жизть не разберется и даже я, писавший пол года этот код)
Есть же прекрасный атрибут как то @ModelAttribute и command object в хтмл теге FORM. Он позволяет обойти момент ручного парсинга полей что пришли из HttpServletRequest.
...
Рейтинг: 0 / 0
spring mvc, коллекции и command object
    #37842078
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruckВ общем, пример примитивненький, его можно обыграть чуть "веселее", автоматизации, что ли, добавить, но принцип все равно останется похожим - модель кидаем представлению, а по команде из вьюшки в контроллере обрабатываем измененную полученную модель. Единственное - писал тут ручками, поэтому сильно примитивизировал обработку в контроллере - типа, для лучшего понимания (а можно пользоваться моделью - облегчает работу).
А это я, по-твоему, для чего написал? Естественно, свою задачу я бы тоже так не решал. Я изобразил подход, а не готовое решение. Судя по "вступительному слову" и задаче, глубоким профи не очень пахнет, поэтому и предложение максимально "расжеванное".

А готового решения "оправил коллекцию - получил коллекцию" нет. Все равно надо производить определенные телодвижения. Это может быть формирование коллекции средствами javascript/xml, тогда работа на сервере будет очень простая. Это может быть решение с помощью продуктов типа DWR, Hessian(?), которые фактически могут работать на клиенте с бинами (через сериализацию/десериализацию).

Костыль - "средство добавления недостающей функциональности или исправления серьёзных дыр без должного редизайна системы" (Луркоморье). Предложенный вариант - это не костыль, а низкоуровневое решение. Любое решение, которое найдешь ты или тебе посоветуют, так или иначе базируется на подобном - веб слишком несовершенен, а обмениваться с клиентом мы можем только строками. Другое дело, что высокоуровневые фреймворки прячут и сами делают черную работу типа сериализации/десериализации. Но это другой вопрос. А в общем, сам был бы рад увидеть вариант решения с единственным параметрам метода, принимающем, скажем, коллекцию исправленных бинов :) (понятно, без цепочки рутинных фильтров и интерцепторов).

P.S. beanListLength - остаток от кода, который я кропал, а затем удалил. Можно игнорировать.
...
Рейтинг: 0 / 0
spring mvc, коллекции и command object
    #37842083
tepka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IDVsbruckно принцип все равно останется похожим - модель кидаем представлению, а по команде из вьюшки в контроллере обрабатываем измененную полученную модель.
Да ваш принцип катит, но в с очень небольшими коллекциями объектов. А у меня SomeBean из ~30 полей. Да и нет уверенности что эти 30 полей вдруг не станут 29 полями или 35 полями.

IDVsbruckА готового решения "оправил коллекцию - получил коллекцию" нет.
формально готовое решение есть. С одним "но", отправить не коллекцию, а объект-обёртку коллекции и получить объект-обёртку уже измененный коллекции. Задача именно в том, чтобы избавится от лишнего звена т.е. объекта-обёртки. Примерно такое вот решение есть.
http://mattfleming.com/node/134
Я бы правда в примере сделал бы чутка по другому обёртку. Скажем сделал бы одну обёртку для любых коллекций.
Обёртку можно вот так примерно налобать
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class WrapperList {
    private List list;
    
    public WrapperList(List list){
        this.list = list;
    }

    public void setList(List list){
        this.list = list;
    }

    public List getList(){
        return this.list;
    }
}
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / spring mvc, коллекции и command object
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]