VMware라는 좋은 유틸이 있는 줄 몰랐습니다. 유닉스를 꺼리게 된 이유가 예전에 설치 시도가 있었는데 그 당시 파티션나누고 뭐 설정하고 어쩌고 하다보니 짜증나서 설치를 안했는데 그 뒤로 설치실패의 두렴움에 의해서 유닉스를 전혀 만져보지 않아서 완전 유닉스 맹이 되버렸습니다.

VMware라는 유틸은 가상머신을 만들어서 하나의 PC를 만드는 개념입니다. 이 유틸만 있으면 리눅스나 유닉스 그리고 윈도우까지도 동시에 설치할 수 있습니다. 자원 같은 것도 그대로 원래 PC에 있는 것을 끌어다가 써서인지 시디롬이나 사운드도 알아서 인식하며, 인터넷속도도 제대로 나오고 그렇게 느리지도 않은 것 같습니다.

이제 유닉스도 공부하면서 테스트를 해봐야겠습니다.

VMware 공식홈페이지입니다. VMware Workstation평가판 받아서 테스트해보세요.(아님 과자를 먹이던지-_-;)
http://www.vmware.com/

선사 공식홈페이지입니다. 여기서 가입하고 Solaris10 을 받을 수 있습니다.
http://www.sun.com/software/solaris/get.jsp

사용법은 매우 쉽습니다. 우선 VMware를 설치하고 새로운 가상머신을 만든 후 CD-ROM부분에서 SUN사 홈페이지에 있는 솔라리스dvd버전을 받은 후에 마운트 시켜서 파워 온을 해버리면 설치가 진행됩니다.




사용자 삽입 이미지

Solaris설치중입니다


사용자 삽입 이미지

Java Desktop System. 윈도우처럼 되어있으며 매우 깔끔합니다



사용자 삽입 이미지

웹브라우저 모습. SUN사 홈페이지가 먼저 뜨는군요.

 
Posted by 머드초보
,
 


참고로 이 방법은 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 머드초보
,
 

로그인 시스템 테스트경로입니다.
http://mudchobo.tomeii.com/MemberManager/


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




이클립스 프로젝트로 포함했습니다.

이클립스 WTP 2.0 + TOMCAT 5.5 + JDK 5.0 에서 테스트했습니다.

 
Posted by 머드초보
,