String içerisindeki noktalama işaretlerinden kurtulmak

Bazen String ifadeler içerisindeki noktalama işaretlerinden kurtulmak isteyebilirsiniz.

İhtiyaç durumunda hayatınızı kurtaracak o kısa kod aşağıdaki gibidir.

[codesyntax lang=”java” lines=”no”]

replaceAll("\p{P}", "")

[/codesyntax]

Kendi yazdığımız cümle için kullanalım.

[codesyntax lang=”java” lines=”no”]

public static void main(String[] args) {
	String cumle = "-Hangi takımı tutuyorsun? "
			+ "-Beşiktaş(!) "
			+ "-Bir gün herkes Beşiktaşlı olmasın; "
			+ "-Bırakın o ayrıcalık bizde kalsın... ";
	String[] kelimeler = cumle.replaceAll("\p{P}", "").split("\s");
	for (String kelime : kelimeler) {
		System.out.println(kelime);
	}
}

[/codesyntax]

Kodumuzu çalıştırdığımız zaman ?,!,;.,(,) gibi özel karakterleri cümlemizden çıkartmış oluyoruz.

Kelimeleri tek tek ekrana yazdırdığımızda çıktı da aşağıdaki gibi oluyor.

cikti

Android uygulamalarda roboguice kullanımı

Android uygulamalarda Java kodundan layout dosyalarında tanımlanmış görsel öğelere erişmek için en çok kullandığımız yöntem findViewById metodunu çağırmaktır. Bu metodu kullandığımızda bize geriye View nesnesi döner. Yani dönen nesne bir giriş kutusu (EditText) elemanı olabileceği gibi bir düğme (Button) veya bir işaret kutusu (Checkbox) da olabilir.

İstediğimiz görsel elemanın özelliklerini kullanabilmek için ise explicit casting yaparız. Örneğin bir düğmeye tıklandığında çalışmasını istediğimiz kod bloğu varsa, düğmeye erişmek için önce aşağıdaki kodu yazarız.

[codesyntax lang=”java” lines=”no”]

Button button = (Button) findViewById(R.id.button1);

[/codesyntax]

Yalnız bu şekilde bir kod yazdığımızda id’si button1 olan View nesnesi bize dönecektir. Dönen View bir Button nesnesi değilse çalışma anında hata alırız.

Bu hatalardan kurtulmak için geliştirilmiş Roboguice Framework‘u ile nesnelerimizi CDI ile yaratabiliriz. Dolayısı ile yukarıdaki gibi bir kodlama yerine sadece ilgili annotationlar kullanarak nesnelerimize erişebiliriz.

Roboguice kullanmak için tek yapmamız gereken framework’un kütüphanelerini uygulamamızın build path’ine koymak, Activity sınıfımızı RoboActivity sınıfından türetmek ve ilgili annotation‘ları çağırmaktır.

Örneğin Java sınıfından eriştiğimiz bir Button nesnesinin kodunu aşağıdaki gibi yazabiliriz.

[codesyntax lang=”java” lines=”no”]

@InjectView(R.id.btnGoster)
private Button btnGoster;

[/codesyntax]

Layout’ta tanımlı birden fazla Button nesnesi olabileceği için hangisine erişmek istiyorsak @InjectView annotation‘ını kullanırken Button’un id özelliğini de veriyoruz.

[box type=”download”] Roboguice kütüphanelerine buradan ulaşabilirsiniz.[/box]

Jar dosyalarını indirdikten sonra libs dizini altına kopyalayabilirsiniz.

Bu adımdan sonra yapacağımız iş Java sınıflarımızı Activity sınıfından değil RoboActivity sınıfından türetmek.

Roboguice framework’ünü kullandığımız zaman sadece layout dosyalarındaki View nesnelerine değil, resources dizinindeki resim dosyalarımıza ya da string.xml dosyasındaki metinlerimize ve sistem servislerine de direk erişebiliriz.

Bunun için sınıfımız içerisinde kullanmamız gereken @Inject annotationları aşağıdaki gibidir.

[codesyntax lang=”java” lines=”no”]

@InjectView(R.id.text)
TextView name;

@InjectView(R.id.imageView1)
ImageView thumbnail;

@InjectResource(R.drawable.ic_launcher)
Drawable icon;

@InjectResource(R.string.app_name)
String myName;

// System service
@Inject
LocationManager loc;

[/codesyntax]

Kaynak : https://code.google.com/p/roboguice/

Java EE’de Injection Mekanizması

Java EE, nesnelerin instance’larını yaratmadan direk erişilebilmesini sağlayan iki tip injection mekanizması destekler. Sadece gerekli olan kaynaklar ve bağımlı oldukları nesneler annotation‘lar ile belirtilir. Geri kalan tüm iş Container tarafından ele alınır. Bu yazımda kullanılan iki tip Injection ile ilgili bilgiler vermeye çalışacağım :

      1. Resource Injection :

Container tarafından yönetilen ve JNDI ile erişebildiğimiz nesnelere erişmek için kullanılır. Örneğin Servlet sınıfları, Managed Bean’ler, Enterprise Bean’ler ya da sunucuda tanımlanmış olan bağlantı havuzları gibi veri kaynakları.

@Resource annotation’ı kullanılır.

[codesyntax lang=”java5″ lines=”no”]

public class MyServlet extends HttpServlet {
	@Resource(name="java:comp/erkin")
	private Datasource dsc;
	...
}

[/codesyntax]

Benzer bir iş setter metodu tanımlayarak da kullanılabilir.

[codesyntax lang=”java5″ lines=”no”]

public class MyServlet extends HttpServlet {
	private Datasource dsc;
	...
	@Resource(name="java:comp/erkin")
	public void setDsc(Datasource ds) {
		dsc = ds;
	}
}

[/codesyntax]

[box type=”info”] Setter metotlarının mutlaka void dönüş tipi olması, metot isminin set ile başlaması ve tek bir parametre alması gerekir.[/box]

 @Resource annotation’ı type safe olmadığı için dönen nesnelerle atanan nesnelerin tipinin aynı olması gerekir. Aynı olmadığı takdirde çalışma anında hata alırsınız.

     2. Dependency Injection :

Dependency Injection sayesinde normal Java sınıfları, managed nesnelere dönüştürülerek Container tarafından yönetilen başka bir nesne içerisinde kullanılabilir.

@Inject annotation’ı kullanılır. Bu annotation ile belirtilen neesnelerin tüm yaşam döngüleri (yaratılmasından yok edilmesine kadar) Container tarafından yönetilir. Ayrıca Java EE Inject edilen bean’ler için geçerlilik bölgeleri tanımlar. (Scope)

[codesyntax lang=”java5″ lines=”no”]

@RequestScoped
public class CurrencyConverter { ... }

[/codesyntax]

Servlet sınıfı içindeki kod :

[codesyntax lang=”java5″ lines=”no”]

public class MyServlet extends HttpServlet {
    @Inject CurrencyConverter cc;
    ...
}

[/codesyntax]

Resource Injection’a kıyasla Dependency Injection’da nesneler type safe yönetilirler.

Aralarındaki genel farklar :

cdi

Kaynak : http://docs.oracle.com/javaee

NetBeans IDE 7.4 Beta

NetBeans 7.3 sürümünde eklenen Java EE 7 desteği beta sürüm olan 7.4’te geliştirilmeye devam ediyor. HTML 5 destekli dinamik web sayfaları tasarlayabilirsiniz. Önümüzdeki aylarda çıkması beklenen JDK 8’in de geliştirilmeye devam eden sürümü NetBeans 7.4 Beta’da desteklenmiş.

Geliştirme ortamını indirmek için

[box type=”download”] buraya tıklayabilirsiniz[/box]

Desteklenen yeni teknolojiler ;

HTML5

  • Phonegap application development
  • Support for Android and iOS Browsers
  • Editing support for stylesheet languages: SASS and LESS
  • Browser switcher in main toolbar
  • Saving changes from Chrome Developer Tools
  • Network monitor
NetBeans IDE Browser Switcher
Full Screenshot

Java EE

  • HTML5 features available in Java EE projects
  • Wizards for JSF 2.2 Resource Library Contracts and FacesComponents
HTML5 Application in Java EE in NetBeans IDE

PHP

  • HTML5 features available in PHP applications
  • Nette Framework 2 (with Latte templates) and Zend Framework 2 support
  • Atoum testing framework support
  • Editor and Rename type refactoring improvements
  • Static code analysis support
Nette Framework2 Support in NetBeans IDE
Full Screenshot

Java

  • Preview support for JDK 8 features: Profiles, Lambdas
  • Code completion, Hints and Refactoring improvements
  • Native packaging
  • Updated bundled Ant 1.9.0 and Maven 3.0.5
JDK8 Preview Support in NetBeans IDE

JavaScript

  • Editing support for AngularJS, Knockout and ExtJS frameworks
  • Navigator and code folding in JSON files
  • Enhanced code completion with improved accuracy
JSON Navigator in NetBeans IDE
Full Screenshot

JavaFX

  • New FXML File dialog in Maven projects
  • Tighter alignment for JavaSE and JavaFX project types
  • Improvements to Project Deployment options

C/C++

  • Run/Debug launchers support
  • Find Usages improvements
  • C/C++ formatting style per project
Find Usages improvements in NetBeans IDE

Miscellaneous

  • Lock Contention for profiling tasks
  • Enhancements to Versioning tools: Subversion, Git, Mercurial
  • TestNG and Junit improvements
  • Improvements to Databases
  • New Tasks Dashboard and Notifications windows

 

Kaynak : netbeans.org

Dünyanın ilk Java EE 7 Sunucusu Glassfish

Mayıs 2013’te Glassfish sunucusunun son sürümü olan 4.0 versiyonu piyasaya sürüldü. Glassfish Server 4.0’ın en önemli özelliği Java EE 7 ‘ye destek vermesi. Desteklenen teknolojilere göz atacak olursak ;

Yeni Eklenen Teknolojiler :

  • Java API for JSON Processing (JSON-P) 1.0
  • Java API for WebSocket 1.0
  • Batch Applications for the Java Platform 1.0
  • Concurrency Utilities for Java EE 1.0
  • Java Message Service (JMS) 2.0
  • Java API for RESTful Web Services (JAX-RS) 2.0

Güncellenen Teknolojiler :

  • Enterprise Java Beans (EJB) 3.2
  • Contexts and Dependency Injection for Java EE (CDI) 1.1
  • Java Persistence API (JPA) 2.1
  • JavaServer Faces (JSF) 2.2
  • Java Servlet 3.1
  • Bean Validation (BV) 1.1
  • Expression Language (EL) 3.0
  • Interceptors 1.2
  • Java Transaction API (JTA) 1.2
  • JavaServer Pages (JSP) 2.3
  • JavaMail 1.5

Yeni çıkan sunucunun bu sürümünün amacı, kod geliştiricilerin Java EE 7 platformu ile çalışabilmelerini sağlamak. Dolayısıyla cluster mimaride ya da gömülü sunucularda çalışmanız için henüz yeterli desteği vermeyebilir.

Eclipse Kepler’de Ctrl+Space çalışmama sorunu

Eclipse’in son sürümü Kepler geçtiğimiz günlerde release oldu.

Bugünkü dersimde denemek amaçlı kurulumu yaparak derse devam etmek istedim ancak Ctrl+Space content assist çalışmıyordu.

Sonra bu sorunun kısayol tuşlarının değiştirildiğinden dolayı kaynaklandığını düşündüm.

Ancak standart ayarlardan bazılarının kapalı gelmesi dolayısıyla kaynaklanıyormuş.

Aynı sıkıntıya düşerseniz çözüm yolu ;

Window -> Preferences -> Java -> Editor -> Content Assist -> Advanced

1

 

 

2

 

JSF 2.x sürümünde AJAX kullanımı

JSP Sayfasında AJAX Kullanımı” başlıklı yazımda AJAX teknolojisinin ne olduğundan ve JSP sayfalarındaki basit kullanımından söz etmiştim. Bu yazımda ise JSF 2 ve üstü sürümlerinde etiketlerimize nasıl AJAX eklediğimizi anlatmaya çalışacağım.

Öncelikle JSF’te hiç JavaScript ve XML bilmeden sayfalarımıza AJAX teknolojisini ekleyebileceğimizi belirtmek isterim.

Bunun için yapmamız gereken birkaç adım var.

  1. XHTML sayfasında <h:head> etiketi kullanılmalıdır. Bu etiketi eklediğimizde sayfamıza jsf.js dosyasını eklemiş oluruz. Bu sayede istekler AJAX isteği olarak gönderilebilir.
  2. Hangi bileşen AJAX isteği yaratacaksa, o bileşen kendi etiketi içerisinde <f:ajax> etiketini kullanmalıdır. Bu sayede hangi bileşenin isteği gönderirken AJAX isteği yarattığı belirtilmiş olur.
  3. Cevap döndükten sonra hangi bileşenlerin güncelleneceğini <f:ajax> etiketinin render özelliğinde söyleriz. Böylece sayfanın tamamı güncellenmez sadece render özelliğinde ID’sini verdiğimiz etiketler güncellenir.

Sadece bu 3 özelliği kullanarak basit bir örnek kod yazalım.

Web sayfamızda sadece bir button olsun. Bu button’a tıkladığımızda 1 ile 10 arasında rasgele bir sayı yaratarak aynı sayfada gösterelim. Ancak sayfamızın tamamı güncellenmeden sadece belirli bir bölgesinin güncellenmesini istiyoruz.

Bunun için sadece güncellenmesini istediğimiz etiketlere birer ID veriyoruz. Sonra da bu ID’leri <f:ajax> etiketinin render özelliğine veriyoruz.

[box type=”info”] Birden fazla bölge (etiket) güncellenecekse render özelliğinde ID’ler araya boşluk bırakılarak yazılır.[/box]

XHTML sayfa kodu aşağıdaki gibi olacaktır.

 

[codesyntax lang=”html4strict” lines=”no”]

<?xml version="1.0" encoding="ISO-8859-9" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"      
      xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9" />
<title>Insert title here</title>
</h:head>
<body>
	<h:form>
		<h:commandButton value="RASGELE SAYI" action="#{bean.rasgele}">
			<f:ajax render="etkilenecekId" />
		</h:commandButton>
		<br/>
		<h:outputText id="etkilenecekId" value="#{bean.sayi}" />
	</h:form>
</body>
</html>

[/codesyntax]

Managed Bean sınıfının kodu da aşağıdaki gibi olacaktır.

[codesyntax lang=”java” lines=”no”]

package com.javauzmani.ajax.beans;

import javax.faces.bean.ManagedBean;

@ManagedBean
public class Bean {

	private double sayi;

	public double getSayi() {
		return sayi;
	}

	public void setSayi(double sayi) {
		this.sayi = sayi;
	}

	public String rasgele() {
		setSayi(Math.random() * 10);
		return null;
	}
}

[/codesyntax]

Proje çalıştırdığımızda sayfanın tamamının güncellenmediğini göreceksiniz.

cikti1

cikti2

Struts 2’de Kendi Interceptor Sınıfımızı Yaratmak

Struts 2’de Interceptors sayesinde tüm istekler ve yönlendirmeler üzerinde işlemler gerçekleştirebiliriz. Bir web sayfasından gönderilen parametre Interceptors sayesinde Action sınıfı içerisindeki bir değişkenin değerine set edilir.  Ayrıca action metodumuz (Action sınıfındaki execute() metodu) çalışmadan önce ve sonra yapılacak işler varsa, Interceptors bize bu işleri gerçekleştirme imkanını sağlar.

Interceptors konfigurasyon dosyasında (struts.xml) belirli bir paket tanımı içerisinde tanımlanır. Konfigurasyon dosyalarında tanımladığımız paketleri genellikle struts-default.xml dosyasından extend ederiz. Bu sayede bu dosya içerisinde tanımlanmış tüm özellikleri kullanabiliriz.

[box type=”info”] struts-default.xml dosyası struts2-core-xxx.jar dosyası içerisindedir.[/box]

struts-default.xml dosyası içerisinde de halihazırda tanımlanmış birçok Interceptor vardır. Çoğu uygulama için bu tanımlar yeterli olacaktır.

Interceptor tanımları struts.xml dosyasında basit anlamda aşağıdaki gibi yapılır.

[box type=”warning”] Aşağıdaki tanım struts-default.xml dosyasından örnek olması amacıyla alınmıştır.[/box]

[codesyntax lang=”xml” lines=”no”]

<struts>
   ...
   <package name="struts-default">
      <interceptors>
         <interceptor name="alias"/>
         <interceptor name="autowiring"/>
         ...
      </interceptors>
   </package>
   ...
</struts>

[/codesyntax]

Konfigurasyon dosyasında birden fazla action tanımlanmışsa ve her bir action aynı Interceptor’ları kullanıyorsa, kullanılan Interceptor’lar bir stack tanımı yapılarak referans gösterilir.

[codesyntax lang="xml" lines="no"]
<package name="default" namespace="/" extends="struts-default">
     <interceptors>
        <interceptor-stack name="stack1">
             <interceptor-ref name="timer"/>
             <interceptor-ref name="logger"/>
             <interceptor-ref name="defaultStack" />
        </interceptor-stack>
    </interceptors>

    <action name="login">
        <interceptor-ref name="stack1"/>
        <result name="success">/menu.jsp</result>
    </action>

    <action name="logout">
        <interceptor-ref name="stack1"/>
        <result name="success">/logout.jsp</result>
    </action>
</package>
[/codesyntax]

[box type=”info”] Yukarıdaki örnekte timer, logger ve defaultstack isimli Interceptor’lar struts-default.xml dosyasında tanımlanmışlardır. İsterseniz kendi tanımladığınız Interceptor’ları da bir stack tanımı yaparak action içerisinde referans olarak verebilirsiniz.[/box]

Çok özel uygulamalar için kendi Interceptor sınıflarımızı yazma ihtiyacı duyabiliriz. Bu gibi durumlarda Interceptor sınıflarının nasıl tanımlandığını basit bir örnekle anlatmaya çalışayım.

Projemde kullandığım teknolojiler :

–          JDK 1.7

–          Eclipse Juno 4.2

–          Struts 2.3.8

–          Apache Tomcat 7

CustomInterceptor isminde yeni bir web projesi yaratıyorum.

İlk olarak JSP sayfamı tasarlıyorum.

index.jsp

[codesyntax lang=”html4strict” lines=”no”]

<%@ page language="java" contentType="text/html; charset=ISO-8859-9" pageEncoding="ISO-8859-9"%>
<%@ 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>
	<body>
       		<s:a href="tikla">Interceptor Test</s:a>
	</body>
</html>

[/codesyntax]

Basit bir sayfa ve sadece tek bir link var. Şimdi linke tıkladığımızda çalışacak Action sınıfını tasarlıyorum.

TiklaAction.java

[codesyntax lang=”java” lines=”no”]

package sample;

public class TiklaAction {

       public String execute() {
             System.out.println("Action calisti");
             return "success";
       }
}

[/codesyntax]

Bu sınıf da basit bir POJO ve sadece konsola “Action calisti” yazarak sayfayı yönlendiriyor. Yönlendirilecek sayfayı tasarlayalım.

success.jsp

[codesyntax lang=”html4strict” lines=”no”]

<%@ page language="java" contentType="text/html; charset=ISO-8859-9" pageEncoding="ISO-8859-9"%>
<%@ 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>
	<body>
       		<h1>Yönlendirilen Sayfa</h1>
	</body>
</html>

[/codesyntax]

Şimdi de Interceptor sınıflarımızı tasarlayalım. Bir sınıfın Interceptor olabilmesi için;

1-      Interceptor arayüzünü gerçekleştirmesi gerekir ya da

2-      Interceptor arayüzünü gerçekleştirmiş olan AbstractInterceptor sınıfından türemesi gerekir.

AbstractInterceptor sınıfını kullanıyorsak init() ve destroy() metotlarını ezme zorunluluğumuz kalmaz. Ben iki tane Interceptor sınıfı tanımlayacağım.

MyInterceptor1.java

[codesyntax lang=”java” lines=”no”]

package com.javauzmani.interceptors;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class MyInterceptor1 extends AbstractInterceptor {
       private static final long serialVersionUID = -299349963368714122L;

       @Override
       public String intercept(ActionInvocation inv) throws Exception {
             System.out.println("MyInterceptor1 sinifinda action sinifindaki execute metodu calismadan once yapilacak isler");
             String invocationResult = inv.invoke()
             System.out.println("MyInterceptor1 sinifinda action sinifindaki execute metodu calistiktan sonra yapilacak isler");
             return invocationResult;
       }
}

[/codesyntax]

MyInterceptor2.java

[codesyntax lang=”java” lines=”no”]

package com.javauzmani.interceptors;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class MyInterceptor2 extends AbstractInterceptor {
                private static final long serialVersionUID = -7461817391953291560L;

                @Override
                public String intercept(ActionInvocation inv) throws Exception {

                               System.out.println("MyInterceptor2 sinifinda action sinifindaki execute metodu calismadan once yapilacak isler");
                               String invocationResult = inv.invoke();
                               System.out.println("MyInterceptor2 sinifinda action sinifindaki execute metodu calistiktan sonra yapilacak isler");
                               return invocationResult;
                }
}

[/codesyntax]

Şimdi de konfigurasyon dosyasını tanımlayalım.

struts.xml

[codesyntax lang=”xml” lines=”no”]

<?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>
             <package extends="struts-default" name="myPackage">
                    <interceptors>
                           <interceptor class="com.javauzmani.interceptors.MyInterceptor1" name="myInterceptor1"></interceptor>
                           <interceptor class="com.javauzmani.interceptors.MyInterceptor2" name="myInterceptor2"></interceptor>
                    </interceptors>

                    <action class="com.javauzmani.action.TiklaAction" name="tikla">
                           <interceptor-ref name="myInterceptor1"></interceptor-ref>
                           <interceptor-ref name="myInterceptor2"></interceptor-ref>
                           <result name="success">/success.jsp</result>
                    </action>
             </package>
</struts>

[/codesyntax]

Interceptor’lar konfigurasyon dosyasında tanımlandıkları sırada çalışırlar.

web.xml dosyası aşağıdaki gibidir.

[codesyntax lang=”xml” lines=”no”]

<?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>CustomInterceptor</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.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

[/codesyntax]

Projemizi çalıştırdığımızda index.jsp sayfası gelecektir.

1

Linke tıkladığımızda sayfa success.jsp’ye yönlendirilir.

2

Konsol çıktısı da aşağıdaki gibi olur.

3

Action sınıfları Servlet sınıflarından farklı olarak thread-safe çalışırlar. Gelen her istek için Action sınıfının bir instance’ı yaratılır. Servlet’lerde ise aynı instance gelen her istek için kullanılır.

Fakat Interceptor’lardaki durum farklıdır. Action sınıfları thread-safe olsa da Interceptor’ların instance’ları bir defa yaratılır ve aynı Servlet’ler gibi her istek için kullanılırlar. Bu yüzden Interceptor sınıfları içerisindeki kodların thread-safe yazılması gerekir.

Struts 2’de Sabit Tanımlama (Constant Configurations)

Struts 2 Framework kullanırken uygulama içinde kullandığımız bazı ayarlar sabit değerler ile ayarlanabilir.

Struts’ın konfigurasyon dosyasında tanımlanan constant etiketleri ile framework konfigurasyonları çok basit bir şekilde yapılabilir. Ayrıca Struts ile birlikte kullanılan eklentiler de yine bu sabit değerler sayesinde ayarlanabilir. İki ana rolleri vardır.

  1. Birincisi örneğin yüklenecek maximum dosya boyutu ile standart değer olan 2 MB dışında bir değer verilebilir. Veya geliştirme ortamında çalışan uygulama için daha çok log yazılması basit bir sabit değerle belirtilebilir. Ya da başka bir örnekle kendi oluşturduğumuz tema ismi, bulunduğu dizin ve tip bilgisini tanımlayabiliriz.
  2. İkincisi Bean implementasyonu tanımlanabilir.

Sabitler standartta aşağıdaki sırada uygulama içerisinde aranırlar. Bir sonraki dosyada aynı sabit tekrar tanımlanmışsa ezilmiş olur.

  1. struts-default.xml
  2. struts-plugin.xml
  3. struts.xml
  4. struts.properties
  5. web.xml

Bu dosyalardan ilk 2 tanesi framework içerisinde standart olarak gelir. Diğer dosyaları istersek güncelleyebiliriz.

struts.xml

[codesyntax lang=”xml” lines=”no”]

<struts>
	...
	<constant name="struts.devMode" value="true" />
	<constant name="struts.ui.theme" value="mytheme" />
	<constant name="struts.ui.templateDir" value="template" />
	<constant name="struts.ui.templateSuffix" value="ftl" />
  	...
</struts>

[/codesyntax]

struts.properties

[codesyntax lang="xml" lines="no"]

# Gelistirme modu acik
struts.devMode=true
# Kendi tema ismimiz
struts.ui.theme=mytheme
# Temamizin bulundugu dizi ismi
struts.ui.templateDir=template
# Tema tipi (ftl)
struts.ui.templateSuffix=ftl
[/codesyntax]

web.xml

[codesyntax lang=”xml” lines=”no”]

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="ttp://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">

    ...
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
        <init-param>
               <param-name>struts.devMode</param-name>
               <param-value>true</param-value>
        </init-param>
    </filter>
    ...
</web-app>

[/codesyntax]