#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"