如何从JSP表单获取指定格式的日期并存储到MySQL?
实现JSP表单日期存入MySQL的完整方案
看起来你正在用Spring MVC的表单标签收集日期并存储到MySQL,我来帮你梳理整个流程和容易踩的坑:
1. 先对齐实体类与数据库字段
首先你的Assignment实体类里的date字段,推荐用Java 8+的LocalDate类型(比旧的Date类更简洁,还没时区问题),代码示例:
public class Assignment { // 其他字段... @DateTimeFormat(pattern = "yyyy-MM-dd") // 对应前端提交的格式,可按需修改 private LocalDate date; // 别忘了加Getter和Setter方法 }
对应的MySQL表中,date字段要设置为DATE类型,SQL示例:
CREATE TABLE assignment ( id INT PRIMARY KEY AUTO_INCREMENT, date DATE NOT NULL, -- 其他业务字段... );
2. 调整JSP表单的日期输入
你当前用了<form:input type="date" pattern="yyyy/MM/dd"/>,这里要注意:HTML5原生的date输入控件,大多数浏览器默认会以yyyy-MM-dd的格式提交数据,你设置的pattern更多是做前端验证用的,不影响提交格式。
如果想用原生控件,建议把表单代码调整成这样:
<form:form id="regForm" modelAttribute="assignment" action="successAddAssignment" method="post"> <table align="center"> <tr> <td><form:label path="date">Date</form:label></td> <td> <form:input path="date" type="date" id="date"/> <!-- 去掉pattern,让浏览器用默认的yyyy-MM-dd格式提交 --> <c:if test="${not empty errors.date}"> <span style="color:red;">${errors.date}</span> </c:if> </td> </tr> <!-- 其他表单字段 --> <tr> <td colspan="2"><input type="submit" value="Submit"/></td> </tr> </table> </form:form>
如果一定要让前端提交yyyy/MM/dd格式,那得换成普通文本输入框加JS日期选择器,或者在提交前用JS转换格式。
3. 后端Controller的处理逻辑
在Controller里接收提交的Assignment对象,调用DAO层存入数据库即可:
@Controller public class AssignmentController { @Autowired private AssignmentService assignmentService; // 显示表单的方法 @GetMapping("/addAssignment") public String showAddForm(Model model) { model.addAttribute("assignment", new Assignment()); return "addAssignment"; // 你的JSP页面名称 } // 处理表单提交 @PostMapping("/successAddAssignment") public String handleSubmit(@ModelAttribute("assignment") @Valid Assignment assignment, BindingResult result, Model model) { if (result.hasErrors()) { // 如果日期格式不匹配,返回表单页面显示错误 return "addAssignment"; } // 存入数据库 assignmentService.saveAssignment(assignment); return "success"; // 跳转成功页面 } }
4. DAO层的实现(以JdbcTemplate为例)
如果用JdbcTemplate操作数据库,保存方法可以这么写:
@Repository public class AssignmentDaoImpl implements AssignmentDao { @Autowired private JdbcTemplate jdbcTemplate; @Override public void saveAssignment(Assignment assignment) { String sql = "INSERT INTO assignment (date) VALUES (?)"; jdbcTemplate.update(sql, assignment.getDate()); // LocalDate可以直接作为参数传入,JdbcTemplate会自动转换为MySQL的DATE格式 } }
常见问题排查
- 日期绑定失败,出现类型不匹配错误:确保实体类的
date字段上的@DateTimeFormatpattern和前端提交的格式完全一致,比如前端提交yyyy/MM/dd,就把pattern改成这个值。 - MySQL存储的日期格式不对:MySQL的DATE类型只认
yyyy-MM-dd格式,所以不管前端提交什么格式,后端都要先转成这个格式再存入,用LocalDate的话会自动处理,不用手动转换。 - 前端date控件显示格式不符合预期:浏览器的date控件显示格式是跟着用户系统区域走的,但提交格式始终是
yyyy-MM-dd,不用纠结显示样式,后端处理好提交的格式就行。
内容的提问来源于stack exchange,提问作者Agnes Palit
相关产品推荐
相关产品推荐

