struts로 검색한 결과 :: 시소커뮤니티[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

회원가입 I 비밀번호 찾기


SSISO Community검색
SSISO Community메뉴
[카페목록보기]
[블로그등록하기]  
[블로그리스트]  
SSISO Community카페
블로그 카테고리
정치 경제
문화 칼럼
비디오게임 스포츠
핫이슈 TV
포토 온라인게임
PC게임 에뮬게임
라이프 사람들
유머 만화애니
방송 1
1 1
1 1
1 1
1 1
1

struts로 검색한 결과
등록일:2008-03-15 20:50:58
작성자:
제목:STRUTS 사용법 1


. 스트러츠 인스톨 및 사용

 

java 진영에서 시스템을 쉽게 개발할 수 있는 각종 framework이 free소프트웨어 개념으로 개발되고 있다. 대표적인 것이 struts이다.

일단 백문이 불여 일견이라고 가장 간단한 예제를 실행해서 그 구조를 살펴보도록 하자.

 

 

http://struts.apache.org/download.cgi#struts201 

에서 struts를 다운로드 한다.

 

가장 간단한 예제를 실행해 보는 것이 좋을 것이다.

스트러츠를 압축을 풀고 나면, app 디렉토리에 번들로 포함된 예제 파일이 있다.

 

 

Examples

Several example applications are bundled with the framework, as ready-to-deploy WARs.

Blank An "empty" application that you can use as the starting point for your own projects.
Showcase A sampling of common (and not so common) use cases.
MailReader A simple application that demonstrates best practices.
Portlet An application demonstrating portlet support
Other Examples Simple examples and links to "powered by" sites

 

이 중에서 blank예제를 한번 실행해보자.

예제가 WAR파일로 묶여 있기 때문에, 이것을 Tomcat환경에서 실행해보는 것은 매우 간단ㅤㅎㅏㄷ.

WAR파일은 웹어플리케이션에서 필요로 하는 기능을 담고 있는 모든 어플리케이션 파일을 하나로 압축한 것이다.

이 파일을 단순히 tomcat 설치디렉토리 밑의 webapp에 복사를 하면 된다.

지금 내가 사용하는 것은 struts 2.0.1과 tomcat5.5 이다. 따라서 struts2-blank-2.0.1.war 파일을 tomcat5.5\webapp 밑에 복사하면 된다.

이렇게 복사를 하면 톰캣이 알아서 war파일을 풀어주며, 디렉토리는 파일이름이 된다. 즉 tomcat5.5\webapps\struts2-blank-2.0.1\ 이다.

파일 압축이 모두 풀리고 나면 브라우저를 이용해서 이 프로그램을 실행해 보도록 한다.

http://localhost8080/struts2-blank-2.0.1

 

아래와 같은 결과가 나오는지 살펴보라

 

 

 

 

그렇다면 성공한 것이다.

 

다른 파일들도 한번 실행해 보길 바란다.

 

 

2. 간단한 예제 실행

 

간단한 예제를 이클립스를 통해서 구현해 본다.  이 예제는 struts 1.0버전을 기준으로 했단. 2.0 과 기교해서 유서가 만들어야 할 파일은 거의 대동소이 한다. 기본 구현은 기본적으로 같고, 다만 configuration에 해당하는 xml파일이 조금 더 추가되었고, 1.0에는 tag 리스트 라이브러리 파일을 별도로 복사해 주어야 한다. 2.0에서는 태그라이브러리가 strust-core 에 들어가버렸기 때문에 번거로운 이 작업이 줄어들었다.

기본은 대동소이하다. 단, 최초의 예제는 기존에 만들어 놓은 간단한 예제에서 우리가 손댈 파일들만을 만들어보는 것이 가장 쉬운 구현 방법이다.

기본적인 웹 디렉토리는 <Tomcat>\webapp\<원하는이름>\WEB-INF

이 디렉토리가 기본이 되어서 그 밑에 classes, lib, src, doc 등을 둘수 있다.

 

이클립스에서 프로젝트를 만들ㅤㄸㅒㅤ 아예 위 디렉토리 밑에 생성할 수 있다. 이런 경우 개발과 실행이 매우 용이하므로 추천한다. 이 외에도 다른 방법도 있다.

 

우선 이클립스의 패키지익스플로러에서 오른쪽 마우스 버튼을 눌러 새 프로젝트를 생성한다.

여기서 프로젝트를 Create project from existing source 로 생성한다.

 

 

 

생성된 프로젝트에서 오른쪽 마우스버튼을 눌러 폴더를 추가한다.

WEB-INF

WEB-INF\classes

WEB-INF\lib

WEB-INF\src

 

 

 

 

 

만들어 놓은 디렉토리를 소스와 빌드 패스로 지정하기 위해, 프로젝트->오른쪽마우스->프로퍼티를 열어서 Java Build Path를 선택한다.

 
 
 
 
자바 소스와 빌드패스를 Add Folder 버튼을 눌러서  지정하고 나면, 왼쪽 익스플로러의 정보가 바뀌게 된다.
 
 
 


 


 

 
 
이제 소스 폴더 밑에 자바 클래스를 추가해 보자.
리스트의 WEB-INF/src 의 오른쪽 마우스 버튼을 눌러 NEw>class 를 추가해 보자. 클래스 이름은 RegisterForm 이다.
 
 
 
 


 
 
 
만들어진 파일에 다음 내용을 붙여 넣자.
 
 
package app;
import org.apache.struts.action.*;
public class RegisterForm extends ActionForm {
  protected String username;
  protected String password1;
  protected String password2;
  public String getUsername () {return this.username;};
  public String getPassword1() {return this.password1;};
  public String getPassword2() {return this.password2;};
 
  public void   setUsername (String username) {this.username = username;};
  public void   setPassword1(String password) {this.password1 = password;};
  public void   setPassword2(String password) {this.password2 = password;};
}
 
그리고 화면을 보면 붉은색 에러 표시가 보일 것이다.
 
 
 
이것은 이 소스를 패키지로 하겠다는 pacakge app; 에 해당하는 디렉토리가 없기 때문이다.
따라서 src 밑에 이클립스에서 패키지디렉토리를 하나 만들고, 소스파일을 그리로 이동시킨다. 파일은 이클립스에서 드래그앤드랍으로 끌어서 app로 옮기면 된다.
이렇게 하면 package의 붉은색 경고가 사라진 것을 볼 수 있다.
 


 

 
 
 
그 다음은 import 부분의 처리이다. 현재 jar 파일들을 스트러츠의 라이브러리에서 포함시키려고 하는데 그 정보가 없어서 에러표시가 뜨는 것이다.
방법은 두가지가 있다. 스트러츠의 lib에 있는 모든 JAR파일을 지금 현재 개발 프로젝트 밑의  WEB-INF\lib 에 모두 복사하는 방법이 있다.
다른 한 방법은 이클립스의 프로젝트 프로퍼티에서 외부참조 라이브러리패스를 추가해 주는 방법이다. 이렇게 하면, 소스코드가 참조하는 JAR가 서로 버전이 다를 수가 있다. 예를들어 JDK버전이나, 아니면 Tomcat의 라이브러리 버전이 다를 경우이다.
후자를 사용했을때는 일일히 JAR를 복사하지 않아도 되므로 편리하지만, 반대로 버전문제로 프로그램이 실행되지 않는 경우가 생길 수 있다.
따라서 그냥 그런 문제 없이 사용하려면 전자의 방법을 추천하는데, 그 이유는 웹프로젝트에서 필요한 모든 파일이 하나로 묶이기때문에 배포가 용이하기 때문이다.
 
만약 후자의 경우를 사용한다면 다음과 같이 실행한다.
Java Build Path>libraries 에서 Add external jar 를 선택하고 스트러츠 라이브러리 밑의 모든 jar 파일을 선택해서 넣는다.
 


 

 

이런 경우 왼족에 다음과 같은 파일들이 추가된다.

 
 
전자의 방법으로 할때는 스트러츠의 라이브러리 밑의 모든 JAR를 WEB-INF\lib에 복사를 한다. 그리고 나서 Java Build Path > Libraries 에서 Add JARs 버튼을 눌러 WEB-INF\lib의 모든 jar를 선택해서 가져온다.
 


 


 

 
 
소스에서 붉은 경고가 모두 사라진 것을 볼 수 있을 것이다.
이클립스에서 자동으로 컴파일되는 옵션으로 되어 있다면 classes 디렉토리에 바로 컴파일된 바이너리가 올라가 있을 것이다. 확인해 보길 바란다.
 
 
다음에는 RegisterAction.java를 추가한다.
 
package app;
import org.apache.struts.action.*;
import javax.servlet.http.*;
import java.io.*;
public class RegisterAction extends Action {
public ActionForward perform (ActionMapping mapping,
                              ActionForm form,
                              HttpServletRequest req,
                              HttpServletResponse res) {
 
 // (1) Cast the form to the RegisterForm
 RegisterForm rf = (RegisterForm) form;
 
 String username  = rf.getUsername();
 String password1 = rf.getPassword1();                            
 String password2 = rf.getPassword2();                            
 
 // (2) Apply business logic
 if (password1.equals(password2)) {
  
    try {
// (3) Return ActionForward for success       
       UserDirectory.getInstance().setUser(username,password1);
       return mapping.findForward("success");
    } catch (UserDirectoryException e) {
       return mapping.findForward("failure");
    }
   
 }   
 // (4) Return ActionForward for failure
 return mapping.findForward("failure");
}
}
 
그리고 여기 UserDictionary.java 와 예외처리인 UserDictionaryException.java 를 추가한다.
 
package app;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileOutputStream;
import java.util.Enumeration;
import java.util.Properties;
import java.net.URL;
public class UserDirectory  {
    /**
     *
     */
    private static final String UserDirectoryFile =
        "resources/users.properties";

    /**
     *
     */
    private static final String UserDirectoryHeader =
        "${user}=${password}";
    /**
     *
     */
    private static UserDirectory userDirectory = null;

    /**
     *
     */
    private static Properties p;

    /**
     *
     */
    private UserDirectory() throws UserDirectoryException {
            java.io.InputStream i = null;
            p = null;
            i = this.getClass().getClassLoader().
                getResourceAsStream(UserDirectoryFile);

            if (null==i) {
                throw new UserDirectoryException();
            }
            else {
                try {
                    p = new Properties();
                    p.load(i);
                    i.close();
                }
                catch (java.io.IOException e) {
                    p = null;
                    System.out.println(e.getMessage());
                    throw new UserDirectoryException();
                }
                finally {
                    i = null;
                }
            } // end else
    } // end UserDirectory

    /**
     *
     */
    public static UserDirectory getInstance() throws
            UserDirectoryException {
        if (null==userDirectory) {
            userDirectory = new UserDirectory();
        }
        return userDirectory;
    }

    /**
     * Transform id so that it will match any conventions used by user
     * directory. The default implementation forces the id to
     * uppercase. Does <b>not</b> expect the userId to be null and
     * will throw a NPE if it is.
     *
     * @exception Throws Null Pointer Exception if userId is null.
     */
    public String fixId(String userId) {
       return userId.toUpperCase();
    }

    /**
     *
     */
    public boolean isValidPassword(String userId, String password) {
            // no null passwords
        if (null==password) return false;
            // conform userId to uppercase
        String _userId = fixId(userId);
            // no passwords for non-users
        if (!isUserExist(_userId)) return false;
            // does password match user's password
        return (password.equals(getPassword(_userId)));
    }

    /**
     *
     */
    public boolean isUserExist(String userId) {
            // no null users
        if (null==userId) return false;
            // if not null, it's a user
        return !(null==p.getProperty(userId));
    }

    /**
     *
     */
    public String getPassword(String userId)  {
          return p.getProperty(userId);
    }

    /**
     *
     */
    public Enumeration getUserIds()  {
       return p.propertyNames();
    }

    /**
     *
     */
    public void setUser(String userId, String password) throws
            UserDirectoryException {
        // no nulls
        if ((null==userId) || (null==password)) {
            throw new UserDirectoryException();
        }

        try {
            // conform userId to uppercase when stored
            p.put(fixId(userId), password);
            String o = this.getClass().getClassLoader().getResource(UserDirectoryFile).getFile();
            p.store(new FileOutputStream(o), UserDirectoryHeader);
        }
        catch (IOException e) {
            throw new UserDirectoryException();
       }
    }
} // end UserDirectory
 
 
 
 
package app;
public class UserDirectoryException extends Exception {
    // ; Empty implementation
}
 
 
 
 
자, 여기까지 하면 다음과 같은 파일 구조가 만들어져 있을 것이다.
 
이번 예제를 컴파일하기 위해서 필요한 외부 JAR파일은 정확히 3개이다. 위에서 처럼 모두 포함시킬 필요는 없다.
그 중 하나는 struts-core-1.3.5.jar  와 servlet-api.jar, jsp-api.jar 이다. 후자 2개는 tomcat의 common\lib밑에 존재한다. 일단 컴파일을 위해 이것을 외부 참조 JAR로 포함을 시켜보 그러면 화면은 다음과 같다.
 
 


 

 
 
여기까지 하고서 스트러츠가 돌아가길 기대할 것이다. 그러나 불행히도 몇개가 더 남아있다.
아니 도대체 왜 이렇게 복잡한 것이야? 투덜거릴 수 있을 것이다. 이렇게 생각하면 편하다. 프레임워크를 처음 사용할때는 조금 시간이 걸리지만, 일단 익숙해지면 많은 편리함을 얻게 되는 것이라고.
 
예제는 strust1.0을 중심으로 하고 있다. 곧 2.0을 주로 설명하게 될 것이니 이번 예제를 통해서 1.0의 실행에 대해 어렴풋이 감을 잡으면 될 것 같다. 1.0의 불편함을 알아야 2.0의 편리함을 알수 있으니 말이다.
 
* strust-config.xml 추가
WEB-INF\ 밑에 strust-config.xml 을 추가한다.
 
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD struts Configuration 1.0//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
<struts-config>
  <form-beans>
    <form-bean name="registerForm" type="app.RegisterForm"/>
  </form-beans>
 
  <action-mappings>
    <action    path="/register"
               type="app.RegisterAction"
               name="registerForm">
      <forward name="success" path="/success.html"/>
      <forward name="failure" path="/failure.html"/>
    </action>
  </action-mappings>
</struts-config>
* JSP와 html 추가
입력을 받는 register.jsp와 응답을 하는 success.html, failure.html 을 <Tomcat5.5>\webapp\<현재프로젝트> 에 넣는다.
 
[register.jsp]
<%@ taglib uri="/WEB-INF/struts-form.tld" prefix="form" %>
<form:form action="register.do">
   UserName:<form:text property="username"/><br>
   enter password:<form:password property="password1"/><br>
   re-enter password:<form:password property="password2"/><br>
<form:submit value="Register"/>
</form:form>
[success.html]
<HTML>
<HEAD>
   <TITLE>SUCCESS</TITLE>
</HEAD>
<BODY>
   Registration succeeded!
   <P><A href="register.jsp">try another?</A></P>
</BODY>
</HTML>
[failure.html]
<HTML>
<HEAD>
   <TITLE>FAILURE</TITLE>
</HEAD>
<BODY>
   Registration failed!
   <P><A href="register.jsp">try again?</A></P>
</BODY>
</HTML>
* 추가적으로 할 사항들
여기까지 하면, 일단 우리가 손을 댈 파일들은 모두 추가된 것이다. 단 여기 빠진 것이 몇개 있다. 일단 현재 이 소스에서 사용할 lib 이다. 위에서는 컴파일을 위한 외부참조만을 했으므로, 실제 WEB-INF\lib 밑에 jar파일을 넣어주어야 한다.
또한, WEB-INF에 태그 라이브러리와 web.xml도 추가되어야 한다.
이제 전체 예제가 돌아갈 수 있는 파일을 아래 압축해서 올리다. 그냥 풀어서 동작을 해보고, 위에서 우리가 손수 만든 파일들과 기타 부가적으로 추가된 것들을 비교하기 바란다. struts 2.0에서는 번거로운 태그라이브러리 생성등이 사라졌다.
다음 예제로는 2.0 의 가장 간단한 예제를 통해 스트러츠를 하나씩 기능 추가해 나가는 것을 시도해 보도록 하자.