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를 선택한다.
import org.apache.struts.action.*;
protected String username;
protected String password1;
protected String password2;
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;};
이런 경우 왼족에 다음과 같은 파일들이 추가된다.
import org.apache.struts.action.*;
import javax.servlet.http.*;
import java.io.*;
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");
}
import java.io.InputStream;
import java.io.FileOutputStream;
import java.util.Enumeration;
import java.util.Properties;
import java.net.URL;
*
*/
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 {
p = null;
i = this.getClass().getClassLoader().
getResourceAsStream(UserDirectoryFile);
if (null==i) {
throw new UserDirectoryException();
}
p = new Properties();
p.load(i);
i.close();
}
p = null;
System.out.println(e.getMessage());
throw new UserDirectoryException();
}
i = null;
}
/**
*
*/
public static UserDirectory getInstance() throws
UserDirectoryException {
/**
* 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) {
if (null==password) return false;
String _userId = fixId(userId);
if (!isUserExist(_userId)) return false;
return (password.equals(getPassword(_userId)));
/**
*
*/
public boolean isUserExist(String userId) {
if (null==userId) return false;
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 {
if ((null==userId) || (null==password)) {
throw new UserDirectoryException();
}
try {
p.put(fixId(userId), password);
String o = this.getClass().getClassLoader().getResource(UserDirectoryFile).getFile();
p.store(new FileOutputStream(o), UserDirectoryHeader);
throw new UserDirectoryException();
}
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
<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>
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>
<HEAD>
<TITLE>SUCCESS</TITLE>
</HEAD>
<BODY>
Registration succeeded!
<P><A href="register.jsp">try another?</A></P>
</BODY>
</HTML>
<HEAD>
<TITLE>FAILURE</TITLE>
</HEAD>
<BODY>
Registration failed!
<P><A href="register.jsp">try again?</A></P>
</BODY>
</HTML>