Struts 2-인터셉터
인터셉터는 개념적으로 서블릿 필터 또는 JDK 프록시 클래스와 동일합니다. 인터셉터를 사용하면 프레임 워크뿐만 아니라 액션과 별도로 크로스 커팅 기능을 구현할 수 있습니다. 인터셉터를 사용하여 다음을 달성 할 수 있습니다.
액션이 호출되기 전에 전처리 로직을 제공합니다.
액션이 호출 된 후 후 처리 로직을 제공합니다.
대체 처리를 수행 할 수 있도록 예외 포착.
에서 제공하는 많은 기능 Struts2 프레임 워크는 인터셉터를 사용하여 구현됩니다.
Examples 예외 처리, 파일 업로드, 라이프 사이클 콜백 등을 포함합니다. 사실 Struts2는 인터셉터에 대한 많은 기능을 강조하므로 작업 당 7 개 또는 8 개의 인터셉터가 할당되지 않을 가능성이 높습니다.
Struts2 프레임 워크 인터셉터
Struts 2 프레임 워크는 사전 구성되어 바로 사용할 수있는 즉시 사용 가능한 인터셉터 목록을 제공합니다. 중요한 인터셉터는 아래에 나열되어 있습니다.
Sr. 아니요 | 인터셉터 및 설명 |
---|---|
1 | alias 매개 변수가 요청 전체에서 다른 이름 별칭을 가질 수 있습니다. |
2 | checkbox 선택하지 않은 선택란에 대해 매개 변수 값 false를 추가하여 선택란 관리를 지원합니다. |
삼 | conversionError 문자열을 매개 변수 유형으로 변환하는 오류 정보를 조치의 필드 오류에 배치합니다. |
4 | createSession HTTP 세션이 아직없는 경우 자동으로 생성합니다. |
5 | debugging 개발자에게 여러 다른 디버깅 화면을 제공합니다. |
6 | execAndWait 작업이 백그라운드에서 실행되는 동안 사용자를 중간 대기 페이지로 보냅니다. |
7 | exception 작업에서 발생한 예외를 결과에 매핑하여 리디렉션을 통한 자동 예외 처리를 허용합니다. |
8 | fileUpload 간편한 파일 업로드가 가능합니다. |
9 | i18n 사용자 세션 중에 선택한 로케일을 추적합니다. |
10 | logger 실행중인 작업의 이름을 출력하여 간단한 로깅을 제공합니다. |
11 | params 조치에 대한 요청 매개 변수를 설정합니다. |
12 | prepare 이는 일반적으로 데이터베이스 연결 설정과 같은 사전 처리 작업을 수행하는 데 사용됩니다. |
13 | profile 작업에 대한 간단한 프로파일 링 정보를 기록 할 수 있습니다. |
14 | scope 세션 또는 응용 프로그램 범위에서 작업의 상태를 저장하고 검색합니다. |
15 | ServletConfig 다양한 서블릿 기반 정보에 대한 액세스와 함께 조치를 제공합니다. |
16 | timer 작업을 실행하는 데 걸리는 시간의 형태로 간단한 프로파일 링 정보를 제공합니다. |
17 | token 중복 양식 제출을 방지하기 위해 유효한 토큰에 대한 조치를 확인합니다. |
18 | validation 작업에 대한 유효성 검사 지원을 제공합니다. |
위에서 언급 한 인터셉터에 대한 자세한 내용은 Struts 2 문서를 참조하십시오. 하지만 Struts 애플리케이션에서 일반적으로 인터셉터를 사용하는 방법을 보여 드리겠습니다.
인터셉터를 사용하는 방법?
"Hello World"프로그램에 이미 존재하는 인터셉터를 사용하는 방법을 살펴 보겠습니다. 우리는timer액션 메서드를 실행하는 데 걸린 시간을 측정하는 목적을 가진 인터셉터. 동시에 나는params요청 매개 변수를 조치에 보내는 목적을 가진 인터셉터. 이 인터셉터를 사용하지 않고 예제를 시도 할 수 있으며name 매개 변수가 작업에 도달 할 수 없기 때문에 속성이 설정되지 않았습니다.
HelloWorldAction.java, web.xml, HelloWorld.jsp 및 index.jsp 파일은 Examples 장을 수정하겠습니다. 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>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<interceptor-ref name = "params"/>
<interceptor-ref name = "timer" />
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
프로젝트 이름을 마우스 오른쪽 버튼으로 클릭하고 Export > WAR FileWar 파일을 만듭니다. 그런 다음 Tomcat의 webapps 디렉토리에이 WAR을 배포합니다. 마지막으로 Tomcat 서버를 시작하고 URL에 액세스하십시오.http://localhost:8080/HelloWorldStruts2/index.jsp. 다음 화면이 생성됩니다.
이제 주어진 텍스트 상자에 단어를 입력하고 Say Hello 버튼을 클릭하여 정의 된 작업을 실행합니다. 이제 생성 된 로그를 확인하면 다음 텍스트를 찾을 수 있습니다.
INFO: Server startup in 3539 ms
27/08/2011 8:40:53 PM
com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
INFO: Executed action [//hello!execute] took 109 ms.
여기서 결론은 timer 액션이 실행되는 데 총 109ms가 걸렸음을 알리는 인터셉터.
사용자 정의 인터셉터 생성
응용 프로그램에서 사용자 정의 인터셉터를 사용하는 것은 교차 응용 프로그램 기능을 제공하는 우아한 방법입니다. 사용자 정의 인터셉터를 만드는 것은 쉽습니다. 확장해야 할 인터페이스는 다음과 같습니다.Interceptor 인터페이스-
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation)
throws Exception;
}
이름에서 알 수 있듯이 init () 메서드는 인터셉터를 초기화하는 방법을 제공하고 destroy () 메서드는 인터셉터 정리를위한 기능을 제공합니다. 액션과 달리 인터셉터는 요청 전체에서 재사용되며 특히 intercept () 메서드와 같이 스레드로부터 안전해야합니다.
그만큼 ActionInvocation개체는 런타임 환경에 대한 액세스를 제공합니다. 액션 자체와 메서드에 액세스하여 액션을 호출하고 액션이 이미 호출되었는지 여부를 확인할 수 있습니다.
초기화 또는 정리 코드가 필요하지 않은 경우 AbstractInterceptor클래스를 확장 할 수 있습니다. 이것은 init () 및 destroy () 메소드의 기본 nooperation 구현을 제공합니다.
인터셉터 클래스 생성
다음 MyInterceptor.java를 생성하겠습니다. Java Resources > src 폴더 −
package com.tutorialspoint.struts2;
import java.util.*;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation)throws Exception {
/* let us do some pre-processing */
String output = "Pre-Processing";
System.out.println(output);
/* let us call action or next interceptor */
String result = invocation.invoke();
/* let us do some post-processing */
output = "Post-Processing";
System.out.println(output);
return result;
}
}
아시다시피 실제 작업은 인터셉터를 사용하여 실행됩니다. invocation.invoke()요구. 따라서 요구 사항에 따라 일부 전처리 및 후 처리를 수행 할 수 있습니다.
프레임 워크 자체는 ActionInvocation 객체의 invoke ()를 처음으로 호출하여 프로세스를 시작합니다. 매번invoke()ActionInvocation은 그 상태를 참조하고 다음에 오는 인터셉터를 실행합니다. 구성된 인터셉터가 모두 호출되면 invoke () 메서드가 액션 자체를 실행합니다.
다음 다이어그램은 요청 흐름을 통해 동일한 개념을 보여줍니다.
액션 클래스 생성
아래에 HelloWorldAction.java 자바 파일을 만들어 보겠습니다. Java Resources > src 패키지 이름으로 com.tutorialspoint.struts2 아래에 주어진 내용으로.
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private String name;
public String execute() throws Exception {
System.out.println("Inside action....");
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
이것은 이전 예제에서 본 것과 동일한 클래스입니다. "name"속성에 대한 표준 getter 및 setter 메서드와 "success"문자열을 반환하는 실행 메서드가 있습니다.
보기 만들기
아래 jsp 파일을 생성하겠습니다. HelloWorld.jsp Eclipse 프로젝트의 WebContent 폴더에 있습니다.
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World, <s:property value = "name"/>
</body>
</html>
메인 페이지 생성
우리는 또한 만들어야합니다 index.jspWebContent 폴더에 있습니다. 이 파일은 사용자가 클릭하여 Struts 2 프레임 워크에 HelloWorldAction 클래스의 정의 된 메소드를 호출하고 HelloWorld.jsp보기를 렌더링하도록 지시 할 수있는 초기 조치 URL 역할을합니다.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World From Struts2</h1>
<form action = "hello">
<label for = "name">Please enter your name</label><br/>
<input type = "text" name = "name"/>
<input type = "submit" value = "Say Hello"/>
</form>
</body>
</html>
그만큼 hello 위 뷰 파일에 정의 된 액션은 struts.xml 파일을 사용하여 HelloWorldAction 클래스와 그 execute 메소드에 매핑됩니다.
구성 파일
이제 인터셉터를 등록한 다음 이전 예제에서 기본 인터셉터를 호출 한대로 호출해야합니다. 새로 정의 된 인터셉터를 등록하려면 <interceptors> ... </ interceptors> 태그가 <package> 태그 인 바로 아래에 배치됩니다.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>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<interceptors>
<interceptor name = "myinterceptor"
class = "com.tutorialspoint.struts2.MyInterceptor" />
</interceptors>
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<interceptor-ref name = "params"/>
<interceptor-ref name = "myinterceptor" />
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
내부에 두 개 이상의 인터셉터를 등록 할 수 있습니다. <package> 태그와 동시에 두 개 이상의 인터셉터를 호출 할 수 있습니다. <action>꼬리표. 다른 작업으로 동일한 인터셉터를 호출 할 수 있습니다.
web.xml 파일은 다음과 같이 WebContent 아래의 WEB-INF 폴더 아래에 생성되어야합니다.
<?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_3_0.xsd"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
프로젝트 이름을 마우스 오른쪽 버튼으로 클릭하고 Export > WAR FileWar 파일을 만듭니다. 그런 다음 Tomcat의 webapps 디렉토리에이 WAR을 배포합니다. 마지막으로 Tomcat 서버를 시작하고 URL에 액세스하십시오.http://localhost:8080/HelloWorldStruts2/index.jsp. 다음 화면이 생성됩니다.
이제 주어진 텍스트 상자에 단어를 입력하고 Say Hello 버튼을 클릭하여 정의 된 작업을 실행합니다. 이제 생성 된 로그를 확인하면 하단에 다음과 같은 텍스트가 있습니다.
Pre-Processing
Inside action....
Post-Processing
여러 인터셉터 쌓기
상상할 수 있듯이 각 작업에 대해 여러 인터셉터를 구성해야하는 것은 금방 매우 관리하기 어렵게됩니다. 이러한 이유로 인터셉터는 인터셉터 스택으로 관리됩니다. 다음은 strutsdefault.xml 파일에서 직접 가져온 예입니다.
<interceptor-stack name = "basicStack">
<interceptor-ref name = "exception"/>
<interceptor-ref name = "servlet-config"/>
<interceptor-ref name = "prepare"/>
<interceptor-ref name = "checkbox"/>
<interceptor-ref name = "params"/>
<interceptor-ref name = "conversionError"/>
</interceptor-stack>
위의 지분은 basicStack아래와 같이 구성에서 사용할 수 있습니다. 이 구성 노드는 <package ... /> 노드 아래에 있습니다. 각 <interceptor-ref ... /> 태그는 현재 인터셉터 스택 이전에 구성된 인터셉터 또는 인터셉터 스택을 참조합니다. 따라서 초기 인터셉터 및 인터셉터 스택을 구성 할 때 모든 인터셉터 및 인터셉터 스택 구성에서 이름이 고유한지 확인하는 것이 매우 중요합니다.
우리는 이미 인터셉터를 액션에 적용하는 방법을 보았습니다. 인터셉터 스택을 적용하는 것도 다르지 않습니다. 사실, 우리는 정확히 같은 태그를 사용합니다.
<action name = "hello" class = "com.tutorialspoint.struts2.MyAction">
<interceptor-ref name = "basicStack"/>
<result>view.jsp</result>
</action
위의 "basicStack"등록은 hello 액션과 함께 6 개의 인터셉터의 전체 지분을 등록합니다. 인터셉터는 구성된 순서대로 실행된다는 점에 유의해야합니다. 예를 들어, 위의 경우 예외가 먼저 실행되고 두 번째는 servlet-config 등이 실행됩니다.