jsp 经过jquery 提交 form数据到springMVC 400错误

springmvc form表单提交报400错误,出现400错误的缘由及解决方法:java

缘由:ajax

在SpringMVC中的Action中处理前台ajax请求传过来的json数据直接转成对应的实体类时出错:400 Bad Request,后台也不报错,400指的的是请求无效(请求有语法问题或者不能知足请求)。spring

1:通常最多见的就是后台的实体类bean与前台穿过的类型不匹配,如你的javabean中有定义了Date类型和int类型的成员变量,致使转化器在把json数据转化成bean时不能转化。数据库

2:log4j的配置文件里错误将部分log打为Info级别所致json

3:要返回json的却忘了加@ResponseBodymvc

4:ajax请求的链接后边忘了加参数,如url:basePath + "kscj/unbill.do?jqid="+jqidsapp

 

5:传了非实体bean属性的参数过来。数据库设计

6:controller指定的参数名称与前台不一致,如:使用了@RequestParam(value="userName")而前台必须指定该名称函数

 

[java] view plain copyui

  1. @RequestMapping("/hello.do")    
  2. public String hello(HttpServletRequest req,HttpServletResponse resp,@RequestParam(value="userName")String user ){    
  3.     request.setAttribute("user", user);    
  4.     return "hello";    
  5. }   

也能够指定该参数是非必须的required=false,如:

 

[java] view plain copy

  1. @RequestMapping("/hello.do")    
  2. public String hello(HttpServletRequest req,HttpServletResponse resp,@RequestParam(value="userName",required=false)String user){    
  3.    request.setAttribute("user", user);    
  4.    return "hello";    
  5. }   

 

解决方法:

1:把实体类的javabean里边的类型都改为string类型,在配置SQL语句时用数据库函数to_date或者to_number转化的,若是再java中用到这个字符串类型的日期的话,有必要的话,就用For format=new SimpleDateFormat("yyyy-MM-dd"),format.parse()来转换。

2:在对应的实体类的对应的非字符串类型的变量的setter方法中传入string类型的,而后在里边用SimpleDateFormat或者Integer进行转化。

如:public void setBjsj(Date bjsj) {
        this.bjsj = bjsj;
    }    
变成

public void setBjsj(String bjsj) throws ParseException {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         this.bjsj =sdf.parse(bjsj) ;

}

备注:

3:在实体类的日期属性上加@DateTimeFormat(pattern="yyyy-MM-dd")注解。

Spring提供了FormattingConversionService和DefaultFormattingConversionService来完成对象的解析和格式化。

首先引入格式化jar:把Joda-Time包添加到以前的项目中,这里用的是joda-time-2.3.jar,而后在实体类中这样写:

@NumberFormat(style=Style.CURRENCY)

private double money;

@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") 

 private Date date; 

注意:这里的money和date再也不是String类型,而是它们本身原本的类型。

 

总结:方法2和方法3我实行过,对于字段很是少的状况下是可行的。可是对于字段很是多的状况下,这样错是一件很是可怕的事情。实际开发中数据库设计是由公司数据库人员本身定义的,假如日期类型和数值类型,公司就明确规定使用Date和Integer类型,那么转换是必需要作的。

相关文章
相关标签/搜索