【问题标题】:Why when I submit a form into a Spring MVC application I obtain this HTTP Status 404 error page?为什么当我将表单提交到 Spring MVC 应用程序时,我会得到这个 HTTP 状态 404 错误页面?
【发布时间】:2015-09-18 14:38:27
【问题描述】:

我是 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>

正如您在前面的代码中看到的那样,当提交表单时,它会生成一个针对/consultazioneRicercaForm 的 POST 请求,其中包含一个代表表单对象的 modelAttribute="consultazioneRicercaForm" 对象,其中存储了表单中插入的值。

这是我的控制器类:

@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";
    }

问题是,当我点击 submit 按钮提交表单时,我得到了这个错误页面(但我在堆栈跟踪中看不到任何错误):

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

为什么?可能是什么问题呢?我该如何尝试修复它?

【问题讨论】:

  • 应用程序是否部署为根应用程序?如果没有,那么不要使用像 /consultazioneRicercaForm 这样的绝对路径。使用 c:url(或 s:url)将您的上下文相关路径转换为绝对路径。

标签: spring spring-mvc http-status-code-404 spring-form


【解决方案1】:

您的表单的action URL 是绝对的(它以/ 开头):

<form:form action="/consultazioneRicercaForm" method="post" ...

/ 开头的网址将在您的域的根目录中查找页面(例如http://example.com/consultazioneRicercaForm)。

换句话说,如果包含 form 的 HTML 页面位于 http://example.com/theNameOfMyApp/consultazione.jsp,那么 action 会将表单发布到 http://example.com/consultazioneRicercaForm 而不是您所期望的 http://example.com/theNameOfMyApp/consultazioneRicercaForm

如何确定?

您的应用程序的 URL 是什么?

http://example.com/consultazione.jsphttp://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 上下文(检查如何确定?上面),请从您的 action 属性中删除 / form: p>

<form:form action="consultazioneRicercaForm" method="post" ...

这样,如果包含 form 的 HTML 页面位于 http://example.com/theNameOfMyApp/consultazione.jsp,则 action 会将表单发布到 http://example.com/theNameOfMyApp/consultazioneRicercaForm

【讨论】:

    【解决方案2】:

    当您在 url 中提及 / 时,它是从根上下文引用的。因此,您需要在其中包含应用程序名称。您可以删除 / 或构建您的网址,如

    <spring:url value="/consultazioneRicercaForm" var="consultazioneRicercaUrl" />
    <form:form action="${consultazioneRicercaUrl}" method="POST" modelAttribute="consultazioneRicercaForm">
    

    【讨论】:

      猜你喜欢
      • 2020-01-09
      • 2017-01-30
      • 2019-10-21
      • 2012-09-10
      • 2021-07-13
      • 1970-01-01
      • 2013-07-07
      • 2014-08-30
      • 1970-01-01
      相关资源
      最近更新 更多