2014년 9월 22일 월요일

[심심풀이]Struts Controller(ActionServlet)[자바JSP/Servlet/JDBC/MiPlatform/XPlatform/교육/JSP/서블릿강좌/Spring교육잘하는곳/자바,JSP/spring/교육추천/JSP/JDBC실무교육]

Struts Controller(ActionServlet) 

struts에서 Controller가 하는 일은 주로 클라이언트의 요청을 가로채어 특정 업무에 요청을 매핑 한다든지 비즈니스 로직으로부터 처리된 결과를 모아 클라이언트가 사용 가능하게 합니다. 또한 결과를 바탕으로 뷰를 결정하여 클라이언트에 보여주는 역할을 합니다. 

------------------------------ 
ActionServlet 클래스 
------------------------------ 

클라이언트의 요청을 중간에서 가로채는 역할을 하며 클라이언트의 모든 요청은 ActionServlet을 통과하게 됩니다. 이 ActionServlet은 자기 할 일을 스스로 알아서 하며 일부러 서브클래스를 만들 필요 없이 기본 클래스만으로 간단하게 역할을 수행 합니다. 

스트럿츠 1.1에서는 ActionServlet이 블랙박스와 같은 특징을 가졌음에도 확장이 가능하도록 설계 되었고 특정 작업을 위한 서브 클래스를 쉽게 만들 수 있습니다. 

대부분의 확장은 삽입되는 객체를 통해 수행되는데 이러한 컴포넌트를 이용 함으로서 새로운 ActionServlet을 생성 할 필요 없이 어떠한 작업을 초기에 할 수 있게 하는 것이 가능 해 졌습니다. 이러한 컴포넌트중 RequestProcess는 강력한 특징을 가지고 있습니다. 

RequestProcessor가 처리하는 최상위 작업 중 하나는 예외처리 인데 예외클래스들은 핸들러에 등록되며 등록된 예외중 하나가 발생 한다면 RequestProcessor는 org.apache.struts.action.ExceptionHandler에게 그 예외를 넘깁니다. 디폴트 클래스를 그냥 사용해도 되지만 각 예외 타입에 자신의 서브 클래스를 별도로 만들 수도 있습니다. 

RequestProcessor이외에 ExceptionHandler, PlugInAction은 ActionServlet이 없더라도 스트럿츠가 잘 돌아 가도록 만듭니다. 사실 ActionServlet이 실행 시 하는 일은 적절한 애플리케이션 모듈을 위한 RequestProcessor를 선택 하는 일 입니다. 클래스의 나머지 부분은 단순히 스트럿츠 Configuration의 Life Cycle을 관리 합니다. Configuration 파일에 의해 호출된 객체를 생성 하기 위해 Digester를 사용하며 애플리케이션 종료 시 객체들은 소멸 됩니다. 

ActionServlet이 클라이언트의 요청을 받게 되면 요청을 처리하기 위해 process() 메소드를 호출 하는데 process() 메소드는 먼저 org.apache.struts.util.RequestUtils 클래스의 static 메소드인 selectApplication()을 호출 합니다. 이때 매개변수로 ServletContext 객체를 전달하는데 selectApplication() 메소드가 하는 일은 처리할 애플리케이션 모듈을 선택 하는 일입니다. 자세히 보면 request.getServletPath()와 일치되는 매핑 구조를 가진 애플리케이션을 선택 합니다. 

ActionServlet의 대부분 역할은 RequestProcessor 클래스로 이전 되었으며 ActionServlet을 상속하는 것은 허용되지만 많은 이점을 제공하지 않습니다. 만약 ActionServlet을 기존버전과의 호환을 위해 확장하여 사용한다면 ActionServlet을 확장하고 init() 메소드를 오버라이드 하면 됩니다. 

본 사이트의 게시판 예제에서 Connection Pool을 위해 그러한 방법으로 처리를 했습니다. 아래의 예를 참고 하세요… 


package com.board.servlet; 

import java.io.IOException; 

import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.*; 

import org.apache.struts.action.ActionServlet; 
import org.apache.struts.config.ModuleConfig; 
import org.apache.struts.util.RequestUtils; 

import com.bitmechanic.sql.*; // connection pool 관련 package import 

/** 
* @author suny<skyfafa@gmail.com
*/ 
public class NewActionServlet extends ActionServlet { 
        
        private ConnectionPoolManager cpm; // connection pool manager 변수 선언 
        private String POOL_ALIAS = "testOracle"; // db alias 
        private String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver"; // driver 
        private String DB_URL = "jdbc:oracle:thin:@XXX.COM:1521:ORABOARD"; // url 
        private String DB_USER = "BOARD"; // id 
        private String DB_PASSWORD = "BOARDPW"; // pw 
        private int REAP_CONN_INTERVAL = 300; // 여기서부터는 bitmechanic 을 위한 환경 설정 값입니다. 
        private int MAX_CONNECTION = 20; 
        private int IDLE_TIMEOUT = 60; 
        private int CHECKOUT_TIMEOUT = 60; 
        private int MAX_CHECKOUT = 15; 
        
        public void init(ServletConfig config) throws { 
                try 
                { 
                        Class.forName(JDBC_DRIVER); 
                        cpm = new ConnectionPoolManager(REAP_CONN_INTERVAL); // 실재 connection pool manager 객체 생성 
                        cpm.addAlias(POOL_ALIAS,JDBC_DRIVER,DB_URL,DB_USER,DB_PASSWORD,MAX_CONNECTION,IDLE_TIMEOUT,CHECKOUT_TIMEOUT, MAX_CHECKOUT); 
                        // connection pool 생성 후에 부모 class의 init method 연속 수행 
                        super.init(config); 
                } 
                catch ( Exception e1 ) 
                { 
                        e1.printStackTrace(); 
                } 
        } 



이를 스트럿츠에서 이용하기 위해서는 web.xml을 아래처럼 수정 해야 합니다. 

            <servlet> 
        <servlet-name>action</servlet-name> 
        <servlet-class>com.board.servlet.NewActionServlet</servlet-class> 
        <init-param> 
            <param-name>config</param-name> 
            <param-value>/WEB-INF/struts-config.xml</param-value> 
            
        </init-param> 
        <init-param> 
            <param-name>debug</param-name> 
            <param-value>3</param-value> 
            
        </init-param> 
        <init-param> 
            <param-name>detail</param-name> 
            <param-value>3</param-value> 
            
        </init-param> 
        <load-on-startup>1</load-on-startup> 
        
    </servlet> 
    <servlet-mapping> 
        <servlet-name>action</servlet-name> 
        <url-pattern>*.do</url-pattern> 
        
    </servlet-mapping> 


-------------------------------- 
스트럿츠 초기화 과정 
-------------------------------- 

서블릿 컨테이너에 Struts ActionServlet을 처음 로드 할 때 혹은 서블릿을 최초로 요청 할 때 web.xml의 초기 파라미터를 사용 합니다. 

아래에 ActionServlet의 init() 메소드가 하는 일을 정리 했습니다. 

1.        내부 메시지 번들을 초기화, org.apache.struts.action.ActionResources를 사용하여 메시지를 구합니다. 프레임워크의 내부 메시지는 정보, 경고, 에러 메시지를 로그 파일에 기록하는데 이용 됩니다. 

2.        web.xml에서 ActionServlet 클래스를 초기화하는 파라미터를 로드 합니다. 이 파라미터는 config, debug등을 포함 합니다. 

3.        web.xml의 서블릿 매핑 정보를 읽어 저장 합니다. 

4.        web.xml의 설정 초기 파라미터에 지정되어 있는 스트럿츠의 설정 파일을 읽어 파싱하여 ApplicationConfig 객체를 생성하는데 이용하며 생성한 ApplicationConfig 객체를 org.apache.struts.action.APPLICATION을 키값으로 하여 ServletContext에 저장 합니다. 

5.        struts-config.xml 파일에서 설정된 메시지 리소스를 로딩하고 초기화 하여 ServletContext에 저장 합니다. 메시지 리소스를 초기화 할 때 message-resource 요소를 키로 하여 저장하는데 이 값이 없는 경우 org.apache.struts.action.MESSAGE의 키 값으로 초기화 합니다. 

6.        스트럿츠 설정 파일에 정의된 DataSource Module을 초기화 합니다. 

7.        스트럿츠 설정 파일에 설정된 플러그인을 초기화 합니다. 각 플러그인의 init() 메소드를 호출 합니다. 

8.        디폴트 애플리케이션을 완전히 초기화 하면 서블릿의 init() 메소드는 다른 애플리케이션이 설정 되어 있는지 확인하여 4~7번 과정을 반복 합니다. 


만약 다중 애플리케이션 환경(다중 모듈) 이라면 struts-config.xml 파일이 업무에 따라 여러 개의 다른 이름으로 설정 되어 있습니다. 이 경우 init() 메소드는 모듈별로 초기화를 별개로 진행 한다는 이야기 입니다. 

대부분의 스트럿츠 개발자들은 ActionServlet을 직접 사용하지 않습니다.  ACTION이나 ACTIONFORM 처럼 여러 개의 인스턴스를 만들 수 있는 것은 아니며 이는 단 하나의 인스턴스만을 가지는 싱글톤 형식으로 존재 합니다. 

아래는 ActionServlet의 init() 메소드 입니다. 

public void init() throws ServletException { 

        initInternal();  //스트럿츠 내부에서 사용되는 메시지 초기화 
        initOther();    //스트럿츠의 프레임 설정 파일, debug등 web.xml에서 전달하는 초기화 인자를 통해 초기화 
        initServlet();  //web.xml의 서블릿 매핑을 초기화 

        getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this); 
        initModuleConfigFactory(); 

        // Initialize modules as needed 
        ModuleConfig moduleConfig = initModuleConfig("", config);  //모듈 정보 초기화 
        initModuleMessageResources(moduleConfig); //메시지 리소스 모듈을 초기화 
        initModuleDataSources(moduleConfig);      //데이터 소스 초기화 
        initModulePlugIns(moduleConfig);          //플러그인 초기화 
        moduleConfig.freeze(); 

        Enumeration names = getServletConfig().getInitParameterNames(); 
        while (names.hasMoreElements()) { 
            String name = (String) names.nextElement(); 

                        //하위 Application이 있으면 애플리케이션별로 초기화를 진행 
            if (!name.startsWith("config/")) { 
                continue; 
            } 
            String prefix = name.substring(6); 
            moduleConfig = initModuleConfig 
                (prefix, getServletConfig().getInitParameter(name)); 
            initModuleMessageResources(moduleConfig); 
            initModuleDataSources(moduleConfig); 
            initModulePlugIns(moduleConfig); 
            moduleConfig.freeze(); 
        } 

        this.initModulePrefixes(this.getServletContext()); 

        this.destroyConfigDigester(); 
    } 


 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… 오라클자바…12-271961
 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취…오라클자바…12-111440
53 [평일주간]100%환급6건,안드로이드,자바,C#,스프링3.2,SQL,힌트/… 오라클자바…03-151197
52 [주말주간]C#, ASP.NET마스터 오라클자바…01-311359
51 [평일,기업100%환급]SQL기초에서 Schema Object까지 오라클자바…01-311139
50 [평일야간]HTML5, CSS3,Ajax, jQuery마스터과정 오라클자바…01-311046
49 [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 오라클자바…01-191359
48 [평일주간,평일야간,주말]안드로이드개발자과정 오라클자바…01-111192
47 [평일야간,주말주간]JAVA,Network&JSP&Spring,MyBatis,Hibernate 오라클자바…01-031696
46 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… 오라클자바…12-271961
45 [평일야간,주말]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis… 오라클자바…12-191462
44 웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX,JavaScript) 오라클자바…12-141428
43 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… 오라클자바…12-111440
42 [평일,기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 오라클자바…12-091158
41 [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 오라클자바…12-011354
40 [기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍(평일주간(단기)… 오라클자바…12-011519
39 [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) 오라클자바…12-011021

댓글 없음:

댓글 쓰기