2016-09-15 87 views
1

我是Spring的新手,试图在Spring中构建一个包含Date作为表单元素的表单示例。但是当点击提交按钮时,它显示错误“HTTP状态400-客户端发送的请求在语法上不正确。”。带Date日期的Spring MVC输入标签引发错误:HTTP状态400 - 客户端发送的请求在语法上不正确

注意:我使用日期元素的sql.Date。

请帮忙。

代码段如下所示

FormExample.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> 
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Spring Form Example</title> 
</head> 
<body> 
    <h2>Form Example</h2> 
    <form:form commandName="formExample" action="formExampleDetails" method="post"> 
     <table> 
      <tr> 
       <td> 
        <label>BirthDate:</label> 
       </td> 
       <td> 
        <fmt:formatDate value="${birthDate.date}" pattern="dd-mmm-yyyy" var="birthDate"/> 
        <form:input path="birthDate" value="${birthDate}"/> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <input type="submit" value="Submit"/> 
       </td> 
       <td> 
        <input type="reset" value="Reset"> 
       </td> 
      </tr> 
     </table> 
    </form:form> 
</body> 
</html> 

Controller类即ApplicationControllerClass是如下

@Controller 
public class ApplicationController { 
    @RequestMapping("/formExample") 
    public String formExamplePage(ModelMap model){ 
     model.put("formExample", new FormExample()); 
     return "formExamplePage"; 
    } 

    @RequestMapping(value="/formExampleDetails",method=RequestMethod.POST) 
    public String formExampleDetails(@ModelAttribute FormExample formExample,ModelMap model){ 
     System.out.println("BirthDate====>"+formExample.getBirthDate()); 
     return "index"; 
    } 

    @InitBinder 
    public void initBinder(WebDataBinder binder){ 
     SimpleDateFormat sdf = new SimpleDateFormat("dd-mmm-yyyy"); 
     sdf.setLenient(true); 
     binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true)); 
    } 

} 

POJO类即FormExample.java是如下

package com.spring.pojo; 

import java.io.Serializable; 
import java.sql.Date; 

public class FormExample implements Serializable{ 
    private static final long serialVersionUID = 5527691555730303451L; 

    private Date birthDate; 

    public Date getBirthDate() { 
     return birthDate; 
    } 
    public void setBirthDate(Date birthDate) { 
     this.birthDate = birthDate; 
    } 
} 
+0

尝试将'name'参数添加到输入中,像这样

+0

@Oleg Kubatov-我试着用你的解决方案。但它仍然在抛出错误。注意 - 我已经从控制器类中删除了“initBinder”方法。我正在使用SQL Date作为生日类型,所以它引发错误。如何克服这一点? – NagenSahu

回答

0

尝试从<form:form ...标记中删除enctype="multipart/form-data"

编辑 我无法重新创建你的错误,所以我试图让你的代码工作。

我现在没有时间来创建最小化设置,所以我尝试将代码插入到使用Spring 3.2的自己的项目中。一切工作,因为它应该如果我做了以下修改: 首先,删除enctype="multipart/form-data";第二,修改控制器的代码如下:

@RequestMapping(value="/formExampleDetails",method=RequestMethod.POST) 
public String formExampleDetails(@ModelAttribute FormExample formExample, BindingResult bindingResult){ 
    System.out.println("BirthDate====>"+formExample.getBirthDate()); 
    return "index"; 
} 

(代替ModelMap说法,我通过BindingResult参数 - 它应该包含可能出现的错误,例如,当插入11/11/2011和不11-11 -2011)。顺便说一句,您最好将格式dd-mmm-yyyy更改为dd-MM-yyyy。

我没有试图找出哪些修改是非常必要的,为什么;但这种方式可行。我只想说,如果您使用诸如Fiddler之类的工具查看HTTP请求,您会发现enctype="multipart/form-data"会更改HTTP请求格式。

+0

如果一个表单同时包含文件类型和Date类型元素,该如何实现? – NagenSahu

+0

您的表单似乎没有包含任何元素。如果你需要在同一页面上,应该可以在同一页面上有两个表单 - 一个用于上传文件,一个用于更新表单值。 –

+0

好的。删除enctype =“multipart/form-data”后,它仍然抛出相同的错误。 – NagenSahu

0

我相信你现在可以解决这个问题。但为了其他人的缘故,我会添加我解决这个问题的方式。因为我不得不花费几个小时来解决这个问题。

您可以更新您的FormExample birthDate字段,如下所示。

  @DateTimeFormat(pattern = "dd-mmm-yyyy") 
      private Date birthDate; 

这将正确地将表单对象映射到您的pojo对象,并且不会给出400 BAD请求错误。

相关问题