@InitBinder example
Spring 3 에서 @InitBinder를 사용하여 문자열로 표현된 날짜를 java.sql.Date 로 변환하는 예
개요
Spring 3기반의 콘트롤러 메소드에서 사용자가 폼에 입력한 날짜 파라미터를 자동으로 java.sql.Date 형으로 변환하여 Command Object에 저장하는 예이다
해당 콘트롤러에 임의의 메소드를 선언하고 그 메소드에 @InitBinder 를 지정하고 아래와 같은 코드를 사용하면 Command Object 에 날짜를 바인딩 하기 전에 해당 메소드가 호출되어 문자열로 표현된 날짜를 java.sql.Date 객체로 변환하여 Command Object 에 할당해준다
기본 Spring 3 라이브러리 외에 사용된 라이브러리
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
스프링에서 바인딩의 의미는 브라우저에서 전달된 파라미터가 서버측의 빈 객체 멤버변수에 할당되는 것을 의미한다. 자바의 기본 자료형에 해당하는 데이터는 서버측에서 Wrapper 클래스를 사용하여 자동으로 변환되지만 날짜(Date)와 같은 데이터는 Wrapper 클래스가 없기 때문에 수동으로 변환해야 하는 문제가 있다. 바인딩시에 자동으로 특정 자료형으로 변환되도록 하려면 변환을 위해 사용될 메소드에 @initBinder를 적용하면 된다
아래의 코드에서 사원정보를 저장하기 위해 HTML 폼에서 사원정보 파라미터를 받을 때 입사일(날짜)정보를 처리하는 부분은 add() 메소드인데, 자동으로 EmpVO 객체에 날짜를 java.sql.Date 객체로 변환하여 바인딩해주고 있다
EmpCrudController.java
package org.kdea.empcrud; import java.beans.PropertyEditorSupport; import java.text.SimpleDateFormat; import java.util.*; import org.kdea.sample.SampleBean; import org.slf4j.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.*; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.*; @Controller @RequestMapping("/empcrud/") public class EmpCrudController { private static final Logger logger = LoggerFactory.getLogger(EmpCrudController.class); @Autowired private EmpCrudService empService; @Autowired private SampleBean sb; @RequestMapping("list") public ModelAndView list() { sb.printMsg(); ModelAndView mv = new ModelAndView("empcrud/empList"); mv.addObject("list",empService.getList(1)); return mv; } @RequestMapping("detail") public ModelAndView detail(@RequestParam int empno) { ModelAndView mv = new ModelAndView("empcrud/empDetail"); mv.addObject("emp",empService.getEmp(empno)); return mv; } @RequestMapping(value="update", method=RequestMethod.GET) public ModelAndView update(@RequestParam int empno) { ModelAndView mv = new ModelAndView("empcrud/updateForm"); mv.addObject("emp",empService.getEmp(empno)); return mv; } @RequestMapping(value="update", method=RequestMethod.POST) @ResponseBody public Map<String, Boolean> update(EmpVO emp) { boolean updated = empService.updateEmp(emp); Map<String,Boolean>map = new HashMap<String,Boolean>(); map.put("updated", updated); return map; } @RequestMapping(value="delete", method=RequestMethod.POST) @ResponseBody public Map<String, Boolean> delete(@RequestParam int empno) { boolean deleted = empService.delete(empno); Map<String,Boolean>map = new HashMap<String,Boolean>(); map.put("deleted", deleted); return map; } @RequestMapping(value="add", method=RequestMethod.GET) public String addForm() { return "empcrud/addForm"; } @RequestMapping(value="add", method=RequestMethod.POST) @ResponseBody public Map<String, Boolean> add(EmpVO emp) { Map<String,Boolean> map = new HashMap<String,Boolean>(); map.put("added", empService.insert(emp)); return map; } @InitBinder public void binder(WebDataBinder binder) { binder.registerCustomEditor(java.sql.Date.class, new PropertyEditorSupport() { @Override public void setAsText(String value) { try { java.util.Date udt = new SimpleDateFormat("yyyy-MM-dd").parse(value); java.sql.Date sdt = new java.sql.Date(udt.getTime()); setValue(sdt); } catch(Exception e) { setValue(null); } } @Override public String getAsText() { return new SimpleDateFormat("yyyy-MM-dd").format((java.sql.Date) getValue()); } }); } }
EmpVO.java
package org.kdea.empcrud; public class EmpVO { private int empno; private String ename; private java.sql.Date hiredate; private int sal; private int deptno; public int getEmpno() { return empno; } public void setEmpno(int empno) { this.empno = empno; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public java.sql.Date getHiredate() { return hiredate; } public void setHiredate(java.sql.Date hiredate) { this.hiredate = hiredate; } public int getSal() { return sal; } public void setSal(int sal) { this.sal = sal; } public int getDeptno() { return deptno; } public void setDeptno(int deptno) { this.deptno = deptno; } }