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

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  댓글주소  수정/삭제  댓글쓰기

    좋은 자료 퍼가여

 

저번에 어설픈 방명록, 로그인시스템에 이어 이번에도 어설픈 게시판을 제작해 보았습니다. 스트럿츠로 삽질하시는 분들에게 조금이나마 도움이 되었으면 합니다.

소스설명과 간단한 팁을 차후에 올리도록 하겠습니다-_-;(지금은 피곤해서-_-;)

게시판주소입니다.
http://mudchobo.tomeii.com/SimpleBoard/


소스파일입니다.



참고로 이클립스WTP 2.0 + 톰캣5.5 + JDK5.0 + 스트럿츠1.3.8 에서 제작했습니다.

ps. 가끔 broken pipe어쩌구 에러 뜨는데 F5무한연타하시면 뜹니다. 왜그러는지 잘모르겠습니다.
 
Posted by 머드초보

댓글을 달아 주세요

  1. qwe 2007.09.05 10:47  댓글주소  수정/삭제  댓글쓰기

    eqw

  2. 스트럿츠 초보자 2007.10.12 15:52  댓글주소  수정/삭제  댓글쓰기

    db 소스는 없나요 ^^;;
    있으면 db소스도 부탁 드립니다. ^^;;

    • BlogIcon 머드초보 2007.10.12 16:53  댓글주소  수정/삭제

      CREATE TABLE `Board` (
      `b_id` int(11) NOT NULL auto_increment,
      `b_name` varchar(10) NOT NULL,
      `b_pwd` varchar(10) NOT NULL,
      `b_title` varchar(30) NOT NULL,
      `b_content` mediumtext NOT NULL,
      PRIMARY KEY (`b_id`)
      ) ENGINE=MyISAM DEFAULT CHARSET=euckr AUTO_INCREMENT=85 ;

      phpmyadmin에서 직출했어요^^ 저도 db를 잘 몰라서 phpmysql에서 만든겁니다.
      db는 저게 다인데요 ^^
      뭐 별거 없는데^^
      어쨌든 열공하세요 왠만하면 다른거 보고하세요-_-;
      저거 너무 허접해서-_-;

  3. 초보 2007.12.05 21:58  댓글주소  수정/삭제  댓글쓰기

    수고많습니다.
    좋은 소스 올려쥬셔서 감사합니다.
    소스를 훌터 보았는데요.
    DB 련결은 어느 부분인지 잘모르겠네요.
    지금 저는 "스트럿츠로 만든 매우 간단한 게시판"
    DB이름이 무엇인지 조차 모르겠네요.


    예를 들면 아래와 같은 부분입니다.
    ===============================================
    url=jdbc:mysql://dbaddress:3306/dbname
    ===============================================


    그럼잘 부탁드리겠습니다.

    • BlogIcon 머드초보 2007.12.05 23:07  댓글주소  수정/삭제

      음 이거 제가 웹프로그래밍 처음 시작하면서 만든거라 좀 허접한데요-_-;
      우선 DB를 공부하셔야할 것 같은데요.
      DB주소는 그 DB가 설치된 주소, 즉 IP나 도메인이름이 되겠구요.
      만약 자신의 PC에 mysql를 설치했다면
      주소는 http://localhost:3306이 되겠네요.
      dbname은 그 mysql에서 db를 여러개 만들 수 있는데요.
      말그대로 db이름인데요. 음......
      자신이 설치한 db에서 create명령어로 db를 만들 수 있어요.
      만든다음에 거기에 테이블을 생성하죠.
      위에 테이블구조있죠? 그걸로 테이블을 생성한다음에
      insert로 값을 넣거나 select로 값을 조회할 수 있죠.
      db를 공부하시면 됩니다. 기본적인것은 금방 배우실 껍니다^^

    • 초보 2007.12.06 00:41  댓글주소  수정/삭제

      빠른 회답,상세한설명 감사합니다.
      한가지 더 부탁하고 싶은데요.

      아래
      ===============================================
      url=jdbc:mysql://dbaddress:3306/dbname

      제가 늘사용중인 postgresql DB설정은 아래와같음니다만
      url="jdbc:postgresql://localhost:5432/testDB";
      user="postgres";
      pwd="postgres";
      ===============================================
      요부분입니다.
      샴플"SimpleBoard.zip"중 어느파일에서 설정되여있는거지 모르겠읍니다.
      제가 왕창초보라서로 소스분석이 잘안되네요.

      혹씨 "url=jdbc:mysql://dbaddress:3306/dbname"방법 이외에 다른방법으로 DB연결 시킨것인지요.

      이상, 잘부탁합니다.

    • BlogIcon 머드초보 2007.12.06 08:15  댓글주소  수정/삭제

      아네 SimpleBoard/build/classes에 보시면
      pool1.jocl이라는 파일이있는데요.
      거기서 설정해주는 겁니다.
      이게 dbcp하는 방법인데요. DBCP에 관해서는요
      http://javacan.madvirus.net/main/content/read.tle?contentId=92
      여기에 친절하게 하는법까지 자세히 나타나있어요.

      참고로 iBATIS라는 프레임워크를 사용하게 된다면
      저 DBCP하는 방법보다 훨씬 쉽게 할 수 있습니다 ^^

    • 초보 2007.12.06 11:41  댓글주소  수정/삭제

      역씨, 제가 생각도 못한부분이였읍니다.
      감사함니다.

    • BlogIcon 머드초보 2007.12.06 21:15  댓글주소  수정/삭제

      아네 방문해주셔서 감사합니다. 그리고 관심(?)가져주셔서 감사합니다ㅠㅠ

  4. 초보 2007.12.13 12:41  댓글주소  수정/삭제  댓글쓰기

    머드초보님 여기 왕초보 또 부탁하겠읍니다.
    지금 저의 PC(WindowsXP,Java5,Struts,Mysql)에서 jsp와 java소스를 UTF-8로 변경한다음 샘플을 실행한결과 글이깨집니다. DB를 본결과 올린글이 깨진상태로 등록돼이었읍니다. 인터넷을 찾아봐도 별다른 해결책을 찾질 못하고 있읍니다. 요부분에 관하여 좋은 의견 올려주시면 감사하겠읍니다.
    전에는 PC(Linux,Java5,Struts,Postgres)에서는 문제없었음니다만, 이번에 처음으로 Windows에서 Struts+Mysql개발환경을 리용하고 있읍니다.

  5. 초보 2007.12.13 12:56  댓글주소  수정/삭제  댓글쓰기

    글깨지는 문제해결되였읍니다.
    금방 또 소스확인한결과 엔코드 수정이 빠뜨린곳을 발결하였읍니다.
    UTF-8로 수정하고 실행한결과 지금은 정상적으로 술술 돌아감니다.
    늘 친절하게 대응하여 주셔서 감사합니다.

  6. 초보 2007.12.16 01:40  댓글주소  수정/삭제  댓글쓰기

    머드초보님 또 부탁해도 될른지요.
    저로서는 방법을 찾질 못하고 있읍니다....ㅠ.ㅠ
    지금 Paging 처리를 "[이전페이지] [1] 2 [3] [4] [다음페이지 "처럼
    링크한 페지번호를 액센에 넘길라고합니다.
    참고할수있는자료주소거나 방법을 알려주시면 감사하겠읍니다.

    • BlogIcon 머드초보 2008.01.26 17:38  댓글주소  수정/삭제

      음 그거 http://localhost:8080/list.do?page=2와 같이 parameter를 넘기면 그걸 액션에서 받아서 처리를 하는 식인데요.
      그 데이터를 액션에 받을 때 2를 받으면 현재페이지가 몇인지를 계산하고 이전페이지는 현재페이지번호에 하나를 뺀거구요.
      이런식으로 구현하면 돼요.
      좋은예제가 최범균의 JSP 2.0 프로그래밍 이라는 책에 방명록 예제가 있는데 거기에 MVC형태의 방명록예제가 있을껍니다. 참조하시면 될껍니다^^

  7. 초보 2007.12.20 08:09  댓글주소  수정/삭제  댓글쓰기

    해결되였음니다. 감사합니다.

 


참고로 이 방법은 STRUTS에서 사용하는 방법이 아니라 JSP에서 사용하는 방법입니다.

STRUTS에서 하는 법을 잘 몰라서 'JAVA.WEB CAN DO IT'이라는 사이트에서 JSP에서 DBCP를 사용하는 방법을 사용했습니다.

1.2.9버전에는 getDataSource라는 메소드가 있는데 1.3.8에서는 없습니다. 그래서 DataSource를 가져오는 법을 잘 몰라서 이번 예제에서는 그냥 jsp에서 사용하는 dbcp를 사용했습니다.

dbcp를 사용하기 위해서는 3가지 파일이 필요합니다.

DBCP API 관련 Jar 파일
http://commons.apache.org/downloads/download_dbcp.cgi

DBCP API가 사용하는 자카르타 Pool API의 Jar 파일
http://commons.apache.org/downloads/download_pool.cgi

Pool API가 사용하는 자카르타 Collection API의 Jar 파일
http://commons.apache.org/downloads/download_collections.cgi

여기서 받은 파일을 압축풀면 jar파일이 나오는데 이것을 lib폴더에 넣어야 합니다.

DBCP를 설정하는 방법은 아래 사이트를 참고하시기 바랍니다.
http://javacan.madvirus.net/main/content/read.tle?contentId=92

로그인시스템 소스파일입니다.
 
Posted by 머드초보

댓글을 달아 주세요

 

이번엔 클래스 구조에 대해서 설명하겠습니다.

membermanager - actions : Action클래스
                        - beans : bean과 process클래스
                        - controller : RequestProcessor있는 곳
                        - jdbcdriver : dbcp을 사용하기 위해 만든 클래스

action클래스
loginAction - 로그인을 하기 위한 Action클래스
joinAction - 회원가입을 하기 위한 Action클래스
logoutAction - 로그아웃을 하기 위한 Action클래스
deleteAction - 회원탈퇴를 하기 위한 Action클래스
modifyAction - 회원수정을 하기 위한 Action클래스
modifyformAction - 회원수정을 위한 자료를 가져오기 위한 Action클래스

bean, process클래스
MemberInfoBean - 회원정보 빈
MemberManagerProcess - Process클래스로 Login, Join, Modify, Delete 등의 Action에서 사용될 메소드를 정의해 놓은 클래스

controller(RequestProcessor)클래스
KoRequestProcessor - 잘은 모르겠지만 한글가능하게 하고 타일즈 사용하게 하는 거 같습니다-_-;

jdbcdriver클래스
DBCPInit - 커넥션풀을 이용하기 위해 정의한 클래스(나중에 설명)

이런식으로 구조가 되어 있습니다.
struts-config.xml파일을 봅시다.

struts.config.xml
[code]
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>
   
    <form-beans>
   
        <form-bean  name="DynaForm"
                    type="org.apache.struts.action.DynaActionForm">
            <form-property name="id" type="java.lang.String"/>
            <form-property name="pwd" type="java.lang.String"/>
            <form-property name="name" type="java.lang.String"/>
            <form-property name="ssn" type="java.lang.String"/>
            <form-property name="email" type="java.lang.String"/>
            <form-property name="phone" type="java.lang.String"/>
        </form-bean>
       
    </form-beans>

    <action-mappings>
   
        <action path="/welcome"
                forward="/index.jsp"/>
       
        <action path="/main"
                forward=".layout-main"/>
               
        <action path="/loginForm"
                forward=".layout-login"/>
       
        <action path="/joinForm"
                forward=".layout-join"/>
               
        <action path="/modifyForm"
                type="membermanager.actions.modifyformAction">
            <forward name="success" path=".layout-modify" />
        </action>
               
        <action path="/login" type="membermanager.actions.loginAction"
              name="DynaForm"
              scope="request"
              validate="true"
              input="/loginForm.do">
            <forward name="success" path="/main.do" redirect="true"/>
            <forward name="fail" path="/loginForm.do" />
        </action>
       
        <action path="/join" type="membermanager.actions.joinAction"
              name="DynaForm"
              scope="request"
              validate="true"
              input="/joinForm.do">
            <forward name="success" path="/main.do" redirect="true"/>
            <forward name="fail" path="/joinForm.do" />
        </action>
       
        <action path="/modify" type="membermanager.actions.modifyAction"
                name="DynaForm"
                scope="request"
                validate="true"
                input="/modifyForm.do">
            <forward name="success" path="/main.do"/>
            <forward name="fail" path="/modifyForm.do" />
        </action>
       
        <action path="/delete" type="membermanager.actions.deleteAction">
            <forward name="success" path="/main.do"/>
        </action>
       
        <action path="/logout"
                type="membermanager.actions.logoutAction">
            <forward name="success" path="/main.do" redirect="true"/>
        </action>

    </action-mappings>
   
    <controller processorClass="membermanager.controller.KoRequestProcessor"/>
   
    <message-resources parameter="membermanager.resources.application" />
   
    <plug-in className="org.apache.struts.tiles.TilesPlugin">
        <set-property property="definitions-config" value="/WEB-INF/config/tiles-defs.xml"/>
        <set-property property="definitions-debug" value="2"/>
        <set-property property="definitions-parser-details" value="2"/>
        <set-property property="definitions-parser-validate" value="true"/>
    </plug-in>
   
</struts-config>
[/code]
다음과 같이 action-mappings를 설정합니다. 예를 들어 login.do를 사용하게 되면 loginAction을 실행하는데 DynaForm을 사용하며 success를 forward하면 main.do로 가고 fail을 받으면 다시 loginForm으로 가는 그런 Action으로 구성되어 있습니다.

여기서 DynaForm은 동적 폼을 말합니다. 전에는 Form을 Action하 위해서는 ActionForm을 사용했는데 DynaActionForm을 사용하게 되면 따로 클래스를 제작하지 않아도 struts-config.xml에서 직접 값을 전달하게 됩니다.

Action클래스를 한개만 열어서 설명해봅시다-_-;(다하면 빡쎄니까-_-;)
[code]
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 org.apache.struts.action.DynaActionForm;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.ActionMessage;

import membermanager.beans.MemberManagerProcess;

public class loginAction extends Action{

    public ActionForward execute(   ActionMapping mapping,
                      ActionForm form,
                      HttpServletRequest request,
                      HttpServletResponse response) throws Exception{
     
        DynaActionForm loginForm = (DynaActionForm)form;
        ActionMessages errors = new ActionMessages();
        MemberManagerProcess mmp = new MemberManagerProcess();
       
        // 폼에서 id와 pwd를 받아옴.
        String id = (String)loginForm.get("id");
        String pwd = (String)loginForm.get("pwd");
       
        if (id.equals("")) {
            errors.add("requiredID",new ActionMessage("error.id.required"));
        }
       
        if (pwd.equals("")) {
            errors.add("requiredPassword",
                             new ActionMessage("error.password.required"));
        }
       
        // Process클래스에서 Login을 실행해서 결과값을 리턴
        int result = mmp.Login(id, pwd);
           
        // 결과값에 따라 에러메시지설정.
        if (result == 0) {
            HttpSession session = request.getSession();
            session.setAttribute("id", id);
            return mapping.findForward("success");
        }
        else if (result == 1) {
            errors.add("invalidPassword",
                           new ActionMessage("error.password.invalid"));
        }
        else if (result == 2) {
            errors.add("invalidID", new ActionMessage("error.id.invalid"));
        }
       
        //에러를 저장.
        saveErrors(request,errors);
       
        return mapping.findForward("fail");
    }
}
[/code]

주석에다가 다 설명해 놨습니다. 폼에 있는 내용을 검증하기 위해서는 DynaActionForm에서 제공하는 get메소드를 통해 폼값을 얻어옵니다. 그래서 검사하면 되는 겁니다.

로그인시스템 소스파일입니다.
 
 
Posted by 머드초보

댓글을 달아 주세요

 

스트럿츠로 로그인 시스템을 만들어보도록 합시다.

이번엔 TILES를 이용해서 레이아웃을 꾸며봅시다.

TILES는 JSP의 include와 비슷한 역할을 합니다.

jsp파일의 구성을 보도록 합시다.

index.jsp - 가장 처음 시작될 때 실행.
main.jsp - 메인화면이다. 이곳에 tiles를 이용해서 top, left, right, bottom을 insert하게 됨.(뭔말인지 모르지만 소스를 보면 쉽게 알 수 있다. top,left,bottom은 고정되어있으며 right페이지만 바뀐다.)
top.jsp - 맨 위에 제목을 나타내는 jsp파일.
bottom.jsp - 맨 아래에 저작권 같은 거 쓰는 jsp파일.
left.jsp - 왼쪽에 메뉴를 나타내는 jsp파일.
right.jsp - 오른쪽에 로그인 정보 및 환영메시지를 나타내는 jsp파일.
joinForm.jsp - 회원가입시 쓰이는 Form이 들어있는 jsp파일.
loginForm.jsp - 로그인시 쓰이는 Form이 들어있는 jsp파일.
modifyForm.jsp - 수정시 쓰이는 Form이 들어있는 jsp파일.

tiles를 사용하기 위해서는 struts-config.xml파일에 아래와 같은 plug-in 태그를 넣습니다.

struts-config.xml
[code]
<plug-in className="org.apache.struts.tiles.TilesPlugin">
        <set-property property="definitions-config" value="/WEB-INF/config/tiles-defs.xml"/>
        <set-property property="definitions-debug" value="2"/>
        <set-property property="definitions-parser-details" value="2"/>
        <set-property property="definitions-parser-validate" value="true"/>
</plug-in>
[/code]
tiles의 정의파일을 생성해서(tiles-defs.xml) 정의파일에는 다음과 같이 넣습니다.

tiles-defs.xml
[code]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
<tiles-definitions>
    <definition name=".layout-main" path="/main.jsp">
        <put name="title" value="회원관리시스템 ver 1.0"/>
        <put name="top" value="/top.jsp"/>
        <put name="left" value="/left.jsp"/>
        <put name="right" value="/right.jsp"/>
        <put name="bottom" value="/bottom.jsp"/>
    </definition>
   
    <definition name=".layout-login" extends=".layout-main">
        <put name="right" value="loginForm.jsp"/>
    </definition>
   
    <definition name=".layout-join" extends=".layout-main">
        <put name="right" value="joinForm.jsp"/>
    </definition>
   
    <definition name=".layout-modify" extends=".layout-main">
        <put name="right" value="modifyForm.jsp"/>
    </definition>
</tiles-definitions>
[/code]
내용은 간단합니다. 예를 들어서 .layout-main이라는 이름을 정의해서 각각의 title, top, left, right, bottom 이라는 이름에 해당 jsp파일을 넣는 그런뜻입니다.
아래 보면 extends라고 되어있는데 이것은 .layout-main에 있는 내용 그대로 받고 right부분만 put을 해서 그부분만 고치겠다는 그런 내용입니다.

자 이제 main.jsp를 한번 보도록 합시다.

main.jsp
[code]
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
<!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><tiles:getAsString name="title"/></title>
</head>
<body>
<center>
<table width="500" border="0" cellspacing="0" cellpadding="0">
    <tr>
        <td colspan="2"><tiles:insert attribute="top"/></td>
    </tr>
    <tr>
        <td width="200" bgcolor="#eeeeee" valign="top">
        <tiles:insert attribute="left"/></td>
        <td width="300" bgcolor="#dddddd" valign="top">
        <tiles:insert attribute="right"/></td>
    </tr>
    <tr>
        <td colspan="2"><tiles:insert attribute="bottom"/></td>
    </tr>
</table>
</center>
</body>
</html>
[/code]
tiles:insert해서 attribute값은 방금 정의파일에서 정의한 이름을 되어있습니. 매우 간단합니다.

자 이제 tiles를 사용하려면 RequestProcessor를 사용해야 합니다 (안 넣으면 안됩니다. 이유는모릅니다.--')

KoRequestProcessor.java
[code]
package membermanager.controller;
import java.io.UnsupportedEncodingException;
import org.apache.struts.tiles.TilesRequestProcessor;
import javax.servlet.http.*;
public class KoRequestProcessor extends TilesRequestProcessor{
    protected boolean processPreprocess(HttpServletRequest request,
        HttpServletResponse response) {
        try {
            // HTTP 파라미터의 인코딩을 설정한다.
            request.setCharacterEncoding("euc-kr");
        } catch (UnsupportedEncodingException e) {
            // do nothing;
        }
        return true;
    }
}
[/code]
이것은 잘보면 TilesRequestProcessor를 상속 받아서 정의되어 있습니다.
이것을 쓰기 위해서는 struts-config.xml에 이것을 추가해야 합니다.
<controller processorClass="membermanager.controller.KoRequestProcessor"/>

자 이제 보면 action은 어떻게 정의가 되어있는지 봅시다. tiles정의파일에 정의한 이름 그대로 액션시키면 됩니다.
<action path="/main"
    forward=".layout-main"/>

로그인시스템 소스파일입니다.

 
Posted by 머드초보

댓글을 달아 주세요

  1. kmu1211&nate점com 2011.10.07 11:41  댓글주소  수정/삭제  댓글쓰기

    많은 도움이 되었습니다.
    좋은정보감사합니다.