[Oracle] ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

Struts/Struts Programming 2013. 9. 25. 17:12

에러 발생 원인


투입된 프로젝트에서 DRM 설치후 발생


에러



해결책

http://blog.naver.com/PostView.nhn?blogId=ingaaa&logNo=30035589470&redirect=Dlog&widgetTypeCall=true



해당경로로 이동해서 해당 파일을 수정한다.

 경로 : C:\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN

 수정할 파일 : listener.ora




 변경 전

# listener.ora Network Configuration File: C:\Oracle\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\Oracle\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\Oracle\product\11.2.0\dbhome_1\bin\oraclr11.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = C:\Oracle



 변경 후

# listener.ora Network Configuration File: C:\Oracle\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

ADR_BASE_LISTENER = C:\Oracle




[Struts] 스트럿츠 2의 핵심 기능

Struts/Struts Programming 2012. 11. 6. 22:44

● MVC(Model-View-Controller) 프레임워크
 -. 스트럿츠 2는 스트럿츠 1과는 달리 완전히 다른 MVC 아키텍처를 사용하고 있다.
 -. 2005년 자바원(JavaOne)에서 스트럿츠Ti(Titanium) 초안을 구성해 본격적인 스트럿츠 2 개발이 시작되었다.

● 웹워크2(WebWork2)의 아키텍처 채용
 -. 스트럿츠 2는 간결함과 세련미, 툴 친화성과 페이지 플로우의 장점을 스트럿 1과 결합했다.
 -. 스트럿츠 2의 아키텍처는 웹워크2의 아키텍처를 그대로 적용하고 있다.

● POJO 기반의 작업과 제로 컨피규레이션 지향으로 직관적인 개발 가능
 -. 스트럿츠 2는 직관적으로 개발할 수 있도록 디자인되었다.
 -. POJO(Plain Old Java Object)기반으로 쉽고 유연하게 개발할 수 있으며 무엇보다 환경설정의 내용이 간단해진 것이 큰 장점이다.
 -. 스트럿츠 2는 제로 컨피규레이션(Zero Configuration)을 지향한다.
 -. 기본값을 사용해 많은 설정을 생략할 수 있으며 소스 상에 어노테이션(Annotation)을 삽입해 설정 파일에서 정의해야 할 내용을 생략하거나
    유효성 검사, 인터셉터의 기능을 어노테이션으로 제공한다.
 -. 스트럿츠 2는 와일드카드 매핑을 사용해 패턴을 가진 여러 액션을 하나의 정으로 함축할 수 있는 기능도 제공한다.

● 웹 컨테이너 재시작 없이 신속한 리로딩 제공
 -. 스트럿츠 2는 신속한 리로딩 기능을 제공한다.
 -. 변경된 환경설정 내용이 웹 컨테이너를 다시 시작하지 않아도 리로드되므로 개발 시에 매우 유용하다.

● POJO 기반으로 프레임워크에 종속적이지 않으며 테스트가 쉽다.
 -. 스트럿츠 2와 가장 핵심기능으로 볼 수 있는 액션 클래스를 POJO로 사용할 수 있도록 디자인 하여
    프레임워크를 사용하면서도 프레임워크에 종속되지 않는다.
 -. 액션 클래스는 HTTP에 독립적이므로 Mock 객체에 의존하지 않고 손쉽게 테스트할 수 있는 이점을 가진다.

● 인터셉턴의 지원으로 액션에 대한 AOP(Aspect-Oriented Pro gramming)기능 지원
 -. 스트럿츠 2는 HTTP요청을 중간에 가로채서 액션 실행 전과 후에 실행할 코드를 별도의 계층으로 구성할 수 있는 인터셉터를 사용한다.
    이는 AOP와 같은 개념으로 다양한 인터셉터를 제공하고 있으며, 아주 간단한 설정으로 원하는 인터셉터만을 사용할 수 있다.
    예를 들면, 요청의 파라미터를 모델 데이터로 변환하는 단순하고 지루한 작업을 자동화 할 수 있다.

● 강력한 태그 라이브러리 제공
 -. 스트럿츠 2는 다양한 태그 라이브러리를 제공한다.
 -. 테마와 템플릿을 사용해 컴포넌트 기반의 작업을 할 수 있도록 재사용성이 높은 인터페이스를 제공한다.

● 쉽게 구현할 수 있는 Ajax 기능 제공
 -. 스트럿츠 2는 Dojo 프레임워크를 포함하고 있고, Ajax 테마를 지원하는 태그를 사용해 특별한 작업 없이 Ajax 애플리케이션을 구현할 수 있다.
 -. 컴포넌트 기반의 개념을 적용하기가 좋고 더 풍부한 인터페이슬르 만들 수 있다.

● 다른 오픈소스 프레임워크의 인터페이스 제공으로 쉬운 연동
 -. 스트럿츠 2는 자신 외에도 유용한 오픈소스 프레임워크를 쉽게 사용할 수 있도록 플러그인을 제공한다.
 -. 비즈니스 데이터를 차트로 출력하는 JFreeChar, 리포트 출력을 위한 JasperReport, 페이지 레이아웃을 구성할 때 도움을 줄 수 있는

     Sitemesh, DI(Dependency Injection) 및 OR Mapper와 함께 사용하기 위한 트랜잭션 관리등을 위한 Spring, Ajax 프로그래밍의 데이터 전송을 위한

     JSon과 같은 다양한 플러그인을 제공한다.(플러그인은 지금도 계속 만들어 지고 있다.)

● 의존성 주입 컨테이너를 사용해 의존성 결합도를 낮춤
 -. 객체 간의 의존성 결합도를 낮추기 위해 의존성 주입 컨테이너를 사용할 수 있다.
 -. 스트럿츠 2 내부의 주요 객체를 다루기 위해 구글 주스(Guice) 프레임워크를 사용하고 있으며 스프링과 같은 뛰어난 프레임 워크를 사용할 수 있다.

● 다양한 뷰 제공
 -. 스트럿츠 2는 JSP 외에도 FreeMarker, Velocity와 같은 다양한 뷰 기술을 지원한다.
 -. 최근 자바스크립트 기반의 UI 프레임워크와도 연동하기 쉽다.

● 유용한 표현식 언어 제공
 -. 스트럿츠 2는 OGNL(Object Graph Navigation Language)을 제공하여, 스트럿츠 2의 태그를 사용할 때 데이터의 표현을 매우 자유롭게 표현할 수 있다.
 -. 또한 스트럿츠 2 태그 대신 JSTL과 같은 표현식 언어를 대신 사용할 수도 있다.

[Struts] 인터셉터의 종류

Struts/Struts Programming 2012. 9. 12. 13:46

■ 인터셉터의 종류

인터셉터

설                           명

alias

 -. 앨리어스 인터셉터는 액션이 실행될 때 넘어온 요청 파라미터의 이름을 다른 이름으로 사용할 수 있도록 한다.

chaining

 -. 체인 인터셉터는 이전에 실행된 액션의 속성을 현재 액션에서 사용하도록 한다.

    많은 경우 이 인터셉턴느 리절트 체인(result chain)과 함께 사용된다.

checkbox

 -. 체크박스가 체크되지 않은 상태에서도 체크박스의 상태값을 넘겨줄 수 있도록 한다.

 -. 체크를 하지 않은 체크박스는 false 상태로 인식한다.

conversionError

 -. 타입 변호나 오류가 발생한 경우 오류 메시지를 등록한다.

debugging

 -. 개발자에 따라 커스터마이즈된 다양한 디버깅 화면을 제공한다.

exeAndWait

 -. 백그라운드에서 액션이 실행되는 동안에 사용자로 하여금 잠시 대기하도록 하는 화면을 보여주는 인터셉터이다.

 -. 최근 웹 사이트에서 많이 사용된느 추세이다.

 -. 특히 완성도 높은 상업용 웹 사이트인 경우 화면이 전환되는 상황에서 조금이라도 지연되는 경우

    사용자에게 대기 화면을 보여주는 것이 일반적이다.

exception

 -. 액션이 실행중에 발생한 예외 케이스에 대해 결과에 반영한다.

 -. 자동으로 예외 처리 핸들러에 리다이렉션(redirec-tion)을 하도록 한다.

fileUpload

 -. 파일 업로드 기능을 지원하는 인터셉터이다.

i18n

 -. 사용자 세션에 따라서 선택된 지역화 설정을 유지한다.

store

 -. ValidationAware 인터페이스를 구현함으로써 메시지를 저장하고 검색한다.

 -. 필드 에러나 액션에서 발생한느 에러 메시지를 저장한다.

scoped Model Driven

 -. ScopedModelDriven 인터페이스를 구현하는 액션을 위해서

    특정 스코프에 해당하는 모델 객체를 저장하고 검색하는 기능이다.

profile

 -. 액션에 로깅될 프로파일 정보를 제공한다.

scope

 -. 세션 또는 애플리케이션 스코프에서 액션의 상태를 저장하고 검색한다.

servletConfig

 -. 다양한 서블릿 기반 정보에 대해 접근하는 액션을 제공한다.

staticParams

 -. 정적으로 정의된 값을 액션에 설정한다. 예를 들면, 액션 설정시

    param 태그를 사용하여 설정한 값들이 이에 해당한다.

roles

 -. 현재 유저가 설정된 역할중 하나에 해당할 때에만 액션이 실행되도록 한다.

token

 -. 중복도니 폼 전송을 방지하기 위해서 올바른 토큰을 가지고 있는지를 체크한다.

 -. 이러한 기능은 인터넷 웹 사이트에서 전자결제를 구현할 때 많이 사용된다.

 -. 특히, 인터넷으로 결제 기능을 제공하는 경우 사용자가 결제 버틍을 두 번 누름으로써

    신용카드 결제가 여러번 이루어지는 경우가 종종 발생한다.

    이를 방지하기 위해서 token 인터셉터를 사용한다.

tokenSession

 -. 토큰과 유사하다. 하지만, 올바르지 않은 토큰이 주어진 경우는 전송된 데이터를 세션에 저장한다.

validation

 -. 액션에 전달한 데이터를 검증하는 방법을 제공한다.


 -. 인터셉터는 액션 실행에 있어 중요한 역할을 한다.

 -. 사용자 요청을 처리하는 과정에서, 특정한 액션이 실행되는 동안 내부적으로는 최소 하나 이상의 인터셉터가 동작한다.

 -. 스트럿츠 2는 이러한 과정에서 생성되는 인터셉터들을 스택 형태로 쌓아 올리고 액션에서 참조하도록 한다.

 -. 이러한 방법은 각 액션이 필요로 하는 인터셉터들을 각각 별도로 매핑하는 방법에 비해 매우 효율적이다.


인터셉터 스택

인터셉터

설명

BasicStack

Exception, servletConfig, prepare, checkbox,

params, conversionError

 -. 최소 환경에서 사용될 인터셉터들이다.

validation Work-flowStack

basicStack, validation, workflow

 -. 이전에 실행된 액션의 속성을 현재 액션에서

    사용하도록 한다. 많은 경우 이 인터셉터는 결과 타입

    (result type) 'chanin'과 함께 사용된다.

fileUploadStack

fileUpload, basicStack

 -. 기본 스택에 파일 업로딩 기능을 추가한다.

modelDrivenStack

modelDriven, basicStack

 -. 기본 스택에 모델 기능을 추가한다.

chainStack

chain, basicStack

 -. 기본 스택에 체인 기능을 추가한다.

i18nStack

i18n, basicStack

 -. 기본 스택에 지역화 유지 기능을 추가한다.

paramPrepareParamsStack

Exception, alias, params, servletConfig,

prepare, i18n, chain, modelDriven, filUpload,

checkbox, staticParams, params,

conversionError, validation, workflow

 -. Pre-action 메소드 호출을 포함하는 복잡한

    스택을 제공한다.
 -. Params 인터셉터는 두 번 적용된다.

 -. 먼저 prepare( ) 메소드가 호출되기 이전에

    파라미터를 제공하며,

   두 번째는 prepare 단계에서 검색된 객체들에게

   파라미터를 다시 제공하려할 때 사용된다.

defaultStack

Exception, alias, servletConfig, prepare,

i18n, chain, debugging, profiling, modelDriven,

scoped, ModelDriven, fileUpload, checkbox,

staticParams, params, conversionError,

validation, workflow

 -. 디버깅과 프로파일링을 포함하는 완전한 스택 기능을

    제공한다.

executeAndWaitStack

execAndWait, defaultStack, exeeAndWait

 -. 실행과 대기 스택을 제공한다. 이러한 기능은 파일

    업로드와 같이 처리결과를 보여주기까지 시간이

    오래 걸리는 기능을 수행할 때 유용하다.

 -. 사용자에게 특정한 수행중이라는 메시지를

    화면에 보여 줄 수 있다.

 ※ 인터셉터는 스택으로 설정된 순서대로 호출된다는 것을 유념한다.

[Struts] 커스텀 인터셉터

Struts/Struts Programming 2012. 9. 11. 22:16

■ 커스텀 인터셉터

 스트럿츠 2 프레임워크에는 사용자와 웹 애플리케이션의 목적에 따라 매우 편리하게 커스텀 인터셉터를 생성할 수 있다.

커스텀 인터셉터는 인터페이스 형태로 선언되어 있는 인터셉터를 상속하여 사용자가 원하는 대로 확장하는 것을 의미한다.


01) 커스텀 인터셉터를 위한 Interceptor 인터페이스

 ① init( ) 메소드는 인터셉터를 초기화하기 위한 방법

 ② destroy( ) 메소드는 인터셉터에서 사용한 리소스들을 반환하기 위한 메소드이다.

  ※ init( )나 destroy( )는 대체로 요청할 때마다 인스턴스를 생성하는 것이 아니라

     미리 인스턴스를 띄워놓고 서비스하는 용도로 사용된다.


 ③ interceptor( ) 메소드는 액션 수행하기 전에 수행할 일과 액션 수행 후에 수행할 일을 기술하고,

    그 경계선에는 전달자이며 ActionInvocation 객체인 invocation로 invoke( ) 메소드를 호출해야 한다.

 

02) 커스텀 인터셉터를 위한 AbstractInterceptor 추상 클래스

※ 인터셉터에 특별히 초기화하거나 종료 시 자원을 반납할 필요가 없다면 init( )이나 destory( )를 오버라이딩 하여

    구현하는 것이 불편할 것이다. 스트럿츠는 이러한 불편함을 없애기 위해서 AbstractInterceptor 클래스를 제공한다.


 -. AbstractInterceptor 클래스는 Interceptor 인터페이스의 구현 클래스로 init( )과 destory( ) 메소드를 오버라이딩 한 후

   아무런 구현도 하지 않는다.

 -. 그렇기 때문에 AbstractInterceptor 클래스의 서브 클래스로 인터셉터 클래스를 작성할 경우에는 init( )와 destroy( )

    메소드를 오버라이딩하지 않아도 되고, intercept( ) 메소드만 오버라이딩 하면 된다.


① AbstractInterceptor 클래스의 서브클래스 작성

  OneInterceptor.java

public class OneInterceptor extends AbstractInterceptor {

    private static Log log = LogFactory.getLog(TimerInterceptor.class);
   
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
       

        // 액션 수행하기 전에 처리할 일(전처리)

        String result = invocation.invoke();                  ..............................①
       

        // 액션 수행 후 처리할 일(후처리)      
        return result;
    }
}


 -. AbstractInterceptor 클래스의 서브 클래스로 작성한 커스텀 인터셉터는 액션 인보케이션에 의해서 호출되는

    intercept() 메소드를 오버라이딩해야 한다.

 -. intercept() 메소드 내부에 액션 수행하기 전에 수행할 일과 액션 수행 후에 수행할 일의 경계선에서 전달인자인

    AbstractInterception 객체가 invocation로 invoke( ) 메소드를 호출해야 한다.

 -. 액션 실행을 위한 대행자인 액션 프록시가 필터 디스패처에 의행 생성된다. 이렇게 생성된 액션프록시는 액션 인보케이션을 생성하여

    액션 실행에 앞서 인터셉터를 찾아서 호출하도록 한다.

 -. 액션 프록시는 액션 인보케이션의 invoke( ) 메소드를 호출하고, 액션 인보케이션은 인터셉터 스펙 중 실행할 다음 인터셉터가 있다면

    그 인터셉터의 intercept( ) 메소드를 호출한다.

 -. 인터셉터의 intercept( ) 메소드는 파라미터로 넘어온 액션 인보케이션의 invoke( )메소드를 다시 호출함으로서 체인을 형성한다.

 -. 커스텀 인터셉터가 인터셉터 스택중에 다음에 실행할 인터셉터가 있는지 확인하여 호출할 인터셉터가 존재할 때까지 체인 형태로

    운영되도록 하기 위해서는 위 예에서처럼 invocation.invoke( ) 메소드()를 호출해야 한다.



② 두 개의 인터셉터(OneInterceptor, TwoInterceptor) 설정

  struts.xml

    <package name = "ch05" extends = "struts-default">
        <interceptors>
            <interceptor name = "oneInterceptor" class = "interceptor.OneInterceptor"/>
            <interceptor name = "twoInterceptor" class = "interceptor.TwoInterceptor"/>
        </interceptors>
        <action name = "HelloWorld" class = "action.HelloWorld">
            <interceptor-ref name = "timer"/>
            <result name = "success">/helloWorld.jsp</result>
        </action>       
    </package>
</struts>

 커스텀 인터셉터 수행 순서


 -. 인터셉터는 액션 수행 전 설정 파일에 기술되는 순서대로 인터셉터의 전처리가 이루어진다.

 -. 액션 수행 후에는 설정 파일에 기술도니 인터셉터의 순서에 따라 거꾸로 올라가면 인터셉터와 후처리가 진행되는 체인 형태로 운영한다.



 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Chapter05</display-name>
 
    <!-- 스트럿츠2의 핵심 컨트롤러 역할을 수행하는 FilterDispatcher 클래스로 struts2란 필터를 등록한다. -->
  <filter>
    <filter-name>struts2</filter-name>
    <!-- 스트럿츠2의 핵심 컨트롤러 역할을 수행하는 클래스 -->
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <init-param>
        <!-- 스트럿츠2에서 한글 처리 -->
        <param-name>struts.i18n.encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
  </filter>
 
  <!-- URL 확장자가 action일 때 FilterDispatcher 필터가 실행되도록 매핑한다. -->
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
 
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>
 Chapter05/WebContet/WEB-INF/src/interceptor/OneInterceptor.java

package interceptor;

import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.interceptor.TimerInterceptor;

// 인터셉터는 액션 단위의 작업을 수행할 때 기존 액션 처리 전후에 추가적인 작업을 지원한다.
// 인터셉터는 정의된 순서대로 실행되고 더 이상 실행할 인터셉터가 없을 때 액션이 실행되고 그 다음에 리절트가 실행된다.
// 액션 인보케이션은 여러 개의 인터셉터로 구성된 인터셉터 스택 형태로 구현된다.
// 액션 프로시가 인보케이션의 invoke()메소드를 호출하면 인터세버가 실행된다.

public class OneInterceptor extends AbstractInterceptor {

    private static Log log = LogFactory.getLog(TimerInterceptor.class);
   
    // 액션 인보케이션의 invoke() 메소드 내에서는 인터셉터 스택에 정의된 인터셉터가 존재한다면
    // 인터셉터의 intercept() 멧소드를 호출한다.
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
       
        Date toDay = new Date();
        log.info("OneInterceptor의 선처리 : 실행날짜 : " + toDay + " ms");
       
        long startTime = System.currentTimeMillis();
       
        // intercept() 메소드 내에서는 액션 인보케이션의 invoke() 메소드를 다시 호출한다.
        // 다시 호출된 액션 인보케이션의  invoke() 메소드는 실행할 추가 인터셉터가 존재하는지 조사한 후
        // 실행할 인터셉터가 존재하면 그 인터셉터의 intercept() 메소드를 호출한다.
        // 이런식으로 동작하면서 인터셉터 체인을 형성한다.
        // 만약 더 실행할 인터셉터가 존재하지 않는다면 액션을 호출한 후 리절트를 실행한다.
        String result = invocation.invoke();
        long executeTime = System.currentTimeMillis() - startTime;
        log.info("OneInterceptor의 후 처리 : 실행시간 : " + executeTime + " ms");
       
        return result;
    }
}

 Chapter05/WebContet/WEB-INF/src/interceptor/TwoInterceptor.java

package interceptor;

import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.interceptor.TimerInterceptor;

public class TwoInterceptor extends AbstractInterceptor {

    private static Log log = LogFactory.getLog(TimerInterceptor.class);
   
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
       
        Date toDay = new Date();
        log.info("TwoInterceptor의 선처리 : 실행날짜 : " + toDay + " ms");
       
        long startTime = System.currentTimeMillis();
        String result = invocation.invoke();
        long executeTime = System.currentTimeMillis() - startTime;
        log.info("TwoInterceptor의 후 처리 : 실행시간 : " + executeTime + " ms");
       
        return result;
    }
}

 Chapter05/WebContet/WEB-INF/src/action/HelloWorld

package action;


// 액션 클래스를 POJO 형태로 작성
public class HelloWorld {
   
     private String message;

     public String getMessage() {
        return message;
     }


     public String execute() throws Exception {
         
      this.message = "Hello, World!";
      return "success";
     }
}

 Chapter05/WebContet/WEB-INF/src/struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation/DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
   
<struts>
    <package name = "ch05" extends = "struts-default">
        <interceptors>
            <interceptor name = "oneInterceptor" class = "interceptor.OneInterceptor"/>
            <interceptor name = "twoInterceptor" class = "interceptor.TwoInterceptor"/>
        </interceptors>
        <action name = "HelloWorld" class = "action.HelloWorld">
            <interceptor-ref name = "timer"/>
            <result name = "success">/helloWorld.jsp</result>
        </action>       
    </package>
</struts>
 helloWorld.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello, World!</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>

 출력결과(http://localhost:8181/Chapter05/HelloWorld.action)












 ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮

'Struts > Struts Programming' 카테고리의 다른 글

[Struts] 스트럿츠 2의 핵심 기능  (0) 2012.11.06
[Struts] 인터셉터의 종류  (0) 2012.09.12
[Struts] 커스텀 인터셉터  (0) 2012.09.11
[Struts] 인터셉터란?  (0) 2012.09.11
[Struts] 인터셉터란?  (0) 2012.09.11
[Struts] 스트럿츠 2 아키텍처  (0) 2012.09.06

[Struts] 인터셉터란?

Struts/Struts Programming 2012. 9. 11. 16:17

■ 인터셉터란?

 ※ 많은 애플리케이션은 액션의 종류와 무관하게 공통적으로 적용될 수 있는 기능이 있다. 예를 들면 유효선 검사 기능(validation),

    폼에서 서브밋이 두 번 일어나는 것을 막는 기능, 액션이 처리되기 전에 파일 업로드하는 기능, 페이지를 출력하기 전에 서버로부터

    미리 데이터를 가져오는 기능(spooling), 각 액션에 대한 상세한 내역 기록(logging), 시간별 동작 및 성능 병목지점 검사(profiling)

    등이 있다. 인터셉터는 스트럿츠 프레임워크 내부의 소스 코드를 수정하지 않으면서도, 이러한 공통 관심 기능이 수행되어

    프레임워크에 적용되도록 한다.