음헤헷 봄싹 게시판 검색 MVC 완성
먼저 뷰는 위 그림과 같이 간단합니다. 기본값을 설정해서 바로 검색 버튼 눌러서 검색할 수 있도록 해뒀습니다.
기본 값은 다음과 같습니다.
작성일 검색 조건 바뀔 때마다 달력으로 검색 범위를 표현해주면 좋겠는데.. 그런 멋진 UI는 나~~~~중에.. 해보기로 하구요. 일단 저렇게 해놨습니다.
<form:form commandName="param" action="/post/list.do">
검색어 <form:input path="keyword"/>
<form:checkboxes items="${ref.fieldNames}" path="fieldNames" /><br/>
작성일: <form:input path="basicDate"/>
<form:select path="dateSearchingType" items="${ref.dateSearchingTypes}" />
<form:select path="dateSearchingTerm" items="${ref.dateSearchingTerms}" /><br/>
<input type="submit" value="검색"/>
</form:form>
뷰 핵심 코드는 스프링 form 태그를 이용해서 간단하게~ 샤샥...
저 화면을 보여주는 컨트롤러 코드는
public void search(int boardId, ModelMap model){
model.addAttribute("param", new PostSearchParam());
model.addAttribute(boardService.getById(boardId));
}
참 쉽죠?
저 화면의 폼 처리를 하는 컨트롤러 코드는
public void list(@ModelAttribute("param")PostSearchParam param, ModelMap model){
System.out.println(param.getKeyword());
System.out.println(Arrays.toString(param.getFieldNames()));
System.out.println(param.getBasicDate());
System.out.println(param.getDateSearchingTerm().name());
System.out.println(param.getDateSearchingType().name());
// model.addAttribute(postService.list(param));
}
요거.. 전 아직도 sysout 디버깅이 넘 좋아요.ㅋㅋ 일단 잘 받는 것 까지 해야 그 다음으로 DAO에서 검색해서 가져오고. 어쩌구 저쩌구를 구현해야 하는데 여기서 한 번 끊고 가는거죠. DAO쪽에선 검색 조건 테스트 할 께 많을테니까요. 짧은 단위로 개발하기..
자.. 저 정도 코드면 될까요? 안 돼죠. 저 녀석들이 주연이면 조연이 필요합니다.
ONE(1, "한 달"), TWO(2, "두 달"), THREE(3, "세 달"), ALL(0, "모두");
private int duration;
private String description;
DateSearchingTerm(int duration, String description) {
this.duration = duration;
this.description = description;
}
public int getDuration() {
return duration;
}
public String getDescription() {
return description;
}
public String toString() {
return description;
}
}
이 녀석은 작성일 검색 기간 enum으로 duraion은 나중에 DAO에서 검색 조건 만들 때 사용할 속성입니다. 약간 미리 예상하고 만들어 둔 속성이라 거시기 한데... 뭐 필요없어지면 지워버리죠. 하나를 봤으니 딴 건 안 보겠습니다.
@Override
public String getAsText() {
Object value = getValue();
if(value == null)
return "";
else
return value.toString();
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
if(text.equals("한 달"))
setValue(DateSearchingTerm.ONE);
if(text.equals("두 달"))
setValue(DateSearchingTerm.TWO);
if(text.equals("세 달"))
setValue(DateSearchingTerm.THREE);
if(text.equals("모두"))
setValue(DateSearchingTerm.ALL);
}
}
이 녀석은 프로퍼티 에디터 나중에 폼 처리하는 메소드에서 바인딩 할 때 모르는 타입이라고 에러가 날 겁니다. 그래서 이 녀석을 등록해줘야 하죠,
등록은 컨트롤러에서..
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
binder.registerCustomEditor(DateSearchingTerm.class, new DateSearchingTermPropertyEditor());
binder.registerCustomEditor(DateSearchingType.class, new DateSearchingTypePropertyEditor());
}
이렇게 해도 되고 쟤들은 다른 컨트롤러도 사용할 테니까 나중에 글로벌하게 XML에 다음의 코드를 이용해서 등록해도 되겠죠
<property name="cacheSeconds" value="0" />
<property name="webBindingInitializer">
<bean class="org.springframework.samples.petclinic.web.ClinicBindingInitializer" />
</property>
</bean>
from 스프링 레퍼런스 13장
쪼아.. 이제 DAO 구현하러 ㄱㄱㄱ...