前言
作为一名刚入行的初级开发,工作中总会遇到各种各样的问题。说一下最近开发中遇到的问题吧。(初级开发往往写增删改查比较多。。。)
项目的整体框架还是spring那一套,前端使用了velocity模板。在使用Form表单提交数据返回列表页的时候出现了400错误,总结一下原因。
一、问题产生原因
form表单如下:
<form id="query_form" action="${rc.contextPath}/newItemTag/list" method="post">
#parse("pim_new_item_tag/list_query.vm")
</form>
<div class="columnTitle">
<span class="query_tittle_margin">查询条件</span>
</div>
<div >
<ul class=" input_box clearfix">
<li style="width:400px;height:40px;">
<div class="input_box_left">新品标识</div>
<div class="input_box_right">
<select name="status" id="status" class="select">
<option value="">请选择</option>
<option value="0" #if($!query.status == 0) selected #end>是</option>
<option value="3" #if($!query.status == 3) selected #end>否</option>
</select>
</div>
</li>
<li style="width:400px;height:40px;">
<div class="input_box_left">创建时间</div>
<div class="input_box_right">
<input type="text" οnfοcus="WdatePicker({maxDate:'#F{$dp.$D(\'queryFinishOfCreateTime\')}',dateFmt:'yyyy-MM-dd'});" class="text" name="queryBeginOfCreateTime" id="queryBeginOfCreateTime" value="$!date.format("yyyy-MM-dd",$!query.queryBeginOfCreateTime)" readonly style="width:100px"/> 至
<input type="text" οnfοcus="WdatePicker({minDate:'#F{$dp.$D(\'queryBeginOfCreateTime\')}',dateFmt:'yyyy-MM-dd'});" class="text" name="queryFinishOfCreateTime" id="queryFinishOfCreateTime" value="$!date.format("yyyy-MM-dd",$!query.queryFinishOfCreateTime)" readonly style="width:100px"/>
</div>
</li>
<li style="height: 40px;"></li>
<li style="width:400px;height:80px;">
<div class="input_box_left">商品ID</div>
<div class="input_box_right">
<textarea id="itemId" style="width: 255px;height: 80px; border: 1px solid #e3e3e3;border-radius: 3px;" name="productIds" value="$!query.productIds" placeholder="最多可查询100个ID,以英文逗号分隔">$!query.productIds</textarea>
</div>
</li>
<li style="width:400px;height:40px;">
<div class="input_box_left">开始时间</div>
<div class="input_box_right">
<input type="text" οnfοcus="WdatePicker({maxDate:'#F{$dp.$D(\'queryFinishOfStartTime\')}',dateFmt:'yyyy-MM-dd'});" class="text" name="queryBeginOfStartTime" id="queryBeginOfStartTime" value="$!date.format("yyyy-MM-dd",$!query.queryBeginOfStartTime)" readonly style="width:100px"/> 至
<input type="text" οnfοcus="WdatePicker({minDate:'#F{$dp.$D(\'queryBeginOfStartTime\')}',dateFmt:'yyyy-MM-dd'});" class="text" name="queryFinishOfStartTime" id="queryFinishOfStartTime" value="$!date.format("yyyy-MM-dd",$!query.queryFinishOfStartTime)" readonly style="width:100px"/>
</div>
</li>
<li style="height: 40px;"></li>
<li style="width:400px;height:40px;">
<div class="input_box_left">结束时间</div>
<div class="input_box_right">
<input type="text" οnfοcus="WdatePicker({maxDate:'#F{$dp.$D(\'queryFinishOfEndTime\')}',dateFmt:'yyyy-MM-dd'});" class="text" name="queryBeginOfEndTime" id="queryBeginOfEndTime" value="$!date.format("yyyy-MM-dd",$!query.queryBeginOfEndTime)" readonly style="width:100px"/> 至
<input type="text" οnfοcus="WdatePicker({minDate:'#F{$dp.$D(\'queryBeginOfEndTime\')}',dateFmt:'yyyy-MM-dd'});" class="text" name="queryFinishOfEndTime" id="queryFinishOfEndTime" value="$!date.format("yyyy-MM-dd",$!query.queryFinishOfEndTime)" readonly style="width:100px"/>
</div>
</li>
<li style="width:400px;margin-bottom:0;">
<div class="input_box_left"> </div>
<div class="input_box_right">
<a id="btn_search" href="javascript:void(0)" class="btn btn_search">查询</a>
<a id="btn_reset" href="javascript:void(0)" class="btn btn_reset">重置</a>
</div>
</li>
</ul>
</div>
接收参数的实体类如下:
```java
public class NewItemTagRequestDto implements Serializable {
private String productIds;
private List<Long> productIdList;
private Date queryBeginOfStartTime;
private Date queryFinishOfStartTime;
private Date queryBeginOfEndTime;
private Date queryFinishOfEndTime;
private Date queryBeginOfCreateTime;
private Date queryFinishOfCreateTime;
private String status;
问题就出现在数据类型不匹配上,前端form表单使用了日期插件,提交的String类型的日期,后端springmvc使用了实体类接收参数,而实体类中日期参数的数据类型是Date,因此报了一个400错误
二、解决方法
其实这个问题的解决方式有很多,在不改变表单提交方式的情况下,我列举两种解决方式吧!
1.后端依然使用实体对象接收数据,把实体类中的日期数据类型改成String
实体类修改如下:
public class NewItemTagRequestDto implements Serializable {
private String productIds;
private List<Long> productIdList;
private String queryBeginOfStartTime;
private String queryFinishOfStartTime;
private String queryBeginOfEndTime;
private String queryFinishOfEndTime;
private String queryBeginOfCreateTime;
private String queryFinishOfCreateTime;
private String status;
Controller接收数据:
@RequestMapping(value = "/list")
public String list( NewItemTagRequestDto requestDto, Model model){
2.后端使用实体对象+String类型的日期参数接收数据(或者使用HttpServletRequest接收),实体对象不做修改(要注意修改表单中日期对应的input标签中的name属性,与后端接收实体中的日期字段不一致即可)(如果使用实体对象+String类型参数接收数据则不能使用@RequestParam注解)
实体类不做修改:
public class NewItemTagRequestDto implements Serializable {
private String productIds;
private List<Long> productIdList;
private Date queryBeginOfStartTime;
private Date queryFinishOfStartTime;
private Date queryBeginOfEndTime;
private Date queryFinishOfEndTime;
private Date queryBeginOfCreateTime;
private Date queryFinishOfCreateTime;
private String status;
注意修改form表单中input标签中的name属性(跟实体类中的字段要不一致):
后端增加String类型的字段接收表单提交的日期数据(或者HttpServletRequest接收),通过DateFomate转化成需要的Date格式再存入到实体类中.:
public String list(HttpServletRequest httpRequest, HttpServletResponse httpResponse, NewItemTagRequestDto requestDto, Model model){
try{
String queryBeginOfCreateTime = httpRequest.getParameter("queryBeginOf_CreateTime");
String queryFinishOfCreateTime = httpRequest.getParameter("queryFinishOf_CreateTime");