스트러츠의 모든 클래스는 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 ) ); } } }