Struts2로 게시판에 관련되어 스트럿츠 값을 어떻게 전달하고 받는지 알아보자.
struts.xml
<action name="list" class="jh.board.action.BoardListAction">
<interceptor-ref name="prepare" />
<interceptor-ref name="modelDriven" />
<interceptor-ref name="params" />
<result name="success" type="dispatcher">/jh/jsp/board/list.jsp</result>
</action>
/list.action 이라고 url에 친다면 BoardListAction을 거쳐 return 값이 SUCCESS 라면
/jh/jsp/board/list.jsp 로 이동하게 된다.
<interceptor> 들도 나오는데 간단히 설명 하자면 Action에 있는 실행 메소드를 타기 전과 후에 prepare과 modelDriven 메소드를 함께 탄다는 것이다. params은 당연히 파라미터값들을 캐치하고 사용하기 위함이다.
BoardListAction.java
public class BoardListAction extends ActionSupport implements Preparable , ModelDriven<BoardVO>{
private BoardBO bo = new BoardBO();
private List<BoardVO> boardList;
private BoardVO vo;
public String execute() throws Exception {
boardList = bo.list(vo);
return SUCCESS;
}
public void prepare() throws Exception {
vo = new BoardVO();
}
public BoardVO getModel() {
return vo;
}
public List<BoardVO> getBoardList() {
return boardList;
}
public void setBoardList(List<BoardVO> boardList) {
this.boardList = boardList;
}
}
간단히 적어 보겠다.
이 리스트 페이지에는 검색할수 있는 기능이 있다.
그렇다면 우선 검색하는 값이 있는지 부터 프레젠테이션 계층에서 받아서 넘겨 줘야 한다.
그 값을 받기 위해 BoardVO vo;를 선언 하였고,
prepare()과 geModel()을 선언 하였다.
우선 prepare() 메소드는 Preparable 클래스에 있는 함수로 BoardListAction에서 implements 후 오버라이딩 한 메소드이다.
이 메소드는 해당 Action의 직접적인 로직을 수행하는 execute() 메소드 이전에 받은 값들을 Object 형으로 맵핑 및 저장해놓는 역할을 한다고 보면 된다.
그리하여 execute() 메소드에서 bo.list(vo); 하여 검색하고자 하는 value를 맵핑해놓은 Object형인 vo를 비즈니스로직단인 bo.list 메소드에 인자로 던져 준다. 그리고 최종적으로 검색을 했든 안했든 게시판 목록들을 List<BoardVO> 형태인 boardList 에 담아 둔다.
execute() 메소드에서 return SUCCESS;를 하는데 여기서 struts.xml에서 명시되어있는 list.jsp에 vo값들을 또다시 던져 주게 된다.
이것이 바로 getModel()의 return vo; 의 역할이라고 보면 되겠다.
그렇다면 List<BoardVO> 형인 boardList 는 어떻게 쓰이느냐 그건 list.jsp 안에서 볼수 있다.
<s:iterator value="boardList" status="stat">
</s:iterator>
위와 같이 boardList 명으로 명시 되어 있는 List 형을 반복하여 돌리는 struts 커스텀태그 iterator 되시겠다.
저와 같이 돌린 후 안에
<s:property value="title" />
프로퍼티 값들을 넣어놓으면 List의 수만큼 돌면서 게시판 목록 row에 값들이 뿌려지게 된다.
즉, DB에 있는 값만 프레젠테이션 계층에 뿌려줄 땐 prepare, ModelDriven을 사용할 필요가 없다. 그저 setter/getter 만 이용하면 된다.
하지만 게시판 jsp 페이지에서 다른 페이지로 이동하거나 어떤 값들을 전달하여야 할때 그 값이 Object 형일 때는 prepare()과 getModel() 메소드를 이용 해야 한다.
물론 여기서 다른페이지로 이동할 때 어떤 값이 Object 형이 아닐 때는 단순히 setter/getter 메소드만 이용하면 편하다.