ActionContext
ActionContext는 STRUTS2가 세션, 매개 변수, 로케일 등과 같은 작업 실행 중에 필요한 일부 객체를 자동으로 저장하는 작업의 컨텍스트입니다. Struts2는 HTTP 요청을 실행하는 각 스레드를 기반으로 해당 ActionContext를 생성합니다. 따라서 사용자는 정적 메소드 ActionContext.getContext ()를 사용하여 현재 스레드의 ActionContext를 얻을 수 있습니다. 이러한 이유로 사용자는 액션 스레드 안전을 만드는 것에 대해 걱정할 필요가 없습니다.
어쨌든 ActionContext는 데이터를 저장하는 데 사용됩니다. struts2 자체는 많은 데이터를 넣고 사용자가 원하는 데이터를 넣을 수도 있습니다. ActionContext 자체의 데이터 구조 자체는 맵핑 구조, 즉 맵 값을 사용하는 맵입니다. 따라서 사용자는 MAP 사용과 같이 사용하거나 action.getContextMap () 메소드를 직접 사용하여 맵에서 작동 할 수 있습니다.
Struts2 자체에 배치 된 데이터에는 ActionInvocation, Application (예 : ServletContext), ConversionErrors, Locale, Action Name, 요청 매개 변수, HTTP 세션 및 값 스택 등이 포함됩니다. 전체 목록은 Javadoc을 참조하십시오 (이 기사의 부록은 포함 된 내용에 대해 설명).
스레드 전용 및 정적 ActionContext 방법으로 얻을 수있는 특성으로 인해 동작이 전달되거나 주입되기를 기다리지 않고 비 항목 클래스에서 직접 얻을 수 있습니다. 요청으로 인해 생성 된 스레드에서만 유효하지만 (요청시 해당 ActionContext가 생성되기 때문에) 서버에서 시작한 스레드에서 유효하지 않음 (예 : Fliter 's Init Method). 비 동점 클래스에서 액세스 할 수있는 편의로 인해 ActionContext는 비 액션 클래스에서 데이터를 JSP로 전달하는 데 사용될 수도 있습니다 (JSP는 쉽게 액세스 할 수 있기 때문에).
Valuestack과 ActionContext의 연결과 차이점 :
유사성 : 이들은 모두 HTTP 요청의 범위 내에서 사용됩니다. 즉, 평생은 하나의 요청입니다.
차이점 : 값 스택은 스택의 구조이며 ActionContext는 맵 (맵)의 구조입니다.
연락처 : Valuestack.getContext () 메소드에서 얻은 맵은 실제로 ActionContext의 맵입니다. struts2의 소스 코드를 살펴보면 (org.apache.struts2.dispatcher.ng.prepareoperations의 org.apache.struts2.dispatcher.ng.prepareoperations, createActionContext 메소드)를 볼 수 있습니다. ActionContext를 작성할 때 Valuestack.getContext ()는 ActionContext 생성자의 매개 변수로 사용됩니다. 따라서 Valuestack과 ActionContext는 본질적으로 서로를 얻을 수 있습니다.
참고 : 일부 문서에서는 "Stack의 컨텍스트"라는 단어가 나타납니다. 실제로 ActionContext에 저장되는 값입니다. 따라서 이러한 문서를 읽을 때 스택 구조 (즉, 값 스택)가 배치되어 있는지 또는 매핑 구조 (값 스택의 컨텍스트, 즉 ActionContext)가 명확하게 확인해야합니다.
ActionContext를 얻는 방법 :
사용자 정의 인터셉터 : ActionInVocation.getInvocationContext ()를 사용하거나 ActionContext.getContext ()를 사용하십시오.
액션 클래스 : 인터셉터가 ActionContext.getContext ()를 주입하거나 사용하도록하십시오.
비 동점 클래스에서 : Action Class가 매개 변수를 통과하거나 주입 메커니즘을 사용하여 주입하거나 ActionContext.getContext ()를 사용하십시오. 참고 : ActionContext.getContext ()는 요청 스레드에서 실행되는 코드로만 호출 할 수 있습니다. 그렇지 않으면 NULL이 반환됩니다.
JSP : 일반적으로 ActionContext 자체를 얻을 필요가 없습니다.
값을 ActionContext에 저장하는 방법 :
인터셉터, 액션 클래스, 비 액션 클래스 등과 같은 Java 클래스에서 : ActionContext.put (객체 키, 객체 값) 메소드 사용.
JSP : 태그 <s : set value = "..."/>는 기본적으로 ActionContext에 값을 저장합니다 (물론 <s : set> 태그는 다른 장소에 값을 저장할 수 있습니다). 또한 많은 태그에는 var 속성이 있습니다 (ID 속성은 이전에 사용되었지만 이제 ID 속성은 더 이상 사용되지 않았습니다). 이 속성은 값을 ActionContext에 저장할 수 있고 키는 var 속성의 값이며 값은 태그 값 속성의 값입니다. (일부 문서는 Valuestack의 맥락에 가치를 저장하는 것에 대해 작성합니다.
ActionContext에서 값을 읽는 방법 :
인터셉터, 액션 클래스, 비 액션 클래스 등과 같은 Java 클래스에서 : ActionContext.get (Object Key) 메소드를 사용하십시오.
JSP : #부터 시작하여 Ognl 표현식을 사용하여 ActionContext.get ( "Name") 메소드가 호출됩니다. 참고 : 특정 태그의 속성이 기본적으로 Ognl 표현식으로 구문 분석되지 않으면 표현식을 동봉하기 위해 %{}를 사용해야하며 " %{#name}"과 유사한 표현식이 나타납니다. (여기에서 "#"에 대한 자세한 내용을 참조하십시오)
요컨대, JSP에서 ActionContext를 사용하는 것은 매핑 구조이기 때문에, 다른 한편으로는 일부 작업 구성을 읽을 수 있습니다. 많은 동작에 공통 값을 제공 해야하는 경우 각 동작이 getxxx () 메소드를 제공 할 수 있지만 더 좋은 방법은 인터셉터 또는 JSP 템플릿에 ActionContext에 이러한 공통 값을 저장하는 것입니다 (인터셉터 또는 JSP 템플릿이 종종 여러 동작에 사용되기 때문에).
몇 가지 예 :
자바 코드
//이 클래스는 인터셉터에서 ActionContext에서 작동을 보여줍니다. PublicClass MyInterceptor는 AbstractInterceptor를 확장합니다. {public String intercept (ActionInvocation invocation)는 예외 {// ActionContext ActionContext ActionContext = invocation.getInvocationContext (); // 가치를 저장하십시오 Person = new Person (); ActionContext.put ( "사람", 사람); // 값을 가져옵니다 객체 값 = ActionContext.get ( "person"); // httpservletrequest httpservletrequest request = (httpservletrequest) actioncontext.get (strutsstatics.http_request); // 요청의지도, 즉 httpservletrequest.getAttribute (...) 및 httpservletRequest.setAttribute (...) 맵 requestMap = (map) ActionContext.get ( "request"); // 기타 코드 // ...... return invoction.invoke (); }} 자바 코드
//이 클래스는 ActionContext의 작동을 보여줍니다 publicclass myAction myAction은 ActionSupport를 확장합니다 {@override public string execute () rows exception {// 값 스택 ActionContext ActionContext = ActionContext.getContext (); // 값을 저장 개인 = new Person (); // 이것은 이전 예에 정의 된 클래스 actionContext.put ( "person", person); // 값을 가져옵니다. Object 객체 = ActionContext.get ( "person"); // 기타 코드 // ...... 반환 성공; }} HTML 코드
<! docType html> <html> <head> <metahttp-equiv = "content-type"content = "text/html; charset = utf-8"> <title> jsp page </title> </head> <body> <!-이 JSP는 JSP에서 ActionContext의 사용을 보여줄 것입니다 .-- jsp는 jsp is jsp is jsp is the jsp is the jsp입니다. ActionContext는 ActionContext에 저장되었으며 다음과 같이 "#person"을 사용하여 다음과 같이 선택할 수 있습니다.> <s : <speratyvalue = "#person"/> <!-다음과 같이 사람의 이름 속성을 가져옵니다-> <s : propertyvalue = "#person.name"/> <!-Actioncontext에서 struts2에 의해 저장된 값을 얻으십시오. <s : propertyValue = "#request"/> <!-다음과 같이 세션 맵과 같이 struts2에서 struts2에 의해 저장된 값을 가져옵니다-> <s : <s : get a action-context에서 struts2에 의해 저장된 값을 가져옵니다. 다음은 JSP에서 ActionContext에서 값을 저장하는 것을 보여줍니다-> <!-문자열 "myName"을 저장하고, 키는 다음과 같이 "mykey"입니다.> <s : setValue = "%{ 'myName'}"var = "mykey"/> <!-S : Bean 태그를 사용하여 객체를 만들고 ActionContext에서 저장하십시오. <s : beanname = "com.example.person"var = "myObject"/> <!-그 후에는 "#"를 사용하여 다음과 같이 읽을 수 있습니다-> <s : propertyValue = "#mykey"/> <s : propertyValue = "#myObject"/> </body> </html> 3. httpservletrequest 클래스 또는 요청 맵
struts2는 요청시 두 가지 작업을 제공합니다. 하나는 웹 서버에서 제공하는 httpservletrequest 클래스이며, 이는 전통적인 Java 웹 프로젝트의 요청 작업과 동일합니다. 다른 하나는 "요청 맵"으로, httpservletrequest의 속성을 캡슐화하는 매핑 클래스입니다. 맵을 작동하는 것은 httpservletrequest의 속성을 작동하는 것과 같습니다. MAP가 제공되는 이유는 작동이 편리하고 다른 하나는 JSP 태그에서 요청을 읽기 위해 OGNL을 사용하기 때문입니다. 어쨌든이 두 요청은 상호 운용 가능합니다. 요청의 수명주기와 같은 개념은 다른 Java 웹 프로젝트와 다르지 않으며이 기사는 자세히 설명되지 않습니다.
httpservletrequest 클래스 또는 요청 맵을 사용하십시오
두 사람은 상호 운용 가능하지만 읽기 요청 속성 측면에서 요청 맵을 사용하는 것이 훨씬 편리하고 불필요한 인터페이스를 노출시키지 않습니다. 물론 httpservletrequest에는 요청 맵에없는 몇 가지 방법이 있습니다. 물론 이러한 방법을 사용할 때 전자를 사용해야합니다.
요청의지도 또는 actionContext 사용 :
둘 다 맵이며, 두 수명주기 모두 요청입니다.
전통적인 Java 웹 프로젝트에서 값은 종종 요청의 속성을 통해 JSP로 전달됩니다. 서블릿의 첫 번째 stattribute (), JSP의 getAttribute (). 물론 Struts2 프로젝트에서는 여전히이 방법을 사용할 수 있지만 struts2가 제공하는 전달 함수를 포기하는 것은 노력의 가치가 없습니다. 저자는 요청의 맵을 ActionContext로 바꿔야한다는 공식 문서를 찾지 못했지만 ActionContext를 얻을 수 있지만 struts2 프레임 워크에서 요청을 얻을 수없는 맵이 있다는 것을 찾지 못했지만 ActionContext는 요청의지도를 작동하는 것보다 편리합니다. 따라서 저자는 다음을 권장합니다. 요청의지도 대신 actionContext를 사용하여 값을 전달하십시오.
요청의지도에는 때때로 스프링 프레임 워크와 같은 다른 프레임 워크가 설정 한 값이 포함됩니다. 이 값을 얻을 때는 ActionContext에 없기 때문에 요청 맵을 사용해야합니다.
ActionContext를 통해 httpservletrequest 클래스를 얻을 수 있습니다 : "httpservletrequest request = (httpservletrequest) actioncontext.get (strutsstatics.http_request);".
ActionContext를 통해 요청의 맵을 얻을 수도 있습니다. 따라서 JSP 태그에서 "#request"표현식을 사용하여 요청 맵의 데이터를 얻을 수 있습니다.
httpservletrequest를 얻는 방법 :
이미 ActionContext가있는 경우 "ActionContext.get (strutsStatics.http_request)을 사용하여 httpservletrequest를 얻으십시오.
사용자 정의 인터셉터에서 먼저 ActionContext를 얻은 다음 ActionContext를 통해 얻습니다.
action에서 먼저 ActionContext를 얻은 다음 ActionContext를 통해 얻습니다. 또는 조치가 Servletrequestaware 인터페이스를 구현하고 ServletConfiginterceptor 인터셉터를 사용하여 인터셉터가 httpservletrequest를 주입하도록하십시오.
JSP에서는 일반적으로 httpservletrequest를 얻을 필요가 없습니다.
요청지도를 얻는 방법 :
이미 ActionContext가있는 경우 "ActionContext.get ("request ")"을 사용하여 얻으십시오.
사용자 정의 인터셉터에서 먼저 ActionContext를 얻은 다음 ActionContext를 통해 얻습니다.
action에서 먼저 ActionContext를 얻은 다음 ActionContext를 통해 얻습니다. 또는 조치가 RequestAware 인터페이스를 구현하고 ServletConfiginterceptor 인터셉터를 사용하여 인터셉터가 맵 요청을 주입하도록합니다.
JSP에서 "#request"를 사용하여 요청의 맵을 얻고 "#request.key"또는 "#request [ 'key']"를 사용하여 맵의 값을 읽습니다.
요컨대, 요청은 여전히 Java 웹 사이트의 일반적인 규칙을 준수합니다. 그러나 저자는 사용자가 요청을 사용하여 값을 전달하지 않도록 권장합니다.
몇 가지 예 :
//이 클래스는 인터셉터에서 httpservletRequest의 맵의 작동을 보여줍니다. publicclass publicclass myinternceptor 확장 atbractinterceptor {public string intercept (actionInvocation invocation) 예외 {// actionContext ActionContext ActionContext = invociation.getInVocationContxt (getInVocationContext); // httpservletrequest httpservletrequest httpservletrequest = (httpservletRequest) actionContext.get (strutsstatics.http_request); // 맵 맵을 가져옵니다 requestMap = (map) actionContext.get ( "request"); // 인스턴스로 클래스를 만듭니다 Person = new Person (); // 다음 두 줄의 진술은 동일한 함수를 갖습니다. requestMap.put ( "사람", 사람); // 기타 코드 // ...... return invoction.invoke (); }} //이 클래스는 httpservletRequest의 맵의 작동을 보여줍니다. action in action (static methods acction context geact publicclass myAction myAction myAction actionSupport {@Override public string execute () 예외 {// ActionContext ActionContext ActionContext = ActionContext.getContext (getContext.getContext); // httpservletRequest httpservletrequest httpservletrequest = (httpservletRequest) actionContext.get (strutsstatics.http_request); // 맵 맵을 가져옵니다 requestMap = (map) actionContext.get ( "request"); // 인스턴스로 클래스를 만듭니다 Person = new Person (); // 다음 두 줄의 진술은 동일한 함수를 갖습니다. requestMap.put ( "사람", 사람); // 기타 코드 // ...... 반환 성공; }} //이 클래스는 httpservletrequest를 얻기 위해 ServletRequestAware를 사용하여 수행합니다 (참고 : ServletConfiginterceptor Interceptor를 사용해야합니다) 공개 클래스 MyAction은 ActionSupport empless servletRequestAware {private httpservletRequest 요청; //이 메소드는 인터페이스 ServletRequestAware PublicVoid setservletRequest (httpservletRequest 요청) {this.request = request; } @override public string execute ()는 예외를 던지고 {// httpservletrequest이 클래스 필드에서 준비되어 있으며 직접 사용할 수 있습니다 // ...... return success; }} //이 클래스는 ServletRequestAware를 사용하여 요청의 맵을 얻기 위해 ServletRequestAware를 사용하여 시연합니다 (참고 : ServletConfiginterceptor interceptor를 사용하려) 공개 클래스 MyAction은 ActionSupport Ampess RequestAware {Map <String, Object> Request; //이 메소드는 인터페이스의 메소드 requestAware publicVoid setRequest (map <string, object> request) {this.request = request; } @override public string execute ()는 예외를 던집니다. {// 요청 맵은 클래스 필드에서 준비되어 있으며 직접 사용할 수 있습니다 // ...... return success; }}<! docType html> <html> <head> <meta http-equiv = "content-type"content = "text/html; charset = utf-8"> <title> jsp page </title> </head> <! <!-이 JSP는 JSP에서 요청 맵의 사용을 시연합니다-> <! 값은 struts2에 의해 ActionContext에 자동으로 저장된 값입니다. </body> </html>
3. 매개 변수, 즉 GET 요청 또는 사후 요청의 매개 변수
매개 변수는 Get 또는 Post를 요청할 때 브라우저가 서버로 전달되는 매개 변수입니다. 기존의 Java 웹 프로젝트에서는 httpservletrequest.getparameter ()와 같은 방법을 사용하여 매개 변수를 얻고 httpservletrequest.getparametermap ()을 직접 사용하여 캡슐화 된 매개 변수가있는 맵을 얻을 수 있습니다. struts2에서 struts2는 위의 맵을 ActionContext에 직접 저장하고 "매개 변수"의 주요 저장. 또한 ActionContext는이 맵을 얻기 위해 ActionContext.getParameters () 메소드를 직접 제공합니다. 따라서 Struts2의 각 구성 요소에서 매개 변수를 작동하는 방법은 요청 맵을 작동하는 방법과 매우 유사 하며이 단락은 자세히 설명되지 않습니다.
4. httpservletsession 클래스 및 세션의지도
전통적인 Java 웹 프로젝트의 세션은 모두 익숙하며이를 사용하여 사용자의 세션 상태를 기록합니다. struts2는 httpservletsession을 맵, 즉 "세션 맵"으로 캡슐화하여 요청 처리와 유사합니다. 그러나 시스템 리소스를 저장하기 위해 세션이 필요하지 않은 경우 세션을 만들지 않습니다. 이 때문에 httpservletsession이 struts2의 ActionContext에 넣지 않을 수 있습니다. 프로그램에 httpservletsession을 사용해야하는 경우 먼저 httpservletrequest를 얻은 다음 getsession () 또는 getsession (boolean b)을 사용하여이를 얻고 세션을 만들어야하는지 결정해야합니다. 세션 맵의 경우 Struts2는 여전히 ActionContext (키는 "세션")에 넣지 만 걱정하지 마십시오.이 맵의 메커니즘은 새 값을 넣을 때만 세션을 만듭니다. 요컨대, struts2에서의 httpservletsession의 작동은 먼저 httpservletrequest를 통해 그것을 얻어야하며, 세션 맵의 작동은 요청 맵의 작동과 정확히 동일하며,이 단락에서는 자세히 설명되지 않습니다.
5. ServletContext 및 응용 프로그램의지도
기존의 Java 웹 프로젝트에서 ServletContext는 글로벌 변수를 저장하는 데 사용되며 각 Java Virtual Machine은 웹 프로젝트 당 하나의 ServletContext 만 있습니다. 이 ServletContext는 웹 서버에서 독창성을 보장하기 위해 작성됩니다. ServletContext에는 속성을 작동 할 수있는 몇 가지 방법이 있으며 이러한 작업은 맵 작동과 유사합니다. 따라서 struts2는 다시 캡슐화합니다. servletcontext의 속성을 맵으로 캡슐화하고 "응용 프로그램 맵"을 캡슐화하고 ActionContext (Key IS Application)에도 넣습니다. 따라서 응용 프로그램 맵의 작업이 요청의 맵에있는 경우이 단락은 자세히 설명되지 않습니다.
ServletContext에서의 작업은 httpservletrequest에서의 작업과 유사합니다. struts2는 servletcontext를 ActionContext에 넣고 ServletConfiginterceptor는 ServletContext를 위해 사출 인터페이스 ServletContextAware를 제공합니다. 따라서이 단락은 자세히 설명되지 않습니다.
참고 : Ognl 표현식에서 "#Application"을 사용하면 ServletContext가 아닌 응용 프로그램의 맵을 얻을 수 있습니다. 그러나 JSP (예 : "< % application.getAttribute (" "); %>")에 내장 된 Java 코드에서 응용 프로그램은 맵이 아닌 ServletContext입니다.