Struts 2 - ตัวสกัดกั้น

ตัวดักจับมีแนวความคิดเหมือนกับตัวกรอง servlet หรือคลาส JDKs Proxy Interceptors อนุญาตให้ใช้ฟังก์ชันการตัดขวางแยกต่างหากจากการกระทำและกรอบงาน คุณสามารถบรรลุสิ่งต่อไปนี้โดยใช้ interceptors -

  • จัดเตรียมตรรกะก่อนการประมวลผลก่อนที่จะเรียกการดำเนินการ

  • ให้ตรรกะหลังการประมวลผลหลังจากเรียกการดำเนินการแล้ว

  • การจับข้อยกเว้นเพื่อให้สามารถดำเนินการประมวลผลอื่นได้

คุณสมบัติมากมายที่มีให้ใน Struts2 กรอบถูกนำไปใช้โดยใช้ตัวสกัดกั้น

Examples รวมถึงการจัดการข้อยกเว้นการอัปโหลดไฟล์การเรียกกลับตลอดอายุการใช้งาน ฯลฯ ในความเป็นจริงเนื่องจาก Struts2 เน้นฟังก์ชันการทำงานของตัวสกัดกั้นมากจึงไม่น่าจะมีการกำหนดตัวสกัดกั้น 7 หรือ 8 ตัวต่อการกระทำ

Struts2 Framework Interceptors

เฟรมเวิร์ก Struts 2 แสดงรายการตัวสกัดกั้นแบบสำเร็จรูปที่กำหนดค่าไว้ล่วงหน้าและพร้อมใช้งาน ตัวสกัดกั้นที่สำคัญมีอยู่ไม่กี่ตัวด้านล่าง -

ซีเนียร์ No ผู้สกัดกั้นและคำอธิบาย
1

alias

อนุญาตให้พารามิเตอร์มีนามแฝงชื่อที่แตกต่างกันในการร้องขอ

2

checkbox

ช่วยในการจัดการกล่องกาเครื่องหมายโดยการเพิ่มค่าพารามิเตอร์เป็นเท็จสำหรับกล่องกาเครื่องหมายที่ไม่ได้เลือก

3

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

จัดเตรียมการดำเนินการกับการเข้าถึงข้อมูลที่ใช้ servlet ต่างๆ

16

timer

ให้ข้อมูลการทำโปรไฟล์อย่างง่ายในรูปแบบของระยะเวลาในการดำเนินการ

17

token

ตรวจสอบการดำเนินการสำหรับโทเค็นที่ถูกต้องเพื่อป้องกันการส่งแบบฟอร์มที่ซ้ำกัน

18

validation

ให้การสนับสนุนการตรวจสอบความถูกต้องสำหรับการดำเนินการ

โปรดดูเอกสารของ Struts 2 เพื่อดูรายละเอียดทั้งหมดเกี่ยวกับเครื่องดักฟังข้างต้น แต่ฉันจะแสดงวิธีใช้เครื่องสกัดกั้นโดยทั่วไปในแอปพลิเคชัน Struts ของคุณ

วิธีใช้ Interceptors?

ให้เราดูวิธีใช้เครื่องดักฟังที่มีอยู่แล้วกับโปรแกรม "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 Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเร็กทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -

ตอนนี้ป้อนคำใดก็ได้ในกล่องข้อความที่กำหนดแล้วคลิกปุ่มพูดสวัสดีเพื่อดำเนินการตามที่กำหนดไว้ ตอนนี้ถ้าคุณจะตรวจสอบบันทึกที่สร้างขึ้นคุณจะพบข้อความต่อไปนี้ -

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 interceptor ซึ่งกำลังบอกว่าการกระทำนั้นใช้เวลาทั้งหมด 109ms ในการดำเนินการ

สร้าง Custom Interceptors

การใช้เครื่องดักฟังแบบกำหนดเองในแอปพลิเคชันของคุณเป็นวิธีที่ยอดเยี่ยมในการมอบคุณสมบัติของแอปพลิเคชันแบบตัดขวาง การสร้างตัวสกัดกั้นแบบกำหนดเองนั้นง่ายมาก อินเทอร์เฟซที่ต้องขยายมีดังต่อไปนี้Interceptor อินเตอร์เฟซ -

public interface Interceptor extends Serializable {
   void destroy();
   void init();
   String intercept(ActionInvocation invocation)
   throws Exception;
}

ตามชื่อที่แนะนำเมธอด init () จัดเตรียมวิธีเริ่มต้นตัวสกัดกั้นและเมธอด destroy () จัดเตรียมสิ่งอำนวยความสะดวกสำหรับการล้างข้อมูลสกัดกั้น ต่างจากการดำเนินการ interceptors จะถูกนำกลับมาใช้ในการร้องขอและจำเป็นต้องมีความปลอดภัยโดยเฉพาะอย่างยิ่งวิธีการดักฟัง

ActionInvocationอ็อบเจ็กต์จัดเตรียมการเข้าถึงสภาพแวดล้อมรันไทม์ อนุญาตให้เข้าถึงการดำเนินการเองและวิธีการเรียกใช้การดำเนินการและพิจารณาว่ามีการเรียกใช้การดำเนินการแล้วหรือไม่

หากคุณไม่จำเป็นต้องเริ่มต้นหรือรหัสล้างข้อมูลไฟล์ AbstractInterceptorสามารถขยายชั้นเรียนได้ สิ่งนี้ให้การดำเนินการ nooperation เริ่มต้นของเมธอด init () และ destroy ()

สร้างคลาส Interceptor

ให้เราสร้าง 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()เรียกว่า ActionInvocation ให้คำปรึกษาเกี่ยวกับสถานะและดำเนินการตามที่ผู้สกัดกั้นจะตามมา เมื่อมีการเรียกใช้ interceptors ที่กำหนดค่าไว้ทั้งหมดแล้วเมธอด invoke () จะทำให้การดำเนินการดำเนินการเอง

แผนภาพต่อไปนี้แสดงแนวคิดเดียวกันผ่านขั้นตอนการร้องขอ -

สร้างคลาสการดำเนินการ

ให้เราสร้างไฟล์ java 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;
   }
}

นี่คือคลาสเดียวกันกับที่เราได้เห็นในตัวอย่างก่อนหน้านี้ เรามี getters มาตรฐานและวิธี setter สำหรับคุณสมบัติ "name" และวิธีการดำเนินการที่ส่งคืนสตริง "success"

สร้างมุมมอง

ให้เราสร้างไฟล์ jsp ด้านล่าง HelloWorld.jsp ในโฟลเดอร์ WebContent ในโปรเจ็กต์ eclipse ของคุณ

<%@ 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.jspในโฟลเดอร์ WebContent ไฟล์นี้จะทำหน้าที่เป็น URL การดำเนินการเริ่มต้นที่ผู้ใช้สามารถคลิกเพื่อบอกกรอบงาน Struts 2 เพื่อเรียกใช้เมธอดที่กำหนดไว้ของคลาส HelloWorldAction และแสดงผลมุมมอง HelloWorld.jsp

<%@ 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 การดำเนินการที่กำหนดไว้ในไฟล์มุมมองด้านบนจะแมปกับคลาส HelloWorldAction และวิธีการดำเนินการโดยใช้ไฟล์ struts.xml

ไฟล์การกำหนดค่า

ตอนนี้เราต้องลงทะเบียน interceptor ของเราแล้วเรียกมันตามที่เราเรียกว่า default interceptor ในตัวอย่างก่อนหน้านี้ ในการลงทะเบียน interceptor ที่กำหนดใหม่แท็ก <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 จะต้องสร้างขึ้นภายใต้โฟลเดอร์ WEB-INF ภายใต้ WebContent ดังต่อไปนี้ -

<?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 Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเร็กทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -

ตอนนี้ป้อนคำใดก็ได้ในกล่องข้อความที่กำหนดแล้วคลิกปุ่มพูดสวัสดีเพื่อดำเนินการตามที่กำหนดไว้ ตอนนี้ถ้าคุณจะตรวจสอบบันทึกที่สร้างขึ้นคุณจะพบข้อความต่อไปนี้ที่ด้านล่าง -

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 ... /> แต่ละแท็กอ้างอิงทั้ง interceptor หรือ interceptor stack ที่กำหนดค่าไว้ก่อน interceptor stack ปัจจุบัน ดังนั้นจึงเป็นเรื่องสำคัญมากที่จะต้องแน่ใจว่าชื่อนั้นไม่ซ้ำกันในการกำหนดค่าสแต็ก interceptor และ interceptor ทั้งหมดเมื่อกำหนดค่า interceptor เริ่มต้นและ interceptor stack

เราได้เห็นวิธีการใช้ interceptor กับการกระทำแล้วการใช้ interceptor stack ก็ไม่แตกต่างกัน อันที่จริงเราใช้แท็กเดียวกัน -

<action name = "hello" class = "com.tutorialspoint.struts2.MyAction">
   <interceptor-ref name = "basicStack"/>
   <result>view.jsp</result>
</action

การลงทะเบียนข้างต้นของ "basicStack" จะลงทะเบียนเงินเดิมพันที่สมบูรณ์ของผู้สกัดกั้นทั้งหกด้วยการดำเนินการสวัสดี สิ่งนี้ควรสังเกตว่าตัวสกัดกั้นถูกดำเนินการตามลำดับซึ่งได้รับการกำหนดค่าไว้ ตัวอย่างเช่นในกรณีข้างต้นข้อยกเว้นจะถูกดำเนินการก่อนส่วนที่สองจะเป็น servlet-config เป็นต้น