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 เป็นต้น