Java Spring URL изменяет и добавляет модель

#java #spring-boot

#java #spring-boot

Вопрос:

У меня есть страница в моем веб-приложении:

 http://localhost:8080/user/form/prod/create/0
  

которая имеет атрибуты формы

 <c:url var="addAction" value="/user/form/prod/create/${formProd.formHeader.headerId}" ></c:url>
<form:form id="formSubmit" action="${addAction}" modelAttribute="formProd" class="form-horizontal" method="get">

-- Codes for inputs and submit button --

</form:form>
  

Как только кнопка нажата, она пройдет через этот контроллер:

 @RequestMapping(value = {"/user/form/prod/{type}/{headerId}"}, method = RequestMethod.GET)
public ModelAndView formCreateView(@Validated @ModelAttribute("formProd") FormProd formProd, BindingResult result
        , ModelMap model, Principal principal, @PathVariable(value="headerId") Long headerId, @PathVariable(value="type") String type
        , HttpServletRequest request) {

-- Do some stuff AND return to the same url page http://localhost:8080/user/form/prod/create/0

return new ModelAndView(AuthenticationBase.JSP_USER_FORM_PROD, model);
}
  

Проблема в том, что URL изменяется на:

 http://localhost:8080/user/form/prod/create/0?formHeader.status=DRAFTamp;formHeader.prodDate=amp;formHeader.startDateTime=amp;formHeader.endDateTime=amp;lookupName=KMM1                          amp;formHeader.line=amp;formHeader.machine=amp;formHeader.prodCategoryId=10amp;formHeader.product=amp;formHeader.outputMeasureUnitId=13amp;formHeader.unitPerCarton=amp;formHeader.standardMachineSpeed=0.0amp;formHeader.intervalMins=amp;formHeader.sessionId=
  

Которая также включает мою модель. Поскольку URL отличается, если я снова нажму или отправлю форму, теперь отображается «страница с ошибкой белой метки»:

 Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Thu Sep 03 11:41:58 SGT 2020
There was an unexpected error (type=Not Found, status=404).
  

Есть идеи, почему URL меняется?

Ответ №1:

Здесь вы пытаетесь добавить данные по нажатию кнопки, и здесь вы используете метод GET, поэтому ваш URL меняется каждый раз, когда вы нажимаете на кнопку.

измените код так, чтобы он работал ниже

    <c:url var="addAction" value="/user/form/prod/create/${formProd.formHeader.headerId}" ></c:url>
    <form:form id="formSubmit" action="${addAction}" modelAttribute="formProd" class="form-horizontal" method="POST">

-- Codes for inputs and submit button --

</form:form>
  

Изменение кода контроллера

 @RequestMapping(value = {"/user/form/prod/{type}/{headerId}"}, method = RequestMethod.POST)
public ModelAndView formCreateView(@Validated @ModelAttribute("formProd") FormProd formProd, BindingResult result
        , ModelMap model, Principal principal, @PathVariable(value="headerId") Long headerId, @PathVariable(value="type") String type
        , HttpServletRequest request) {

-- Do some stuff AND return to the same URL page http://localhost:8080/user/form/prod/create/0

return new ModelAndView(AuthenticationBase.JSP_USER_FORM_PROD, model);
}
  

Ответ №2:

Это функциональность по умолчанию для сопоставлений типов GET.

Метод GET В методе GET данные отправляются в виде параметров URL, которые обычно представляют собой строки пар имени и значения, разделенных амперсандами (amp;). В общем случае URL с полученными данными будет выглядеть следующим образом: Пример:http://www.example.com/action?name=Samamp;weight=55

Измените метод, введите его post, а также метод form для post, и это сработает.

Изменение

 method = RequestMethod.GET
  

Для

 method = RequestMethod.POST
  

И на странице просмотра измените тип формы на POST.

 method="POST"