2013년 8월 8일 목요일

[ORACLEJAVA커뮤니티]struts-config.xml이나 메시지 리소스 파일을 수정 후 웹서버를 Restart하지 않고 변경사항을 반영하는 방법

struts-config.xml이나 메시지 리소스 파일을 수정 후 웹서버를 Restart하지 않고 변경사항을 반영하는 방법 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


1.        새로운 ActionServlet을 하나 만듭니다.

package yfarm;

import javax.servlet.ServletException;
import javax.servlet.ServletConfig;
import org.apache.struts.action.ActionServlet;
import java.io.IOException;

//struts-config.xml과 메시지 Resource 파일을 수정 했을 때 자동으로 인식할 수 있게...
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.util.RequestUtils;

public class NewActionServlet 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);
        }
    }
}
                       
위의 NewActionServlet은 URL에 reload.do가 포함되어 있는 경우 초기화를 수행 하도록 합니다. 초기화는 두 단계로 진행하는데 첫째 ActionServlet의 init() 호출하여 struts-config.xml을 초기화 하며 둘째 RequestProcessor 클래스를 초기화 합니다. RequestProcessor 클래스가 초기화 되지 않으면 struts-config.xml이 수정되기 전에 사용된 Action 클래스들이 재사용 되므로 수정된 내용이 반영되지 않을 수도 있습니다.

2.        web.xml을 수정 합니다.
(사용자의 요청을 NewActionServlet이 수행하도록 수정 합니다.)

<servlet>
                <servlet-name>action</servlet-name>
                <servlet-class>yfarm.NewActionServlet</servlet-class>
                <init-param>
                        <param-name>config</param-name>
                        <param-value>/WEB-INF/struts-config.xml</param-value>
                </init-param>
                <load-on-startup>1</load-on-startup>               
        </servlet>

3.        ReloadStrutsConfigAction 클래스를 만듭니다. ( 이 클래스가 reload action인 reload.do에 대해 대응을 하는데 아무 일도 하지 않습니다.)

/*
 * Created on 2005. 5. 6.
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package oraclejava;

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

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

/**
 * @author 이종철
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

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

4.        struts-config.xml에 아래를 추가 합니다. (action-mappings에 추가)

<action
            path="/reload"
            type="oraclejava.ReloadAction"   
    />


5.        XML파일이나 메시지 리소스 등을 수정 후 URL에서 /reload.do를 불러주면 웹 서버를 재시작 하지 않더라도 수정 사항이 반영 됩니다.

댓글 없음:

댓글 쓰기