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