우선 간단히 구조를 살펴보도록 합시다.

simpleboard패키지안에 actions, controller, jdbcdriver, model이 있습니다.

actions
deleteAction클래스 - 글을 지울 때 쓰이는 액션
listAction클래스 - 글목록을 보여줄 때 쓰이는 액션
modifyAction클래스 - 글을 수정할 때 쓰이는 액션
modifyformAction클래스 - 글을 수정할 때 비밀번호를 입력해서 맞는지 확인할 때 쓰이는 액션
showAction클래스 - 글을 볼 때 쓰이는 액션
writeAction클래스 - 글을 쓸 때 쓰이는 액션

controller
KoRequestProcessor클래스 - 잘은 모르지만 한글을 가능하게 해주는 클래스입니다.

jdbcdriver
DBCInit클래스 - DB를 초기화시키는 클래스가 있습니다.

model
Board클래스 - 객체에 내용을 담을 수 있게 해주는 빈클래스입니다.
BoardDAO클래스 - write, delete, modify, getList 등 실제적으로 수행하는 메소드를 모아놓은 클래스입니다.

클래스 구조는 대충 이렇습니다.
간단합니다. 예를 들면 write.do액션이 들어오면 writeAction을 수행하는데 이 클래스 안에서 DAO를 생성해서 write메소드를 호출하는 형식으로 되어있습니다.
나머지 delete나 modify도 같은 형식으로 이루어져 있습니다.

조금 다른 list보기를 설명해보도록 하겠습니다.
struts-config에 다음과 같이 액션매핑에 액션을 정의합니다.
<action path="/list"
    type="simpleboard.actions.listAction"
    scope="request">
   <forward name="success" path="/list.jsp"/>
 </action>

list.do를 실행하면 listAction을 실행하는데 성공을 리턴하면 list.jsp를 포워드하라는 뜻입니다.

listAction을 보도록 합시다.

listAction.java
[code]
package simpleboard.actions;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import java.util.List;
import simpleboard.model.Board;
import simpleboard.model.BoardDAO;

public class listAction extends Action {
    final int countPerPage = 10;
    public ActionForward execute(   ActionMapping mapping,
                                    ActionForm form,
                                    HttpServletRequest request,
                                    HttpServletResponse response)
                                    throws Exception{
        int currentPage;
        int totalPage;       
        String pageNum = request.getParameter("page");

        if (pageNum == null)
            pageNum = "1";
        currentPage = Integer.parseInt(pageNum);
        BoardDAO dao = new BoardDAO();

        List<Board> BoardList = dao.getList(currentPage, countPerPage);
        totalPage = dao.getTotalPage(countPerPage);

        HttpSession session = request.getSession();
        session.setAttribute("boardlist", BoardList);
        request.setAttribute("currentpage", new Integer(currentPage));
        request.setAttribute("totalpage", new Integer(totalPage));
        request.setAttribute("nextpage", new Integer(currentPage+1));
        request.setAttribute("prevpage", new Integer(currentPage-1));

        return mapping.findForward("success");
    }
}
[/code]
우선 list.do?page=숫자 형식으로 실행하는데 list.do로 실행하게되면 1로 인식을 하게 됩니다.
그리고 받은 값을 DAO의 geList에 2개의 인자를 전달합니다(현재페이지번호, 한페이지당게시물수).
현재페이지번호에 맞는 게시물들을 List에 다 받게 됩니다. 이것을 session에 저장해서 list.jsp에 출력해주는 식입니다.

그리고, 총페이지수와 다음페이지, 이전페이지 값을 전달해줘서 처음인지 끝인지를 판단할 수 있게하고 다음페이지와 이전페이지를 수행하도록 값을 넘겨줍니다.

이제 list.jsp를 보도록 합시다.

list.jsp
[code]

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>

<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld"  prefix="bean" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<
html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>심플보드에 오신 것을 환영합니다</title>
</head>
<body>
<center>
<table border="1" width="500" height="50">
    <tr>
        <td align="center" bgcolor="dddddd">간단한 게시판 (Simple Board)</td>
    </tr>
</table>
<table width=500 border="1">
    <tr bgcolor="#7eaee9" height="25">
        <th width="40" align="center">번호</th>
        <th width="380" align="center">제목</th>
        <th width="80" align="center">글쓴이</th>
    </tr>
    <logic:iterate id="list" name="boardlist">
        <tr>
            <td><bean:write name="list" property="id"/></td>
            <td><html:link page="/show.do" paramId="id" 
                        paramName="list" paramProperty="id">
                <bean:write name="list" property="title"/>
                </html:link>
            </td>
            <td><bean:write name="list" property="name"/></td>
        </tr>
    </logic:iterate>
    <tr>
        <td colspan="3">
        <logic:notEqual name="currentpage" value="1" scope="request" >
            <html:link page="/list.do" paramId="page" paramName="prevpage">
                  [이전페이지]
            </html:link>
        </logic:notEqual>
        <bean:write name="currentpage"/>
        <logic:notEqual name="currentpage" 
          value="<%= request.getAttribute("totalpage").toString() %>"
          scope="request" >
            <html:link page="/list.do" paramId="page" paramName="nextpage">
                  
[다음페이지]
             </html:link>
        </logic:notEqual>
        </td>
    </tr>
    <tr>
        <td colspan="3" align="right">
            
<html:link page="/writeForm.do">글쓰기</html:link>
       
</td>
    </tr>
</table>
<table border="1" width="500" height="28">
    <tr>
        <td align="center" bgcolor="dddddd">제작자 : 성종천(mudchobo@nate.com)</td>
    </tr>
</table>
</center>
</body>
</html>
[/code]
잘 보면 26번라인에 logic:iterate부분은 그 사이를 boardlist에 있는 수만큼 반복해서 출력하라는 것입니다. bean:write를 이용해서 값을 출력하는 것입니다.
그 다음 [다음페이지] [이전페이지] 표현 부분은 링크에다가 뒤에 paramId가 page고 nextpage값이 3이면
list.do?page=3 이라고 요청하게 되는 것입니다.

logic:notEqual은 name에 있는 값이 value값이랑 비교해서 같지 않으면 그 태그안에 있는 내용을 수행하라는 뜻입니다. 스트럿츠의 태그라이브러리가 궁금하신 분은
http://blog.naver.com/wildxing?Redirect=Log&logNo=20033916985
이 분 블로그에서 검색을 "태그라이브러리" 로 검색하면 다나옵니다. 보셔서 참조하세요.

스트럿츠의 태그라이브러리를 사용하니까 jsp코드가 매우 깔끔해집니다.
오늘은 여기까지-_-;

  1. 스트럿츠로 제작한 게시판 소스입니다.
 
Posted by 머드초보

댓글을 달아 주세요

  1. 투모우로 2007.11.11 01:14  댓글주소  수정/삭제  댓글쓰기

    참말로 감사함니다.

  2. 초보 2007.12.23 08:39  댓글주소  수정/삭제  댓글쓰기

    머드초보님
    저는 리스트가 null일경우를 대비하여
    listAction.java에 아래의 판단 부분을 추가하였읍니다.

    if(totalPage==0){
    request.setAttribute("totalpage", new Integer(pageNum));
    }else{
    request.setAttribute("totalpage", new Integer(totalPage));
    }

    • BlogIcon 머드초보 2007.12.23 12:27  댓글주소  수정/삭제

      아하 그렇군요 ^^
      지금 소스를 보니까....왜 저게 세션으로 저장을 하지-_-;
      아주 옛날에 짠거라 ㅠㅠ
      어쨌든 감사합니다 ^^

  3. 이태현 2008.01.31 22:14  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 머드초보님
    귀한 소스 감사합니다

    머드초보님 소스를 가지고 스트럿츠 구성을 공부중입니다

    로그인부터 게시판까지 연동중인데요(게시판의 내용은 제가 조금씩 손 보고 있습니다만)
    루트에 파일이 들어가는 부분(로그인)과 폴더를 만들어 그 하위에 파일이 들어가는 부분(게시판)을 만들고 있는데요
    폴더를 만들고 그 하위에 들어가는 파일들의 경로를 어떻게 지정해야 하는건가요


    <action path="/list"
    type="boardManager.actions.listAction" scope="request">
    <forward name="success" path="/list.jsp"/>
    </action>
    에서 list.jsp 를 호출하는데 list 파일은 webcontent/board/list.jsp 라는 구조를 가집니다
    ./board/list.jsp
    /board/list.jsp
    board.list.jsp
    다 안먹어서 어떻게 연결해야 하는지 알수가 없네요
    foxknight@nate.com 으로 답변 주시면 감사하겠습니다 (__)

    • BlogIcon 머드초보 2008.02.01 00:22  댓글주소  수정/삭제

      안녕하세요!
      우선 MVC모델에서는 JSP를 직접호출하지 않습니다.
      list.do 라는 것을 요청하는 것이죠.
      그러면 그 해당액션을 보고 어디로 갈지 결정을 하는것입니다 ^^
      즉 /board/list.do를 요청하면 listAction클래스로 가는거겠죠?^^
      도움이 되셨기를 바랍니다 ^^
      우와.....이거 좀 오래된소스라서....
      이거 보고하시면 안되는데 ^^

  4. BlogIcon 유리망치 2009.03.24 18:40  댓글주소  수정/삭제  댓글쓰기

    좋은 자료 퍼가여