为什么当我将表单提交到 Spring MVC 应用程序时,我会收到此 HTTP 状态 404 错误页面?
Why when I submit a form into a Spring MVC application I obtain this HTTP Status 404 error page?
我是 Spring MVC 的新手,在尝试将定义的表单提交到视图中时遇到以下问题。
所以我有一个名为 consultazione.jsp
的视图,其中包含此表单:
<form:form action="/consultazioneRicercaForm" method="post" modelAttribute="consultazioneRicercaForm">
<div class="row">
<div class="col-md-4">
<label>Regioni:</label>
<form:select path="regioneSelezionata" id="selReg">
<form:options items="${listaRegioni}" itemLabel="desReg" itemValue="codReg" />
</form:select>
</div>
<div class="col-md-4">
<label>Province:</label>
<form:select path="provinciaSelezionata" id="selProv">
</form:select>
</div>
<div class="col-md-4">
</div>
</div>
<div class="row">
<div class="col-md-4">
<label>Codice Meccanografico:</label>
<form:input path="codMec" />
</div>
</div>
<input type="submit" value="Save Changes" />
</form:form>
正如您在前面的代码中看到的那样,当表单被提交时,它会生成一个 POST 请求到 /consultazioneRicercaForm
和一个 modelAttribute="consultazioneRicercaForm"
对象,该对象代表其中的表单对象存储表格中插入的值。
所以这是我的控制器class:
@PropertySource("classpath:wifi.properties")
@Controller
public class MinisterialeController {
@Autowired
GeograficaService geograficaService;
@RequestMapping(value = "consultazioneMinisteriale", method = RequestMethod.GET)
public String consultazione(@ModelAttribute ConsultazioneRicercaForm consultazioneRicercaForm, Locale locale, Model model) {
model.addAttribute("consultazioneRicercaForm", consultazioneRicercaForm);
List<Twb1012Regione> listaRegioni = geograficaService.getListaRegioni();
System.out.println("Numero regioni: " + listaRegioni.size());
model.addAttribute("listaRegioni", listaRegioni);
model.addAttribute("regioneSelezionata", new Twb1012Regione());
return "utenteMinisteriale/consultazione";
}
@RequestMapping(value = "/provinceDiUnaRegione.json")
@ResponseBody
public String getProvince(String codiceRegione) {
System.out.println("INTO getProvince()");
List<Twb1013Provincia> provinceDiUnaRegioneList = geograficaService.getListaProvinceDiUnaRegione(codiceRegione);
try {
String listaProvince = new ObjectMapper().writeValueAsString(provinceDiUnaRegioneList);
return listaProvince;
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
@RequestMapping(value = "consultazioneRicercaForm", method=RequestMethod.POST)
public String consultazioneRicercaForm(@ModelAttribute ConsultazioneRicercaForm consultazioneRicercaForm) {
System.out.println(consultazioneRicercaForm.getCodMec());
return "redirect:/consultazioneMinisteriale";
}
}
如您所见,这是处理表示 post 提交操作的先前 post 请求的方法:
@RequestMapping(value = "consultazioneRicercaForm", method=RequestMethod.POST)
public String consultazioneRicercaForm(@ModelAttribute ConsultazioneRicercaForm consultazioneRicercaForm) {
System.out.println(consultazioneRicercaForm.getCodMec());
return "redirect:/consultazioneMinisteriale";
}
问题是,当我点击 提交 按钮提交表单时,我得到了这个错误页面(但我在堆栈跟踪中看不到任何错误):
JBWEB000065: HTTP Status 404 - /consultazioneRicercaForm
JBWEB000309: type JBWEB000067: Status report
JBWEB000068: message /consultazioneRicercaForm
JBWEB000069: description JBWEB000124: The requested resource is not available.
JBoss Web/7.2.2.Final-redhat-1
为什么?可能是什么问题呢?我该如何尝试修复它?
您的表单的 action
URL 是绝对的(以 /
开头):
<form:form action="/consultazioneRicercaForm" method="post" ...
以 /
开头的 URL 将查找位于您域根目录的页面(例如 http://example.com/consultazioneRicercaForm
)。
换句话说,如果包含 form
的 HTML 页面位于 http://example.com/theNameOfMyApp/consultazione.jsp
,那么 action
将 post 表单 http://example.com/consultazioneRicercaForm
不是您所期望的 http://example.com/theNameOfMyApp/consultazioneRicercaForm
。
如何确定?
您的应用程序 URL 是什么?
http://example.com/consultazione.jsp
或 http://example.com/theNameOfMyApp/consultazione.jsp
?
如果是后者,那么你的问题很可能就是上面提到的URL开头的/
更具体地说,在第一个 URL 中,您的应用程序被部署到 ROOT 上下文。在第二个 URL 中,您的应用程序被部署到 theNameOfMyApp
上下文。
404 也可能只是一个不存在的 URL
问题很常见,只是 action
映射 URL 中的拼写错误。在您的情况下,这不太可能,因为您的控制器 MinisterialeController
有一个映射该路径的方法:
@RequestMapping(value = "consultazioneRicercaForm", method=RequestMethod.POST)
public String consultazioneRicercaForm(
请不要忘记,仅映射就可以启用 consultazioneRicercaForm
路径。但它仍然具有应用程序的上下文。
解决方案:
假设您的应用程序未部署到 ROOT 上下文(检查 How to be sure? above),从 action
中删除 /
你的属性 form
:
<form:form action="consultazioneRicercaForm" method="post" ...
这样,如果包含 form
的 HTML 页面位于 http://example.com/theNameOfMyApp/consultazione.jsp
,那么 action
将 post 表单 http://example.com/theNameOfMyApp/consultazioneRicercaForm
.
当您在 url 中提到 /
时,它是从根上下文引用的。因此,您需要在其中包含应用程序名称。您可以删除那个 /
或构建您的 url 就像
<spring:url value="/consultazioneRicercaForm" var="consultazioneRicercaUrl" />
<form:form action="${consultazioneRicercaUrl}" method="POST" modelAttribute="consultazioneRicercaForm">
我是 Spring MVC 的新手,在尝试将定义的表单提交到视图中时遇到以下问题。
所以我有一个名为 consultazione.jsp
的视图,其中包含此表单:
<form:form action="/consultazioneRicercaForm" method="post" modelAttribute="consultazioneRicercaForm">
<div class="row">
<div class="col-md-4">
<label>Regioni:</label>
<form:select path="regioneSelezionata" id="selReg">
<form:options items="${listaRegioni}" itemLabel="desReg" itemValue="codReg" />
</form:select>
</div>
<div class="col-md-4">
<label>Province:</label>
<form:select path="provinciaSelezionata" id="selProv">
</form:select>
</div>
<div class="col-md-4">
</div>
</div>
<div class="row">
<div class="col-md-4">
<label>Codice Meccanografico:</label>
<form:input path="codMec" />
</div>
</div>
<input type="submit" value="Save Changes" />
</form:form>
正如您在前面的代码中看到的那样,当表单被提交时,它会生成一个 POST 请求到 /consultazioneRicercaForm
和一个 modelAttribute="consultazioneRicercaForm"
对象,该对象代表其中的表单对象存储表格中插入的值。
所以这是我的控制器class:
@PropertySource("classpath:wifi.properties")
@Controller
public class MinisterialeController {
@Autowired
GeograficaService geograficaService;
@RequestMapping(value = "consultazioneMinisteriale", method = RequestMethod.GET)
public String consultazione(@ModelAttribute ConsultazioneRicercaForm consultazioneRicercaForm, Locale locale, Model model) {
model.addAttribute("consultazioneRicercaForm", consultazioneRicercaForm);
List<Twb1012Regione> listaRegioni = geograficaService.getListaRegioni();
System.out.println("Numero regioni: " + listaRegioni.size());
model.addAttribute("listaRegioni", listaRegioni);
model.addAttribute("regioneSelezionata", new Twb1012Regione());
return "utenteMinisteriale/consultazione";
}
@RequestMapping(value = "/provinceDiUnaRegione.json")
@ResponseBody
public String getProvince(String codiceRegione) {
System.out.println("INTO getProvince()");
List<Twb1013Provincia> provinceDiUnaRegioneList = geograficaService.getListaProvinceDiUnaRegione(codiceRegione);
try {
String listaProvince = new ObjectMapper().writeValueAsString(provinceDiUnaRegioneList);
return listaProvince;
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
@RequestMapping(value = "consultazioneRicercaForm", method=RequestMethod.POST)
public String consultazioneRicercaForm(@ModelAttribute ConsultazioneRicercaForm consultazioneRicercaForm) {
System.out.println(consultazioneRicercaForm.getCodMec());
return "redirect:/consultazioneMinisteriale";
}
}
如您所见,这是处理表示 post 提交操作的先前 post 请求的方法:
@RequestMapping(value = "consultazioneRicercaForm", method=RequestMethod.POST)
public String consultazioneRicercaForm(@ModelAttribute ConsultazioneRicercaForm consultazioneRicercaForm) {
System.out.println(consultazioneRicercaForm.getCodMec());
return "redirect:/consultazioneMinisteriale";
}
问题是,当我点击 提交 按钮提交表单时,我得到了这个错误页面(但我在堆栈跟踪中看不到任何错误):
JBWEB000065: HTTP Status 404 - /consultazioneRicercaForm
JBWEB000309: type JBWEB000067: Status report
JBWEB000068: message /consultazioneRicercaForm
JBWEB000069: description JBWEB000124: The requested resource is not available.
JBoss Web/7.2.2.Final-redhat-1
为什么?可能是什么问题呢?我该如何尝试修复它?
您的表单的 action
URL 是绝对的(以 /
开头):
<form:form action="/consultazioneRicercaForm" method="post" ...
以 /
开头的 URL 将查找位于您域根目录的页面(例如 http://example.com/consultazioneRicercaForm
)。
换句话说,如果包含 form
的 HTML 页面位于 http://example.com/theNameOfMyApp/consultazione.jsp
,那么 action
将 post 表单 http://example.com/consultazioneRicercaForm
不是您所期望的 http://example.com/theNameOfMyApp/consultazioneRicercaForm
。
如何确定?
您的应用程序 URL 是什么?
http://example.com/consultazione.jsp
或 http://example.com/theNameOfMyApp/consultazione.jsp
?
如果是后者,那么你的问题很可能就是上面提到的URL开头的/
更具体地说,在第一个 URL 中,您的应用程序被部署到 ROOT 上下文。在第二个 URL 中,您的应用程序被部署到 theNameOfMyApp
上下文。
404 也可能只是一个不存在的 URL
问题很常见,只是 action
映射 URL 中的拼写错误。在您的情况下,这不太可能,因为您的控制器 MinisterialeController
有一个映射该路径的方法:
@RequestMapping(value = "consultazioneRicercaForm", method=RequestMethod.POST)
public String consultazioneRicercaForm(
请不要忘记,仅映射就可以启用 consultazioneRicercaForm
路径。但它仍然具有应用程序的上下文。
解决方案:
假设您的应用程序未部署到 ROOT 上下文(检查 How to be sure? above),从 action
中删除 /
你的属性 form
:
<form:form action="consultazioneRicercaForm" method="post" ...
这样,如果包含 form
的 HTML 页面位于 http://example.com/theNameOfMyApp/consultazione.jsp
,那么 action
将 post 表单 http://example.com/theNameOfMyApp/consultazioneRicercaForm
.
当您在 url 中提到 /
时,它是从根上下文引用的。因此,您需要在其中包含应用程序名称。您可以删除那个 /
或构建您的 url 就像
<spring:url value="/consultazioneRicercaForm" var="consultazioneRicercaUrl" />
<form:form action="${consultazioneRicercaUrl}" method="POST" modelAttribute="consultazioneRicercaForm">