2007년 2월 14일 수요일

서버 재시작 없이 스트럿츠 설정 파일 초기화

스트럿츠 기반으로하는 웹 애플리케이션을 개발할 때 가장 불편한 점은 struts-config.xml파일을 수정하거나 메시지 리소스 파일을 수정했을때 자동으로 반영되지 않는다는것이다. 애플리케이션을 개발할때 struts-config.xml 또는 메시지 리소스 파일의 수정은 빈번하게 발생한다.

1. ActionServlet 확장하기
struts-config.xml과 메시지 리소스 파일의 초기화는 전적으로 ActionServlet이 담당한다.
서버의 재시작이 없어야 하기 때문에 애플리케이션에 struts-config.xml과 메시지 리소스 파일을 초기화 하라는 요청을 해야한다. 이곳에서 구현하는 예제는 초기화를 위한 요청으로 'reload.do' 를 사용하였다.

ActionSerlet을 상속하는 MyAppServlet

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionServlet;
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.util.RequestUtils;

public class MyAppServlet extends ActionServlet {

 protected void process(
  HttpServletRequest request,
  HttpServletResponse response)
  throws IOException, ServletException {
  String uri = request.getRequestURI();

  if ((uri.indexOf("reload.do") != (-1))) {
   init();

   RequestUtils.selectModule(request, getServletContext());
   ModuleConfig config = getModuleConfig(request);
   getRequestProcessor(config).init(this, config);

   RequestDispatcher dispatcher =
    request.getRequestDispatcher("/reload.jsp");
   dispatcher.forward(request, response);
  } else {
   super.process(request, response);
  }
 }
}

첫번째단계: ActionServlet의 init()메소드를 호출함으로써 struts-config.xml의 설정 파일을 초기화할 수 있다.
두번째단계: RequestProcessor 클래스를 초기화하는 과정이다.RequestProcessor 클래스 한번 호출된 Action 클래스들을 HashMap에 저장하여 재사용하는 방식을 취한다.

2. MyAppServlet 사용하기
ActionServlet 대신 MyAppServlet이 애플리케이션의 모든 요청을 처리하는 진입점이 되게 변경하는 일은 web.xml이 담당한다. web.xml파일을 열어서
<servlet-class>
   org.apache.struts.action.ActionServlet
</servlet-class>
이 부분을 아래와 같이 수정하여 준다.
<servlet-class>
   com.xxx.xxx.MyAppServlet
</servlet-class>

이러고나면 애플리케이션으로 들어오는 모든 요청은 MyAppServlet이 담당하게 된다.

3. ReloadStrutsConfigAction 추가하기
스트럿츠의 초기화를 위한 URL로 'reload.do'를 사용하는것을 원칙으로 정했다. 따라서 reload.do를 호출할 때 사용할 빈 Action 클래스가 필요하다.
ReloadStrutsConfigAction.java

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 * @struts.action
 *      path="/reload"
 */
public class ReloadStrutsConfigAction extends Action{

 public ActionForward execute(
  ActionMapping mapping,
  ActionForm form,
  HttpServletRequest request,
  HttpServletResponse response)
  throws Exception {
 
  return null;
 }

}

또한 Struts-config.xml파일에 다음과 같이 Action매핑을 해주어야 한다.
<action
      path="/reload"
      type="com.xxx.xxx.ReloadStrutsConfigAction">
</action>

Struts 1.3.5부터 전체 패키지 구조가 변경됨으로 인하여 윗방식으로 struts-config.xml을 자동로딩 할수가 없습니다.

댓글 없음:

댓글 쓰기