struts1을 그대로 사용하는 것이 아니라 개발하기 좀 더 편한 방법으로 커스터마이징 해서 사용해본다.

1. lib 셋팅
생성한 프로젝트의 WEB-INF의 lib 폴더에 설정할 라이브러리 파일을 갖다 넣는다 : struts, log4j, struts-test, junit

- apache, sourceforge 사이트에서 각각 다운로드를 받는다.
Junit은 C:\eclipse\plugins\org.junit_3.8.2.v20090203-1005 에서 junit.jar  파일을 사용한다.

- struts의 lib 폴더안에 있는 라이브러리 파일을 사용한다.

- log4j는 라이브러리와 함께, log4j.properties나, log4j.xml 설정 파일을 src 폴더 아래에 넣는다.

- strutstest는 struts를 WAS를 띄우지 않고 테스트 하기 위해 필요하다. strutstest.jar 파일과 common-collection.jar 파일이 필요하다.



2. 서블릿 설정
web.xml 안에 서블릿을 설정한다.
- 다운 받아 압출을 해제한 struts 폴더 안에 struts-blank 안에 있는 web.xml 에서 복사하거나, Servlet을 하나 만들어서 web.xml 안에 생성하게 하고, 만든 Servlet은 삭제 한다.


/action -> *.do 바꾼다.



<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
 </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>


3. struts-config.xml 생성
struts-config.xml을 WEB-INF 아래 만들고 struts-blank 안에 있는 struts-config.xml 파일에서 dtd 설정을 복사해서 넣는다.

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

나머지 설정(역시 struts-blank 참조)

<struts-config>
 <!-- 액션 폼 설정 파일 -->
 <form-beans>
 </form-beans>
 
 <!-- 공통 예외처리 -->
 <global-exceptions>
 </global-exceptions>
 
 <!-- 공통 링크 이동 처리 -->
 <global-forwards>
 </global-forwards>
 
 <!-- 액션 설정 -->
 <action-mappings>
 </action-mappings>
 
 <!-- 커스터마이징된 RequestProcessor -->
 <controller>
 </controller>
 
 <!-- 다국어 처리, 에러메시지 -->
 <!--  <message-resources parameter=""></message-resources>-->
 
 <!-- 외부 프레임웍, 라이브러리 연동 -->
 <!--  <plug-in className=""></plug-in> -->
 
</struts-config>



여기까지 작업을 하고, WAS를 띄워서 http://127.0.0.1:8081/struts1/*.do 해서 * 아무이름이나 넣고 접속이 되는지 확인한다. 500에러가 발생할 것이다. 그러면 성공.
그리고 struts-config.xml 에서 아래와 같이 설정하고

<action-mappings>
  <action path="/hello" forward="/hello.jsp"></action>
</action-mappings>


설정을 해주고 http://127.0.0.1:8081/struts1/hello.do 했을 때 hello.jsp 라고 뜨는지 확인한다.

log4j 설정을 해놨다면 콘솔창에 로그가 뜬다.

4. util 패키지 않에 기본적으로 구현할 Action을 추상 클래스로 만들어서 오버라이드 시킨다.
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public abstract class BasicAction extends Action {
 
protected static Logger logger = Logger.getLogger(BasicAction.class); //log4j 설정
 
 public ActionForward execute(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception{
  
  logger.info("action path" + request.getRequestURI()); //log4j 설정
  
  return executeAction(mapping, form, request,response);
  
 }
 protected abstract ActionForward executeAction(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception;
}

5. struts에서 기본적으로 CRUD가 나오면 DispatchAction을 사용한다.
action을 만들고 테스트 한다.

public class BbsAction extends DispatchAction {
 private static Logger logger = Logger.getLogger(BbsAction.class);
 
 public ActionForward add(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception{
  
   return null;
 }
 
}

- test 패키지에서 BbsTest.java를 만들어서 테스트 한다. strutstest는 가짜로 request, response를 만들어서 테스트 할 수 있게 해준다. 아래와 같이 작성 하고, Junit으로 테스트 한다.

import java.io.File;
import servletunit.struts.MockStrutsTestCase;
public class BbsTest extends MockStrutsTestCase {
  public void setUp() throws Exception{
   super.setUp();
   this.setContextDirectory(new File("WebContent")); //반드시 WebContent가 들어가야 한다. WebContent아래 설정 파일들을 불러 오기 위해
  }
 
  public void testAdd() throws Exception{
   this.setRequestPathInfo("/bbs");
    this.actionPerform();
  }
  
  }

6. ActionForm을 안잡고 하는 방법.
ActionForm을 사용 할 경우 상당한 노가다를 해야한다. 그래서 LazyValidatorForm을 사용한다.
이것의 단점은 파라미터 검증을 할 수 없다는 것이다.(그래서 commons의 validation을 적용해서 사용한다.)
ActionForm은 타입이 똑같아야 들어가지만, BeanUtils는 타입이 달라도 들어간다.

- BbsVO 작성

- struts-config.xml 에서 추가.
 <form-beans>
  <form-bean name="lazyForm" type="org.apache.struts.validator.LazyValidatorForm"></form-bean>
 </form-beans>


<action path="/bbs"
 type="org.bnk.bbs.BbsAction"
 parameter="method"
 name="lazyForm"
 validate="false"></action> <!-- 검증을 할 수 없으므로 false -->

- BbsAction 추가

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.apache.struts.validator.LazyValidatorForm;
import org.bnk.bbs.vo.BbsCriteria;
import org.bnk.bbs.vo.BbsVO;
import org.bnk.util.VODisplayer;

public class BbsAction extends DispatchAction {
 private static Logger logger = Logger.getLogger(BbsAction.class);
 
 public ActionForward add(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception{
  
  LazyValidatorForm lazyForm = (LazyValidatorForm) form;
  
  BbsVO vo = new BbsVO();
  
  BeanUtils.copyProperties(vo, lazyForm);
  
  logger.info(VODisplayer.display(vo));
  
  return null;
 }
 
 public ActionForward update(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception{
  
  logger.info("update.......");
  return null;
 }
 public ActionForward list(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception{
  
  logger.info("list.......");
  
  LazyValidatorForm lazyForm =
   (LazyValidatorForm)form;
  
  BbsCriteria cri = new BbsCriteria();
  BeanUtils.copyProperties(cri, lazyForm);
  
  logger.info(VODisplayer.display(cri));
  
  return null;
 }
}

- BbsTest 에서 Junit 으로 테스트

import java.io.File;
import servletunit.struts.MockStrutsTestCase;
public class BbsTest extends MockStrutsTestCase {
  public void setUp() throws Exception{
   super.setUp();
   this.setContextDirectory(new File("WebContent"));
  }
 
  public void testAdd() throws Exception{
   this.setRequestPathInfo("/bbs");
   request.addParameter("method", "add");
  
   request.addParameter("title", "게시물제목");
   request.addParameter("content", "게시물내용");
   request.addParameter("writer", "작성자");  
  
   this.actionPerform();
  }
 
  public void testList()throws Exception{
   this.setRequestPathInfo("/bbs");
   request.addParameter("method", "list");
   
   request.addParameter("pageNo", "5");
   request.addParameter("keyword", "워드");
   request.addParameter("type", "title");
   this.actionPerform();
  }
}

7. BbsCriteria.java 를 만들어서 파라미터를 수집한다.
LazyValidatorForm은 파라미터를 수집한다. 그래서 페이징 할 때, 파라미터를 던지지 말고 객체를 던져서 사용한다. 만약에 파라미터가 변경이 된다면 다 고쳐야 하지만, 이렇게 따로 만들어 놓으면 여기만 고치면 된다.

- BbsTest에서 testList() 로 테스트 한다.

기본 적으로 이렇게 만들어서 개발을 하고, 여기다가 화면을 붙이면 개발 끝~

'FrameWork > Struts1' 카테고리의 다른 글

Struts1 FileDownload  (0) 2009.08.18
Struts1 fileUpload  (0) 2009.08.18
Struts1의 Action 4  (0) 2009.08.16
Struts1의 Action 3  (0) 2009.08.16
Struts1의 Action 2  (0) 2009.08.12
Struts1의 Action 1  (0) 2009.07.27
Struts1에서 ActionForm 사용하기.  (0) 2009.07.25
Struts1 에서 iBatis 사용하기  (0) 2009.07.05
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기.  (0) 2009.07.05
Struts1 개발환경 설정.  (0) 2009.07.05

+ Recent posts