powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring MVC. Дублирование параметра запроса после выполнения GET
23 сообщений из 23, страница 1 из 1
Spring MVC. Дублирование параметра запроса после выполнения GET
    #39325721
Андрей0407
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток.
Столкнулся со неожиданным поведением при последовательном выполнении 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
Spring MVC. Дублирование параметра запроса после выполнения GET
    #39325870
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей0407,
Отладчик f12 включал?
...
Рейтинг: 0 / 0
Spring MVC. Дублирование параметра запроса после выполнения GET
    #39325947
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запутанно все :( прочитал два раза посмотрел код и не понял в чем проблема :(

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

Пример :

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

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

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

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

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

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

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

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

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

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

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

верно?
...
Рейтинг: 0 / 0
Spring MVC. Дублирование параметра запроса после выполнения GET
    #39326180
Андрей0407
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действительно, удобнее. Спасибо.
Значение параметра дублируется, т. к. передается через 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
Spring MVC. Дублирование параметра запроса после выполнения GET
    #39326202
Андрей0407
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123верно. Умные приводят в вопросе всю доп.информацию.
Исправлюсь. В следующий раз предоставлю доступ к стенду и полное описание всего ПО.

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

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

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

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

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

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

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


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