Please Enable JavaScript!
Gon[ Enable JavaScript ]

스트럿츠 (Struct) 기반 xml 을 WAS 재구동없이 자동으로 로드하기

자바(JAVA)
반응형

스트럿츠 (Struct) 기반 xml WAS 재구동없이 자동으로 로드하기

 

스트럿츠 기반으로 개발을 할 때 action 관련 xml 을 수정하거나 메시지 리소스등을

수정하게 되면 WAS 를 재가동해야되는 불편함이 있다. 수정할때 마다 재가동해야하니

시간과 인력을 엄청나게 낭비하게 되며 운영에 반영해야 되는 경우 어려움이 있다.

사람이 쓰지 않는 새벽에 반영해야 된다던지 잘못 올렸다가 금방수정할 수도 없다.

WAS 를 재로딩할려면 시간이 꽤 걸리기 때문이다. 그러나 이런 불편함을 해소할수  있는

방법이 있다.

 

전체 구현 절차는 ActionServlet 을 상속받아 사용자 정의 ActionServlet 을 만든다.

거기에 ActionServlet init() 함수를 호출하여 초기화 하고 getRequestProcessor()

함수를 호출하여 초기화 내용을 반영한다. getRequestProcessor 호출하지 않으면

이전 정보를 반영하기 때문에 재로딩 되지 않는다.

 

1. reload.do 로 호출할 클래스

단순히 호출만 하는 의도로 제작이 된것이다.


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

2. ActionServlet 클래스 제작

어플리케이션의 모든 요청을 처리하기 위한 ActionServlet 를 사용자 정의 클래스로

만들어서 web.xml 에 설정한다. 당연히 ActionServlet 클래스를 상속해서 만든다.

소스를 보게 되면 reload.do 가 호출되면서 재로딩 로직이 가동되게 되어있다.

이전소스들에 보면 RequestUtils.selectModule ( request, getServletContext() ); 처럼

RequestUtils.selectModule 로 처리하였는데 이것은 Struct 1.2 부터 deprecated 되었다.

곧 사용하지 않을 함수라는 것이다. 이것은 ModuleUtils.getInstance().selectModule();

로 교체를 하였다
public class ReloadServlet extends ActionServlet {
	protected void process(HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException {
		String uri = request.getRequestURI();
		if ((uri.indexOf(“reload.do”) != (-1))) {
            this.removeAttribute(); // Attribute 삭제
            this.init();
            ModuleUtils.getInstance().selectModule(request, getServletContext());
            ModuleConfig config = getModuleConfig(request);
            // Request 초기화를 하지 않으면 재반영 되지 않는다.
            // 이전에 내용을 가져오기 때문이다.
            getRequestProcessor(config).init(this, config);
            RequestDispatcher dispatcher = request.getRequestDispatcher(“/index.jsp”);
            dispatcher.forward(request, response);
        } else {
        	super.process(request, response);
        }
	}
	
	private void removeAttribute(){
		ServletContext context = getServletContext();
		Enumeration applications = context.getAttributeNames();
		List contextAttributes = new ArrayList();
		while (applications.hasMoreElements()) {
			String attributeName = (String) applications.nextElement();
			if (attributeName.startsWith(“org.apache.struts.”)) {
				contextAttributes.add(attributeName);
			}
		}
		for (int i = 0; i < contextAttributes.size(); i++) {
			context.removeAttribute((String) contextAttributes.get(i));
		}
	}
}

3. web.xml 에 요청을 처리할 사용자 정의 ActionServlet 을 정의한다.

action
    com.ReloadServlet

4. struct-config.xml 에 reload.do 를 호출할 Action 을 설정한다.

클래스는 위에서 만든 ReloadStructsConfigAction 로 링크를 걸면 된다.


    

반응형
Posted by 녹두장군1
,