Dikmeler 2 - Durdurucular
Durdurucular kavramsal olarak sunucu uygulaması filtreleri veya JDKs Proxy sınıfıyla aynıdır. Durdurucular, çapraz kesim işlevinin hem eylemden hem de çerçeveden ayrı olarak uygulanmasına izin verir. Önleyiciler kullanarak aşağıdakileri elde edebilirsiniz -
Eylem çağrılmadan önce ön işleme mantığının sağlanması.
İşlem çağrıldıktan sonra son işlem mantığının sağlanması.
Alternatif işlemlerin gerçekleştirilebilmesi için istisnaların yakalanması.
Sağlanan özelliklerin çoğu Struts2 çerçeve, önleyiciler kullanılarak uygulanır;
Examples istisna işlemeyi, dosya yüklemeyi, yaşam döngüsü geri aramalarını, vb. içerir. Aslında, Struts2 işlevlerinin çoğunu önleyiciler üzerinde vurguladığından, eylem başına atanmış 7 veya 8 durdurucu olması muhtemel değildir.
Struts2 Çerçeve Durdurucular
Struts 2 çerçevesi, önceden yapılandırılmış ve kullanıma hazır olarak gelen kullanıma hazır durdurucuların iyi bir listesini sağlar. Önemli engelleyicilerden birkaçı aşağıda listelenmiştir -
Sr.No | Durdurucu ve Açıklama |
---|---|
1 | alias Parametrelerin istekler arasında farklı ad takma adlarına sahip olmasına izin verir. |
2 | checkbox İşaretlenmemiş onay kutuları için bir parametre değeri false ekleyerek, onay kutularının yönetilmesine yardımcı olur. |
3 | conversionError Dizeleri parametre türlerine dönüştürmekten gelen hata bilgilerini eylemin alan hatalarına yerleştirir. |
4 | createSession Zaten mevcut değilse otomatik olarak bir HTTP oturumu oluşturur. |
5 | debugging Geliştiriciye birkaç farklı hata ayıklama ekranı sağlar. |
6 | execAndWait Eylem arka planda yürütülürken kullanıcıyı bir ara bekleme sayfasına gönderir. |
7 | exception Bir eylemden bir sonuca atılan istisnaları eşler ve yönlendirme yoluyla otomatik istisna işlemeye izin verir. |
8 | fileUpload Kolay dosya yüklemeyi kolaylaştırır. |
9 | i18n Bir kullanıcının oturumu sırasında seçilen yerel ayarı takip eder. |
10 | logger Yürütülen eylemin adının çıktısını alarak basit günlük kaydı sağlar. |
11 | params Eylemdeki istek parametrelerini ayarlar. |
12 | prepare Bu, genellikle kurulum veritabanı bağlantıları gibi ön işleme çalışmaları yapmak için kullanılır. |
13 | profile Eylemler için basit profil bilgilerinin günlüğe kaydedilmesine izin verir. |
14 | scope Eylemin durumunu oturum veya uygulama kapsamında depolar ve alır. |
15 | ServletConfig Eyleme, çeşitli sunucu uygulaması tabanlı bilgilere erişim sağlar. |
16 | timer Eylemin yürütülmesinin ne kadar süreceği şeklinde basit profil bilgileri sağlar. |
17 | token Yinelenen form gönderimini önlemek için geçerli bir belirteç için eylemi denetler. |
18 | validation Eylemler için doğrulama desteği sağlar |
Yukarıda belirtilen durdurucularla ilgili tüm ayrıntılar için lütfen Struts 2 belgelerine bakın. Ancak size Struts uygulamanızda genel olarak bir durdurucuyu nasıl kullanacağınızı göstereceğim.
Durdurucular Nasıl Kullanılır?
"Merhaba Dünya" programımızda zaten var olan bir önleyiciyi nasıl kullanacağımızı görelim. KullanacağıztimerBir eylem yönteminin uygulanmasının ne kadar sürdüğünü ölçmeyi amaçlayan engelleyici. Aynı zamanda kullanıyorumparamseylemin amacı istek parametrelerini göndermek olan engelleyici. Örneğinizi bu engelleyiciyi kullanmadan deneyebilirsiniz ve bunu bulacaksınız.name özellik, parametre eyleme erişemediği için ayarlanmıyor.
HelloWorldAction.java, web.xml, HelloWorld.jsp ve index.jsp dosyalarını oluşturuldukları gibi saklayacağız. Examples bölümü değiştirelim ama struts.xml aşağıdaki gibi bir engelleyici eklemek için dosya -
<?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>
Proje adına sağ tıklayın ve tıklayın Export > WAR FileSavaş dosyası oluşturmak için. Ardından bu SAVAŞI Tomcat'in webapps dizinine yerleştirin. Son olarak, Tomcat sunucusunu başlatın ve URL'ye erişmeyi deneyinhttp://localhost:8080/HelloWorldStruts2/index.jsp. Bu, aşağıdaki ekranı oluşturacaktır -
Şimdi verilen metin kutusuna herhangi bir kelime girin ve tanımlanan eylemi yürütmek için Merhaba Deyin düğmesine tıklayın. Şimdi, oluşturulan günlüğü kontrol ederseniz, aşağıdaki metni bulacaksınız -
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.
Burada alt satır, çünkü timer Eylemin gerçekleştirilmesinin toplam 109 ms sürdüğünü söyleyen önleme görevlisi.
Özel Durdurucular Oluşturun
Uygulamanızda özel durdurucular kullanmak, çapraz kesme uygulama özellikleri sağlamanın zarif bir yoludur. Özel bir durdurucu oluşturmak kolaydır; genişletilmesi gereken arayüz aşağıdaki gibidirInterceptor arayüz -
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation)
throws Exception;
}
Adlardan da anlaşılacağı gibi, init () yöntemi, engelleyiciyi başlatmak için bir yol sağlar ve destroy () yöntemi, engelleyici temizliği için bir kolaylık sağlar. Eylemlerin aksine, durdurucular istekler arasında yeniden kullanılır ve özellikle intercept () yöntemi olmak üzere iş parçacığı açısından güvenli olmaları gerekir.
ActionInvocationnesne, çalışma zamanı ortamına erişim sağlar. Eylemin kendisine ve yöntemlere, eylemi çağırmak ve eylemin zaten çağrılıp çağrılmadığını belirlemek için erişim sağlar.
Başlatma veya temizleme koduna ihtiyacınız yoksa, AbstractInterceptorsınıf uzatılabilir. Bu, init () ve destroy () yöntemlerinin varsayılan bir işlemsiz uygulamasını sağlar.
Interceptor Sınıfı Oluşturun
Aşağıdaki MyInterceptor.java dosyasını oluşturalım Java Resources > src klasör -
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;
}
}
Fark ettiğiniz gibi, gerçek eylem durdurucu kullanılarak yürütülecektir. invocation.invoke()aramak. Böylece, ihtiyacınıza göre bazı ön işleme ve bazı son işlemler yapabilirsiniz.
Çerçeve, ActionInvocation nesnesinin invoke () öğesine ilk çağrıyı yaparak süreci başlatır. Her seferindeinvoke()ActionInvocation, durumuna danışır ve daha sonra gelen engelleyiciyi çalıştırır. Yapılandırılan tüm durdurucular çağrıldığında, invoke () yöntemi eylemin kendisinin yürütülmesine neden olacaktır.
Aşağıdaki şema, bir istek akışı aracılığıyla aynı kavramı göstermektedir -
Eylem Sınıfı Oluşturun
HelloWorldAction.java altında bir java dosyası oluşturalım Java Resources > src paket adı ile com.tutorialspoint.struts2 aşağıda verilen içeriklerle.
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;
}
}
Bu, önceki örneklerde gördüğümüzle aynı sınıftır. "Name" özelliği için standart alıcılara ve ayarlayıcı yöntemlere ve "başarı" dizesini döndüren bir yürütme yöntemine sahibiz.
Görünüm Oluşturun
Aşağıdaki jsp dosyasını oluşturalım HelloWorld.jsp tutulma projenizdeki WebContent klasöründe.
<%@ 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>
Ana Sayfa Oluştur
Ayrıca yaratmalıyız index.jspWebContent klasöründe. Bu dosya, kullanıcının Struts 2 çerçevesine HelloWorldAction sınıfının tanımlı bir yöntemini çağırmasını ve HelloWorld.jsp görünümünü oluşturmasını söylemek için tıklatabileceği ilk eylem URL'si olarak hizmet edecektir.
<%@ 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 Yukarıdaki görünüm dosyasında tanımlanan eylem, struts.xml dosyası kullanılarak HelloWorldAction sınıfına ve yürütme yöntemine eşlenecektir.
Yapılandırma Dosyaları
Şimdi, önleyicimizi kaydetmeli ve ardından önceki örnekte varsayılan engelleyici dediğimiz gibi çağırmalıyız. Yeni tanımlanmış bir durdurucuyu kaydetmek için <interceptors> ... </interceptors> etiketleri doğrudan <package> etiketlerinin altına yerleştirilirstruts.xmldosya. Önceki örneğimizde yaptığımız gibi, varsayılan engelleyiciler için bu adımı atlayabilirsiniz. Ama burada kayıt olalım ve aşağıdaki gibi kullanalım -
<?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>
İçeride birden fazla durdurucu kaydedebileceğiniz unutulmamalıdır. <package> etiketleyin ve aynı zamanda, <action>etiket. Aynı durdurucuyu farklı eylemlerle çağırabilirsiniz.
Web.xml dosyasının WebContent altındaki WEB-INF klasörü altında aşağıdaki gibi oluşturulması gerekir -
<?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>
Proje adına sağ tıklayın ve tıklayın Export > WAR FileSavaş dosyası oluşturmak için. Ardından bu SAVAŞI Tomcat'in webapps dizinine yerleştirin. Son olarak, Tomcat sunucusunu başlatın ve URL'ye erişmeyi deneyinhttp://localhost:8080/HelloWorldStruts2/index.jsp. Bu, aşağıdaki ekranı oluşturacaktır -
Şimdi verilen metin kutusuna herhangi bir kelime girin ve tanımlanan eylemi yürütmek için Merhaba Deyin düğmesine tıklayın. Şimdi, oluşturulan günlüğü kontrol ederseniz, aşağıdaki metni altta bulacaksınız -
Pre-Processing
Inside action....
Post-Processing
Çoklu Durdurucu İstifleme
Tahmin edebileceğiniz gibi, her eylem için birden fazla durdurucu yapılandırmak zorunda kalmak, hızla son derece yönetilemez hale gelir. Bu nedenle, durdurucular, önleme yığınları ile yönetilir. İşte doğrudan strutsdefault.xml dosyasından bir örnek -
<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>
Yukarıdaki hisseye basicStackve yapılandırmanızda aşağıda gösterildiği gibi kullanılabilir. Bu yapılandırma düğümü, <paket ... /> düğümünün altına yerleştirilir. Her <interceptor-ref ... /> etiketi, bir durdurucuya veya geçerli engelleyici yığınından önce yapılandırılmış bir durdurucu yığınına başvurur. Bu nedenle, ilk durdurucuları ve durdurucu yığınlarını yapılandırırken adın tüm durdurucu ve durdurucu yığın yapılandırmalarında benzersiz olmasını sağlamak çok önemlidir.
Önleyiciyi eyleme nasıl uygulayacağımızı zaten görmüştük, durdurucu yığınları uygulamak farklı değil. Aslında, tamamen aynı etiketi kullanıyoruz -
<action name = "hello" class = "com.tutorialspoint.struts2.MyAction">
<interceptor-ref name = "basicStack"/>
<result>view.jsp</result>
</action
Yukarıdaki "basicStack" kaydı, merhaba eylemi ile altı engelleyicinin tamamının hissesini kaydedecektir. Bu, durdurucuların yapılandırıldıkları sırayla yürütüldüğüne dikkat edilmelidir. Örneğin, yukarıdaki durumda, istisna ilk olarak yürütülecektir, ikincisi servlet-config vb. Olacaktır.