8. Eklenti Oluşturma
Struts uygulamasının başlatılması sırasında yüklenen ve kapatılması sırasında kaldırılan eklenti (plugin) adı verilen uygulamalar oluşturulabilir. Bu, genellikle uygulamanın başlatılması sırasında başlatma işlemlerini gerçekleştirmeye ve kapatılması sırasında kaynakları serbest bırakmaya olanak tanır. Bu işlemler, ActionServlet sınıfını denetleyiciden türetilerek de gerçekleştirilebilir; önceki uygulamada da bu yöntem kullanılmıştır. Eklenti, bu çözüme bir alternatiftir. Eklenti, basit bir ortam başlatma işleminden daha karmaşık bir uygulama olabilir. Buna bir örneği, bildirimsel doğrulama kuralları kavramlarının tanıtıldığı derste görmüştük. Bir eklenti, Struts yapılandırma dosyasında bildirilir. ValidatorPlugIn eklentisi, onu kullanan uygulamanın struts-config.xml dosyasında şu şekilde bildirilmişti:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property
property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"
/>
</plug-in>
Şimdi bir eklenti kullanan bir Struts uygulamasını açıklayacağız.
8.1. Struts /plugin1 uygulamasının yapılandırılması
Aşağıdaki şekilde yapılandırılmış /plugin1 adlı Struts uygulamasını oluşturmayı planlıyoruz:
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
</web-app>
Standart olan bu dosya üzerinde fazla durmayacağız.
struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<plug-in className="istia.st.struts.plugins.MyPlugin">
<set-property property="passwdFileName" value="data/passwd"/>
<set-property property="groupFileName" value="data/group"/>
</plug-in>
</struts-config>
Sadece bir bölüm ekledik, o da eklenti için olan bölüm. Burada kullanılan <plug-in> etiketinin öznitelikleri şunlardır:
eklenti sınıfının adı | |
eklentiyi (anahtar, değer) çiftleriyle başlatmaya olanak tanır |
Bu uygulamanın amacı, eklentinin başlatma parametrelerini nasıl alabileceğini ve bunları aynı uygulama bağlamını paylaşan diğer nesnelere nasıl sunabileceğini göstermektir. Eklentinin başlatma değerlerini görüntülemek için basit bir JSP görünümü kullanacağız; bu nedenle yapılandırma dosyasında herhangi bir eylem bulunmamaktadır.
8.2. Eklentinin Java sınıfı
Bir Struts uygulamasına eklenti olarak kullanılan bir Java sınıfı, org.apache.struts.action.PlugIn arayüzünü uygulamalıdır. Bu uygulama, iki yöntem yazılmasından ibarettir:
- public void init(ActionServlet servlet, ModuleConfig conf)
- public void destroy()
Struts uygulaması yüklendiğinde, denetleyicisi struts-config.xml dosyasında bildirilen tüm eklentilerin örneklerini oluşturur. Ardından, her birinin init yöntemini çalıştırır. Eklenti, bu yöntem içinde başlatma işlemlerini gerçekleştirir. Burada, eklentinin başlatma parametrelerini okumakla yetineceğiz ve bunları uygulamanın bağlamına ekleyeceğiz; böylece uygulamanın diğer tüm nesneleri için kullanılabilir hale gelecekler. Uygulama kapatılacağı zaman, denetleyici yüklü olan her bir eklentinin destroy yöntemini çalıştıracaktır. Bu, artık gereksiz hale gelen kaynakları serbest bırakma zamanıdır. Burada yapmamız gereken bir şey yoktur.
Sınıfın kodu şöyledir:
package istia.st.struts.plugins;
import javax.servlet.ServletException;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.config.PlugInConfig;
public class MyPlugin implements PlugIn {
// uygulama bağlamı silindiğinde çağrılan yöntem
public void destroy() {
}
// uygulama bağlamının ilk oluşturulmasında çağrılan yöntem
public void init(ActionServlet servlet, ModuleConfig conf)
throws ServletException {
// bu nesnenin sınıf adı
String className=this.getClass().getName();
// eklenti listesi
PlugInConfig[] pluginConfigs = conf.findPlugInConfigs();
// bu sınıfın adını taşıyan eklentiyi bulmak için eklentilerin taranması
// bu sınıfın adını taşıyan eklentiyi bulmak için eklentilerin taranması
boolean trouvé=false;
for (int i = 0; ! trouvé && i < pluginConfigs.length; i++) {
// eklenti adı
String pluginClassName=pluginConfigs[i].getClassName();
// eğer doğru eklenti değilse, devam edilir
if(! pluginClassName.equals(className)) continue;
// doğru eklenti ise - özelliklerini bağlamda saklıyoruz
servlet.getServletContext().setAttribute("initialisations",pluginConfigs[i].getProperties());
trouvé=true;
}//for i
} //başlat
} //sınıf
Aşağıdaki noktalara dikkat edilmelidir:
- init yöntemi, burada conf olarak adlandırılan ve ModuleConfig türünde bir parametre alır; bu parametre, struts-config.xml dosyasının içeriğine erişim sağlar.
- [ModuleConfig].findPlugInConfigs() yöntemi, Struts yapılandırma dosyasındaki tüm <plug-in> bölümlerini bir PlugInConfig nesneleri dizisi biçiminde almayı sağlar.
- PluginConfig sınıfı, yapılandırma dosyasındaki bir <plug-in> bölümünü temsil eder. [PlugInConfig].getProperties yöntemi, bölümün <set-property> öğelerine bir java.util.Map sözlüğü biçiminde erişmemizi sağlar.
- Eklentinin özellik sözlüğü, uygulamanın bağlamına yerleştirilir.
- Birden fazla eklenti olabileceğinden, ilgilendiğimiz eklentiyi bulmamız gerekir. Bu, çalıştırılan sınıfla aynı adı taşıyan eklentidir.
Burada sözlüğün tamamını bağlama yerleştirmek tercih ettik. Bu sözlüğü kullanmak da isteyebilirdik. Aşağıdaki kod dizisi, bunu yapmanın bir yolunu göstermektedir:
Map initialisations = pluginConfigs[i].getProperties();
// sözlüğün girdileri üzerinde yineleme
Iterator entrées = initialisations.entrySet().iterator();
while (entrées.hasNext()) {
// geçerli (anahtar, değer) girdisini al
Map.Entry entrée = (Map.Entry) entrées.next();
String clé = (String) entrée.getKey();
String valeur = (String) entrée.getValue();
// (anahtar, değer) üzerinde işlem yap
//...
}
8.3. infos.jsp görünümünün kodu
infos.jsp görünümü, uygulama bağlamına yerleştirilen eklentinin özellikler sözlüğünün içeriğini görüntülemekle görevlidir. infos.jsp görünümü bu bağlamın bir parçası olduğu için bu bağlama erişebilir. Kod şu şekildedir:
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html>
<head>
<title>Plugin</title>
</head>
<body>
<h3>Infos du plugin<br></h3>
<table border="1">
<tr>
<th>Clé</th><th>Valeur</th>
</tr>
<logic:iterate id="element" name="initialisations">
<tr>
<td><bean:write name="element" property="key"/></td>
<td><bean:write name="element" property="value"/></td>
</tr>
</logic:iterate>
</table>
</body>
</html>
Dikkat edilmesi gereken noktalar:
- struts-logic ve struts-bean etiket kütüphanelerini kullanıyoruz
- <logic:iterate> etiketi, eklentinin init yöntemi tarafından bağlama yerleştirilen initializations sözlüğünü görüntülememizi sağlar. name özniteliği, üzerinde yineleme yapılacak nesneyi belirtir. Bu, bir koleksiyona, yineleyiciye vb. benzeyen bir şey olmalıdır. Nesne, tüm kapsamlarda (sayfa, istek, oturum, bağlam) aranır. Burada nesne, context kapsamında bulunur. id parametresi, yinelemeler sırasında koleksiyonun geçerli öğesine bir ad vermek için kullanılır. Burada, <logic:iterate> etiketinin gövdesinde, element bir sözlüğün geçerli elemanını temsil edecektir. Bu, kabaca sözlüğün bir (anahtar, değer) çifti olan java.util.Map.Entry nesnesiyle temsil edilir.
- <logic:iterate> etiketinin gövdesinde, geçerli element öğesinin içeriği görüntülenir (<bean:write>). Bu öğe, iki özelliğe (property) sahip bir nesne olarak kabul edilir: key anahtarı ve value değeri. Bu iki özellik görüntülenir.
8.4. Dağıtım
Uygulamanın bağlamı, Tomcat'ın server.xml yapılandırma dosyasında tanımlanır:
<Context path="/plugin11" reloadable="true" docBase="E:\data\serge\web\struts\plugins\1" />
Uygulamanın dizin yapısı şu şekildedir:
![]() ![]() | ![]() | |
![]() | ||
8.5. Testler
Tomcat'i başlatıyoruz ve URL http://localhost:8080/plugin1/infos.jsp adresini çağırıyoruz:

infos.jsp görünümünün, eklenti aracılığıyla uygulama bağlamında depolanan bilgilere başarıyla eriştiğini görüyoruz.
8.6. Sonuç
Bir eklenti yardımıyla bir Struts uygulamasını başlatabileceğimizi gösterdik. Bu, aynı işi yapmak için ActionServlet sınıfını türetmeye alternatif bir çözüm olabilir.



