스트럿츠에서 web.xml , strus-config.xml 등의 설정파일을 수정하고나면 반드시 톰캣을 재가동해줘야 했다. 너무 번거롭고 짜증나지 아니한가.....
스트럿츠 프레임워크 워크북에는 ActionServlet을 확장한 클래스를 새로 만들면 된다고 나왔다.. 헌데 책이 좀 오래된지라... 옛날버젼..
1.2버전이후에는 스트럿츠 패키지가 좀 바뀌었나 부다... 책대로 했는데 안되네....

자... 일단
1.MyAppServlet.java를 만들자..(ActionServlet)을 상속받은 것이다.
패키지도 하나 새로 만들자.. struts.action 으로 했다.
package struts.action;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.util.ModuleUtils;
public class MyAppServlet 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());
 //하지만 스트럿츠버전이 업데이트됨에 따라 RequestUtils패키지를 쓰지 않는다.

  ModuleUtils.getInstance().selectModule(request, getServletContext()); //1.2버전이후...
    ModuleConfig config = getModuleConfig(request);
    getRequestProcessor(config).init(this, config);
    RequestDispatcher dispatcher =
     request.getRequestDispatcher("/reload.jsp");
    dispatcher.forward(request, response);
   } else {
    super.process(request, response);
   }
  }
 }

2.ReloadStrutsConfigAction.java 파일 생성 (Action클래스 상속)
package struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class ReloadStrutsConfigAction extends Action{
 public ActionForward excute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws Exception{
  return null;
 }
}

3.web.xml 설정 수정
<servlet-name>action</servlet-name>
    <servlet-class>struts.action.MyAppServlet</servlet-class>

4.struts-config.xml 설정 추가
 <action
        path="/reload"
        type="struts.action.ReloadStrutsConfigAction">
  </action>

다 되었다. 이제 주소창에 http://서버주소/컨텍스트패스/reload.do로 해보자..
그럼 404페이지 reload.jsp가 뜨겠지... 요건 상관없지만(jsp페이지를 만들어줘도 상관없다.)
정상적으로 리로딩이 된다. 테스트해보면 된다. struts-config.xml 파일에서
<action
   path="/login1/Form"
   forward="/login1/logInForm.jsp"/>

요런 설정을 패스를 바꾸고
<action
   path="/login1/logInForm"
   forward="/login1/logInForm.jsp"/>

요렇게 바꾸고 저장 후 reload.do를 하면 바뀐 설정이 바로 적용된다.

이제 편하게 개발해보장~
AND

1. data-sources : struts 에서 사용할 데이터 베이스 자원을 기입합니다. 주로 Connection Pooling 을 사용합니다.

2. form-beans :struts 에서는 client 가 웹 브라우저에 입력한 parameter 들을 class 에 매핑시켜 처리하게 해줍니다 그 class 를 기입합니다.

3. global-exceptions : struts 로 구현된 application 에서 발생한 예외를 처리할 수 있는 page 로 forwarding 하는 역할을 합니다. error 처리는 해당 action 에서 exception 요소로 처리하는 것도 가능합니다.

4. global-forwards :모든 action 은 보여지는 화면( jsp page, html ) 등으로 처리된 응답을 보내게 되어 있습니다.여기에 특정한 pattern 으로 처리해야 하는 page 가 있다면 key 값으로 정의하고 action element 에서 활용하는 것이 가능합니다.

5. action-mappings :아마 가장 많이 주의 깊게 작성하는 곳일 될 겁니다. client의 요청을 처리하는 주역할을 하는 action class 를 해당하는  요청에 mapping 하는 element 입니다.

6. controller :struts 의 이전 버전에서는 ActionServlet 을 상속해서 컨트롤러 기능을 오버라이드 해야 했지만, struts 1.1 이 후에는 RequestProcessor 로 많은 기능이 이전되었습니다. 그래서 각각의 application 을 위해서 각각의 controller 를 작성해야 한다면 여기에 RequestProcessor 를 상속한 class 를 기입하여 다양한 controller 의 기능을 구현하는 것이 가능합니다

7. message-resources :각각의 action 이 수행이 될때 error message 가 나올수 있습니다. 이들 각각의 message 들을 지정해 둔 곳이라 보시는 것이 쉬우실 거라 생각합니다.

8. plug-in : 이 element 는 struts 1.1 버전 이후에 나온 개념으로 org.apache.struts.PlugIn interface 를 구현한 class 를 만들어 struts 로 구현한 application 이 구동될 때 동시에 실행되어 다양한 기능을 추가적인 코딩 없이 동적으로 작동하게 해주는 기능입니다. struts 에서 제공하는 Validator 와 Tiles 등이 이러한 plugin 기능을 활용한 것입니다 차후 validator 와 tiles 에 관한 사용법을 강좌에 연재할 계획입니다.

위의 간단한 설명을 잘 읽어두시길 바랍니다.

위의 element 들을 잘 이해하고 RequestProcessor class 내부의 process() 의 내부적인 구조를 잘 이해하는 것이 struts 의 대부분이라 생각하셔도 됩니다.

그래서 요청을 처리하는 것은 다음의 과정으로 이뤄지게 됩니다.

                                                                                                                                         

0. application 이 로딩되면 web container 는 web.xml 을 읽어서 요청을 처리할 준비를 합니다. ( message resource 로딩 --> ActionServlet class 를 control 하는 초기화 parameter 로딩 ---> web.xml 의 서블릿 mapping 정보 로딩 --> struts-config.xml 을 읽어 ServletContext 에 저장 --> data source (커넥션 풀링) 초기화 --> 각 plugin 의 init() 호출)

1. 우선 client 의 요청을 분석한 다음 ActionServlet 이 처리하게 합니다.

2. client 의 request 당 RequestProcessor 의 instance 를 하나씩 생성하여 요청을 처리합니다.

3. 이 때 다양한 요청을 struts-config.xml 의 mapping 정보( action-mappings ) 를 보고 해당 Action class 가 처리하게 합니다.

4. 그리고 이 때 client page 의 정보를 해당하는 Action class 가 처리하게 할 때 각각의 parameter 를 만들어둔 ActionForm class에 mapping 시킵니다. ( form-beans )

5. 이때 해당하는 error 또는 exception 이 발생하면 해당하는 ( global-exceptions ) 처리 class 가 처리한 다음에 경로로 요청을 전달합니다.

6. 그리고 ActionForm 안의 validate() 안에 해당하는 field check 를 마친 다음에 error 가 발생하였다면 message-resources 안에 지정된 message 를 client 단의 web page 에 보여줘서 바른 입력을 하게 합니다.

7. Action class 에서 요청을 처리한 다음에 지정한 경로로 forwarding 처리를 하게 됩니다. ( action 안에 지정한 forward 요소, global-forwards 안에 지정한 경로 )

AND

스트럿츠를 처음 접했다.
강좌를 보고 따라했더니 실행은 잘 되더만~
헌데 struts-config.xml 내부에서 이루어지는 프로세스가 궁금하여...

일단 톰캣을 구동하고 접속을 하면 index.jsp로 들어간다.
index파일내에는 아무것도 없으며 리다이렉트만 걸어준다
<logic:redirect forward="welcome"/>
결과는 Welcome.do를 출력
어떻게????? 궁금하지 않을 수 없었다...

struts-config.xml을 보자..

<!-- =========================================== Global Forward Definitions -->

    <global-forwards>
        <!-- Default forward to "Welcome" action -->
        <!-- Demonstrates using index.jsp to forward -->
        <forward
            name="welcome"
            path="/Welcome.do"/>
    </global-forwards>
<!-- =========================================== Action Mapping Definitions -->

    <action-mappings>
            <!-- Default "Welcome" action -->
            <!-- Forwards to Welcome.jsp -->
        <action
            path="/Welcome"
            forward="/Welcome.jsp"/>
  </action-mappings>

<logic:redirect forward="welcome"/>  요부분에서 포워드명은 welcome ...
global-forwards에 정의되어 있는 name을 찾는다. 패스는 Welcome.do...
web.xml에서 액션서블릿매핑을 *.do 패턴으로 해놨던것을 기억해보자..
결국 액션매핑에서 Welcome.do에서 .do를 뺀 Welcome패스경로를 찾아가게 된다.
그것의 포워드는 Welcome.jsp의 최종 목적지!!

이렇게 되는 것이다..

AND