스트러츠의 모든 클래스는 org.apache.struts.action.ActionServlet 클래스를
상속받아 작성이된다.(그렇게 알고있다..ㅡㅡ;)

web.xml 에서 설정한  ActionServlet 클래스가 로더되기전에 모듈설정 초기화를 할수있는 클래스를 아래와 작성하여
reload.do 라는 URI 가 들어왔을때 모든 모듈 설정 클래스들을 초기화할수있게 하면
struts-config.xml 의 action을 추가할때마다 restart 하지않아도 바로 적용이된다.

struts1 13.10 버전에서 테스트 하였다.
아래의 클래스는 위의 제목의 주소에서 퍼왔다..(죄송해요...카페가입이 안되어있으면 글남기기가안되서 무단으로.;;)

* web.xml을 아래와 같이 변경해준다.

<servlet-class>my.MyActionServlet</servlet-class> 


예제)
package my; 

import java.io.*; 
import java.util.*;

import javax.servlet.*; 
import javax.servlet.http.*; 

import org.apache.struts.*; 
import org.apache.struts.action.*; 
import org.apache.struts.config.*; 
import org.apache.struts.util.*; 

/**
 * <pre>
 * struts-config.xml과 메시지 리소스 파일의 수정사항을
 * 서버의 재시작 없이 사용하도록 하는 ActionServlet이다.
 *
 * [사용방법]
 * web.xml 파일을 다음과 같이 수정한다.
 * <servlet-class>my.MyActionServlet</servlet-class>
 *
 * reload.do 를 호출한다.
 * </pre>
 */

public class MyActionServlet extends ActionServlet {
    protected void process( HttpServletRequest request, HttpServletResponse response )

        throws IOException, ServletException {


        String uri = request.getRequestURI();
        if( uri.indexOf( "reload.do" ) != -1 ) {
            removeAttribute();
            init();
            ModuleUtils.getInstance().selectModule( request, getServletContext() );
            ModuleConfig config = getModuleConfig( request );
            getRequestProcessor( config ).init( this, config );
            System.out.println( "reload ok..." );
        } 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 ) );
        }
    }

}

+ Recent posts