Заполнение коллекции из запроса через Spring? - PullRequest
2 голосов
/ 20 июля 2010

У меня есть страница, где можно совершить покупку, а также все купленные foos.У меня есть три элемента в HTML-документе, которые анализируются в формате через запятую.

function submitStuff()
{
//grab each cells value from dynamically built table based on user entries
//appending comma
    document.form.ids.value=Ids; 
    document.form.price.value=prices; 
    document.form.qtys.value=qtys; 
    document.form.submit(); 
}

После разделения каждый идентификатор / цена / кол-во должны заполняться объектом ...

public class foo{ 
private int id; 
private BigDecimal price; 
private int qty; 
//set&get;
}

, который может принадлежать другому объекту ...

public class purchase{
private Date date; 
private int buyId;
private List<foo> purchases;
//set&get;
}

Я знаю, что могу просто получить параметры запроса и построить объекты foo один за другим.Я подумал, что есть лучший способ заполнить этот список, пока выполняется привязка данных к объекту покупки, поскольку он правильно заполняет все остальные свойства.

Ответы [ 3 ]

0 голосов
/ 02 декабря 2010

Вам необходимо создать список. Затем создайте покупку и убедитесь, что вы используете метод setter для установки списка foo в покупке, прежде чем привязывать его к форме или добавлять его на карту модели (в зависимости от того, используете ли вы контроллер simpleform или контроллер аннотаций).

0 голосов
/ 07 декабря 2010

Вы можете использовать «родной» механизм привязки Spring.

Пример контроллера:

@Controller
public class OrderController {
    @ModelAttribute("purchase")
    public Purchase getPurchase(@RequestParam("purchase-id") int purchaseId) {
        // create purchase object
    }

    @RequestMapping(...)
    public void processPosting(@ModelAttribute("purchase") Purchase purchase) {
        // process order
    }
}

Пример HTML:

<spring:form commandName="purchase">
    <table>
        <c:forEach var="item" items="${purchase.items}" varStatus="status">
            <spring:nestedPath path="purchase.items[${status.index}]">
                <tr>
                    <td>ID: 8 <form:hidden path="id" />
                    <td>Quantity: 8 <form:text path="quantity" />
                </tr>
            </spring:nestedPath>
        </c:forEach>
    </table>
    <input type="submit" />
</spring:form>

Метод getPurchase() будетВызывается при каждом запросе и предоставляет покупку по умолчанию, которая затем будет заполнена значениями из запроса.Этот метод принимает обычные аннотации, такие как @RequestParam, которые помогут вам создать правильный объект покупки.

Покупка будет доступна в виде атрибута запроса с именем purchase.

.Форма выполняет итерацию по всем элементам покупки и создает вложенный путь, используя индексный доступ к списку приобретенных элементов, поэтому убедитесь, что порядок элементов всегда одинаков!

Параметры запроса будут названы как purchase.items[0].quantity для первого пункта и так далее.Spring свяжет эти имена параметров с атрибутом модели purchase, свойством items, индексом 0, свойством quantity, как обычный путь к свойству.

Надеюсь, это поможет вам в вашей задаче.

0 голосов
/ 20 июля 2010

Помимо конкатенации объекта в один разделенный запятыми параметр и разделения его на стороне сервера (честно говоря, довольно грубый неприятный подход), вы также можете просто отправить несколько значений параметров по одному и тому же параметруназвание.Затем он будет доступен в виде String[] массива HttpServletRequest#getParameterValues() в имени параметра.

Я не делаю Spring, поэтому вот простой ванильный пример HTML / Servlet, чтобы дать идею:

<table>
    <tr>
        <td>ID: 12<input type="hidden" name="id" value="12"></td>
        <td>Qty: <input type="text" name="qty"></td>
        <td>Price: $100.00<input type="hidden" name="price" value="100.00"></td>
    </tr>
    <tr>
        <td>ID: 54<input type="hidden" name="id" value="54"></td>
        <td>Qty: <input type="text" name="qty"></td>
        <td>Price: $200.00<input type="hidden" name="price" value="200.00"></td>
    </tr>
    <tr>
        <td>ID: 8<input type="hidden" name="id" value="8"></td>
        <td>Qty: <input type="text" name="qty"></td>
        <td>Price: $500.00<input type="hidden" name="price" value="500.00"></td>
    </tr>
</table>

Servlet:

String[] ids = request.getParameterValues("id");
String[] qtys = request.getParameterValues("qty");
String[] prices = request.getParameterValues("price");

for (int i = 0; i < ids.length; i++) {
    Long id = Long.parseLong(ids[i]);
    Integer qty = Integer.parseInt(qtys[i]);
    BigDecimal price = new BigDecimal(prices[i]);
    // ...
}

Я, однако, высоковопрос о необходимости отправки цены от клиента к серверу, а также.Я бы предпочел (повторно) рассчитать цену на стороне сервера, поскольку клиент полностью контролирует параметры запроса, которые он отправляет, и, таким образом, может изменять значения параметров вне контроля вашей формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...