Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring MVC. Дублирование параметра запроса после выполнения GET / 23 сообщений из 23, страница 1 из 1
12.10.2016, 22:25
    #39325721
Андрей0407
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Доброе время суток.
Столкнулся со неожиданным поведением при последовательном выполнении GET и POST запросов с одной страницы для Spring MVC. Упрощенный пример, демонстрирующий данное поведение, приложен.
Предусловие
Есть POJO Domain с строковыми свойствами a, b.
Domain.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
package org.springframework.tutorials.getpost.domain;

public class Domain {

    private String a;
    private String b;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }

    public Domain() {}
}



Для данного бина задан контроллер DomainController, позволяющий отображать и редактировать свойства.
Для отображения используется обработчик
Код: java
1.
org.springframework.tutorials.getpost.mvc.DomainController#initView

. Для инициализации формы редактирования -
Код: java
1.
org.springframework.tutorials.getpost.mvc.DomainController#initGet

. Сохранение происходит с использованием POST
Код: java
1.
org.springframework.tutorials.getpost.mvc.DomainController#processPost

.
На странице редактирования есть возможность выполнить GET, который возвращает эту же страницу, но с дополнительной информацией (сложенным значением свойств a и b) -
Код: java
1.
org.springframework.tutorials.getpost.mvc.DomainController#processGet

.
DomainController.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
package org.springframework.tutorials.getpost.mvc;

import org.springframework.stereotype.Controller;
import org.springframework.tutorials.getpost.domain.Domain;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.http.HttpServletRequest;

@Controller
public class DomainController {

    public static final String EDIT_VIEW = "edit";
    public static final String VIEW_VIEW = "view";

    private Domain domain = new Domain();

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String initView(Model model) {
        model.addAttribute("domain", domain);
        return VIEW_VIEW;
    }

    @RequestMapping(value = "/edit", method = RequestMethod.GET)
    public String initGet(Model model, HttpServletRequest request) {
        printName(request);
        model.addAttribute("domain", domain);
        return EDIT_VIEW;
    }

    private void printName(HttpServletRequest request) {
        System.out.println(request.getParameter("a"));
    }

    @RequestMapping(value = "/edit", method = RequestMethod.GET, params = "get")
    public String processGet(Model model, Domain domain, HttpServletRequest request) {
        printName(request);
        model.addAttribute("concat_ab", domain.getA() + domain.getB());
        return EDIT_VIEW;
    }

    @RequestMapping(value = "/edit", method = RequestMethod.POST)
    public String processPost(Domain domain, HttpServletRequest request) {
        printName(request);
        this.domain.setA(domain.getA());
        this.domain.setB(domain.getB());
        return "redirect:/";
    }

}



Редактирование реализовано следующим образом.
edit.jsp
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="s" uri="http://www.springframework.org/tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Edit domain</title>
</head>
<body>
<h2>Edit domain</h2>
<sf:form modelAttribute="domain">
    <table cellspacing="0">
        <tr>
            <th>A:</th>
            <td><sf:input path="a"/></td>
        </tr>
        <tr>
            <th>B:</th>
            <td><sf:input path="b"/></td>
        </tr>
        <tr>
            <td><input name="get" type="submit" value="Get" formmethod="get"/></td>
        </tr>
        <tr>
            <td><input name="post" type="submit" value="Post" formmethod="post"/></td>
        </tr>
    </table>
</sf:form>
<c:if test="${not empty concat_ab}">
    A concat B: <c:out value="${concat_ab}"/>
</c:if>

</body>
</html>



Проблема
Если на форме редактирования вначале выполнить get, а затем - post, то в качестве значений свойств записывается список значений, а не последнее значение, введенное на форме.
Более общий вопрос - является ли подход, при котором форма редактирования может использоваться для отображения дополнительных данных, верным?
Используется Spring 4.2.8.RELEASE, tomcat 7.
Заранее благодарен, извините, если баян.
...
Рейтинг: 0 / 0
13.10.2016, 08:56
    #39325870
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Андрей0407,
Отладчик f12 включал?
...
Рейтинг: 0 / 0
13.10.2016, 10:01
    #39325947
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Запутанно все :( прочитал два раза посмотрел код и не понял в чем проблема :(

попробуйте сделать как в книжках пишут pattern post redirect get

Пример :

http://javastudy.ru/spring-mvc/spring-mvc-pattern-prg-postredirectget/
...
Рейтинг: 0 / 0
13.10.2016, 10:03
    #39325952
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
увидел первое :

в одном теге form не может быть двух тегов submit - это по спецификации .

вариант две формы .
...
Рейтинг: 0 / 0
13.10.2016, 10:04
    #39325954
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
увидел второе modelattribute странная работа в контроллере на во вью

у вас некорректная работа с modelattribute

посмотрите тут

http://www.seostella.com/ru/article/2012/04/24/modelattribute-i-spring-mvc.html
...
Рейтинг: 0 / 0
13.10.2016, 11:22
    #39326050
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Atum1Запутанно все :( прочитал два раза посмотрел код и не понял в чем проблема :(
попробуйте сделать как в книжках пишут pattern post redirect get
Пример :
http://javastudy.ru/spring-mvc/spring-mvc-pattern-prg-postredirectget/
развер браузер после POST не отправляет САМ автоматом запрос GET?
Без явного написания программистом?
Я так понимаю, что данный код нужен при переходе на ДРУГУЮ страницу после POST.
Если остаёмся на этой же, то ничего делать не нужно.
...
Рейтинг: 0 / 0
13.10.2016, 12:01
    #39326115
Андрей0407
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Atum1увидел второе modelattribute странная работа в контроллере на во вью

у вас некорректная работа с modelattribute

посмотрите тут

http://www.seostella.com/ru/article/2012/04/24/modelattribute-i-spring-mvc.html
Поясни, пожалуйста, что именно некорректно? MVC извлекает command object из запроса по имени в форме.
...
Рейтинг: 0 / 0
13.10.2016, 12:09
    #39326128
Андрей0407
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Согласен, воспроизведение надо описать подробнее.
1. Перейти на форму редактирования, указать значение А = 1, B = 2.
2. Нажать кнопку Post.
3. Повторно перейти на форму редактирования.
4. Нажать Get.
5. Нажать Post.
Ожидаемый результат
Свойства бина остались прежними А = 1; B = 2.
Текущий результат
Свойства бина приняли значение А = 1,1; B = 2,2.

По реализации.
Возможность отправить get со страницы редактирования - для получения результатов валидации, более подробных, чем можно положить в BindingResult.
...
Рейтинг: 0 / 0
13.10.2016, 12:18
    #39326141
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Андрей0407Согласен, воспроизведение надо описать подробнее.
сначала F12 нажать и вкладку Сеть.
Там видны все GET\POST с параметрами.
Ферштейн? Программист?
...
Рейтинг: 0 / 0
13.10.2016, 12:32
    #39326162
Андрей0407
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Petro123,
А я то дурак, для это WireShark использую.
...
Рейтинг: 0 / 0
13.10.2016, 12:53
    #39326177
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Андрей0407Petro123,
А я то дурак, для это WireShark использую.
верно. Умные приводят в вопросе всю доп.информацию.
..

Андрей04071. Перейти на форму редактирования, в урл набрать localhost/demo.jsp и Enter
=== ушло GET
1.1 указать значение А = 1, B = 2.
2. Нажать кнопку Post.
=== ушло POST с параметрами 1 и 2

верно?
...
Рейтинг: 0 / 0
13.10.2016, 12:57
    #39326180
Андрей0407
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Действительно, удобнее. Спасибо.
Значение параметра дублируется, т. к. передается через Query String (этого ранее не заметил) и через Form data. Примечательно, что удаление параметров из строки браузера не помогает.
Для решения проблемы можно сделать переадресацию после get с формы редактирования.

DomainController.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
package org.springframework.tutorials.getpost.mvc;

import org.springframework.stereotype.Controller;
import org.springframework.tutorials.getpost.domain.Domain;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springframework.web.servlet.support.RequestContextUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

@Controller
public class DomainController {

    public static final String EDIT_VIEW = "edit";
    public static final String VIEW_VIEW = "view";
    public static final String DOMAIN_ATTR_NAME = "domain";
    public static final String CONCAT_AB_ATTR_NAME = "concat_ab";

    private Domain domain = new Domain();

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String initView(Model model) {
        model.addAttribute(DOMAIN_ATTR_NAME, domain);
        return VIEW_VIEW;
    }

    @RequestMapping(value = "/edit", method = RequestMethod.GET)
    public String initGet(Model model, HttpServletRequest request) {
        printName(request);
        Map<String, ?> flashMap = RequestContextUtils.getInputFlashMap(request);
        if (flashMap != null) {
            model.addAttribute(DOMAIN_ATTR_NAME, flashMap.get("domain"));
            model.addAttribute(CONCAT_AB_ATTR_NAME, flashMap.get("concat_ab"));
        } else {
            model.addAttribute(DOMAIN_ATTR_NAME, domain);
        }
        return EDIT_VIEW;
    }

    private void printName(HttpServletRequest request) {
        System.out.println(request.getParameter("a"));
    }

    @RequestMapping(value = "/edit", method = RequestMethod.GET, params = "get")
    public String processGet(Domain domain, HttpServletRequest request,
                             RedirectAttributes redirectAttributes) {
        printName(request);
        redirectAttributes.addFlashAttribute(DOMAIN_ATTR_NAME, domain);
        redirectAttributes.addFlashAttribute(CONCAT_AB_ATTR_NAME, domain.getA() + domain.getB());
        return "redirect:/edit";
    }

    @RequestMapping(value = "/edit", method = RequestMethod.POST)
    public String processPost(Domain domain, HttpServletRequest request) {
        printName(request);
        this.domain.setA(domain.getA());
        this.domain.setB(domain.getB());
        return "redirect:/";
    }

}


...
Рейтинг: 0 / 0
13.10.2016, 13:14
    #39326202
Андрей0407
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Petro123верно. Умные приводят в вопросе всю доп.информацию.
Исправлюсь. В следующий раз предоставлю доступ к стенду и полное описание всего ПО.

Petro123...
верно?
Да.
...
Рейтинг: 0 / 0
13.10.2016, 13:25
    #39326218
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Андрей0407Исправлюсь. В следующий раз предоставлю доступ к стенду и полное описание всего ПО.
нет. Достаточно отвечать на вопросы (с вопросительным знаком первый ответ).
Андрей0407Действительно, удобнее. Спасибо.
всё? Вопрос решён?
...
Рейтинг: 0 / 0
13.10.2016, 13:35
    #39326234
Андрей0407
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Petro123,
смог обойти нежелательное поведение, спасибо. Но более общий вопрос остался в силе.
Как правильно организовать страницы и обработку запросов, чтобы на странице редактирования можно было отображать дополнительные данные, основанные на введенных.
...
Рейтинг: 0 / 0
13.10.2016, 13:43
    #39326245
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Андрей0407,

javascript. Учи AJAX
...
Рейтинг: 0 / 0
13.10.2016, 13:52
    #39326264
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Андрей0407дополнительные данные, основанные на введенных.
- am_sasa верно сказал. Без перерисовки странички по GET\POST только JS+jQuery = AJAX.
- либо тоже можно перерисовку (GET уже с введёнными параметрами).
Ну, моргнёт форма на 0,2 сек - некритично.
...
Рейтинг: 0 / 0
13.10.2016, 14:02
    #39326274
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Андрей0407Petro123,
смог обойти нежелательное поведение, спасибо. Но более общий вопрос остался в силе.
Как правильно организовать страницы и обработку запросов, чтобы на странице редактирования можно было отображать дополнительные данные, основанные на введенных.

Как, как. ч\з @ModelAttribute :-)
...
Рейтинг: 0 / 0
13.10.2016, 14:50
    #39326348
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
mad_nazgulКак, как. ч\з @ModelAttribute :-)
осталось уточнить что у него значит - Отображать на введённых).
Во время ввода или после сабмита и коммита в БД.
...
Рейтинг: 0 / 0
13.10.2016, 15:01
    #39326366
Андрей0407
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
mad_nazgulКак, как. ч\з @ModelAttribute :-)
Спасибо, кэп.
Необходимость повторно вернуть страницу меня не волнует. Сейчас сделал так, чтобы после get шла переадресация на эту же страницу, но с дополнительными параметрами. Вопрос был в том, как это принято делать для озвученного стека. Возможно, следует создать в JSP две формы и одну спрятать.
...
Рейтинг: 0 / 0
13.10.2016, 15:04
    #39326370
Андрей0407
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Впрочем, вопрос скорее риторический - не нашел примера в petclinic. Всем спасибо.
...
Рейтинг: 0 / 0
13.10.2016, 15:16
    #39326381
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Андрей0407Сейчас сделал так, чтобы после get шла переадресация на эту же страницу, но с дополнительными параметрами.
если без стека спринг, а по житейски )) то:
- после POST - сохранение в базу и сразу уже с новыми значениями GET и показ формы.
Доп. параметры можно посмотреть на примере установки фильтров в вебе.
Там при каждом значимом фильтре добавляется параметр в Урл. Т.е. на кнопку Применить пойдёт GET с параметрами фильтров.
+ дополнительно эти парам.можно сохранить в ярлыке на десктоп как преимущество.
Что у тебя за ВИ и параметры я не понял.
Удачи!
...
Рейтинг: 0 / 0
13.10.2016, 15:58
    #39326415
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring MVC. Дублирование параметра запроса после выполнения GET
Андрей0407mad_nazgulКак, как. ч\з @ModelAttribute :-)
Спасибо, кэп.
Необходимость повторно вернуть страницу меня не волнует. Сейчас сделал так, чтобы после get шла переадресация на эту же страницу, но с дополнительными параметрами. Вопрос был в том, как это принято делать для озвученного стека. Возможно, следует создать в JSP две формы и одну спрятать.

Можно как угодно.
Причем запрос дополнительный запрос GET не нужен.

Я, например, возвращаю ModelView, а не String (для GET тоже).
А уже в ModelView устанавливать какую страницу (JSP) открыть и передать все нужные атрибуты.

Ну а в JSP уже переданные атрибуты отобразить если надо.

Пошерстите http://www.mkyong.com/ там есть куча примеров для работы со Spring ;-)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring MVC. Дублирование параметра запроса после выполнения GET / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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