Upload
okanozeren
View
1.947
Download
0
Embed Size (px)
DESCRIPTION
Struts 2 is a framework based java.
Citation preview
Struts 2 İle Tanışma
Çeviri:30 Haziran 2008Okan Özeren [email protected]
Kaynak:24 Şubat 2007Thomas Wiradikusuma [email protected] User Group Indonesia
Struts 2
Kurumlar için Java Web uygulamaları geliştirmeye hazır, üstün ve uzatılabilir bir çatıdır (framework).
MVC (Model-View-Controller) bir çatıdır.
Action tabanlıdır. Bilinen, ünlü Struts çatısının varisidir
(ve teknik açıdan WebWork 2'nin de).
Artıları Basit mimari ObjectFactory ile uyumlu Interceptor'lar, Action'lar,
Result'lar Controller veya Sayfa tabanlı gezinim POJO (Plain Old Java Object), Annotation ve JSF desteği OGNL (Object-Graph Navigation Language) destekli
düzenlenebilir tag kütüphanesi Value stack (değer yığıtı) Öntanımlı IoC (Inversion of Control) konteynırı olarak Spring
kullanımı Hızlı başlangıç Dahili Ajax desteği Konfigürasyonu kolaylaştırıcı bir çok mantıklı öntanımlı kural Kolay test edilebilir (konteynır dışında) Struts 1 ve WebWork 2'nin en iyi özelliklerini barındırması.
Mimari Request (İstek) gelir FilterDispatcher uygun
action'u bulur Interceptor'lar
(denetleyiciler) uygulanır Action içindeki metod
çalıştırılır (genellikle temel işlevleri yerine getiren)
Sonuç çıktı olarak sunulur
Mimari devam
ActionMapper HTTP ve action çağırım istekleri arasında iki taraflı
eşleme sağlar Öntanımlı implementasyon standart *.[ext] (genellikle
action) kalıbını kullanır. Uzantı, "struts.action.extension" Struts konfigürasyon anahtarı ile tanımlanır.
Önekler: method: <a:submit name="method:bar" value="Bar" /> action: <a:submit name="action:foo" value="Foo" /> redirect: <a:submit name="redirect:http://www.google.com"
value="Google" /> redirect-action: <a:submit name="redirect-action :foo"
value="Foo" />
Interceptor'lar
<interceptor-stack name="yığıt"> <interceptor-ref name="ilkÇalışacakInterceptor"/> <interceptor-ref name="ikinciÇalışacakInterceptor"/> <interceptor-ref name="üçüncüÇalışacakInterceptor"/> <interceptor-ref name="sonÇalışacakInterceptor"/></interceptor-stack>
ilkÇalışacakInterceptor ikinciÇalışacakInterceptor üçüncüÇalışacakInterceptor sonÇalışacakInterceptor Action1 Action2 (zincir) ÖnSonuçDinleyicim Result (sonuç) sonÇalışacakInterceptor üçüncüÇalışacakInterceptor ikinciÇalışacakInterceptorilkÇalışacakInterceptor
Interceptor'lar devamInterceptor Adı Açıklama
Checkbox checkbox Seçili olmayan checkbox'ları kontrol eden otomatik checkbox işleme kodunu ekler ve parametrelerine öntanımlı değer (genellikle 'false') atar. Özel adlandırılmış gizli bir alan ile submit edilmeyecek checkboxları belirler.
Execute and Wait execAndWait Action'ı arka planda işletir ve kullanıcıyı bir ara bekleme sayfasına yönlendirir.
Parameters params Action üzerinde istek parametrelerini setler.
Prepare prepare Eğer Action Preparable olarak implemente edilmişse o Action'a ait prepare methodunu çağırır.
Roles roles Action sadece doğru JAAS (Java Authentication and Authorization Service) rolüne sahip kullanıcı tarafından işletilebilir.
Token token Action'da gönderilen parametrelerin geçerliliğini kontrol eder ve aynı formun birden fazla kere submit edilmesini engeller.
Ve daha fazlası…
Action'lar Bütün action'lar, execute() metodunu veya
bu gibi metodları barındırmalıdır. Bununla birlikte XWork 1.1'deki gibi, bu çok gerekli değildir ve sadece kullanıcılara yardımcı olması amacıyla bulunabilir. Farklı bir interface'i gerçekleştirmeden bu interface'i kullanarak POJO'ları yaratmakta tamamen serbestsinizdir.
ActionSupport sınıfı bir çok ortak action için öntanımlı gerçekleştirim sunar.
Result'larResult Kullanımı
Dispatcher JSP entegrasyonu ile web kaynak bütünleştirmesi için kullanılır.
Redirect Başka bir URL'e (web kaynağı) yönlendirim için kullanılır.
Redirect Action Başka bir action'a haritasına yönlendirim için kullanılır.
Stream Browser arkasında bir InputStream ile akış için kullanılır (genellikle dosya indirileceğinde).
Chain Action zincirleme (chaining) için kullanılır.
Velocity Velocity entegrasyonunda kullanılır. Velocity Java için bir şablon dilidir.
Ve daha fazlası…
Tür dönüşümü HTTP'de her şey String'dir Dahili: boolean, char, numeric, types, dates, arrays,
collections ClassAdı-çevrim.properties:
foo = package.FooÇevirici Genel olarak struts-çevrim.properties class yolunun kök
dizininde bulunur (genellikle WEB-INF/classes): package.Foo = package.FooÇevirici
Temel bir tür dönüştürücü'yü StrutsTypeConverter'dan uzatabilirsiniz (extending)
TypeConversionException istisnası (exception) çevrim istisnası oluştuğunda fırlatılır. Bu istisnada gösterilecek bilgi ise Struts'ın struts.default.invalid.fieldvalue konfigürasyon anahtarında tutulur
Yerelleştirme Kaynak paketlerine aşağıdaki sıra ile bakılır:
ActionClass.properties BaseClass.properties (Object.properties'e başından sonuna kadar) Interface.properties (her interface ve alt-interface) ModelDriven modeli (eğer ModelDriven tanımlanmışsa), model
nesnesini 1'den itibaren tekrarlamak için package.properties (class nerde bulunuyorsa ve kök dizine kadar her
üst dizinde) Kendi I18n mesaj anahtarı hiyerarşisine göre arar Genel kaynak (global resource properties) anahtarları
Erişim yolları: getText: <s:property value="getText('herhangibir.anahtar')" /> text tag’ı: <s:text name="herhangibir.anahtar" /> Değer yığıtında herhangi bir kaynak paketine erişmek için I18n tag’ı:
<s:i18n name=" herhangibir.paket" > <s:text name=" herhangibir.anahtar" />
</s:i18n>
Konfigürasyon dosyalarıDosya Opsiyonel? Konum Amaç
web.xml No /WEB-INF/ DD - Deployment Descriptor (bir web uygulamasının nasıl açılacağını anlatır)
struts.xml Yes /WEB-INF/classes/ Ana konfigürasyondur ve result/view tiplerini, action haritalarını, interceptor’ları ve bunlar gibi diğerlerini barındırır
struts.properties Yes /WEB-INF/classes/ Framework (çatı) özellikleri
struts-default.xml Yes /WEB-INF/lib/struts2-core.jar
Struts tarafından öntanımlı konfigürasyon sağlar
struts-default.vm Yes /WEB-INF/classes/ velocity.properties tarafından öntanımlı makroları refere eder
struts-plugin.xml Yes Root of a plug-in JAR plug-in’ler için struts.xml ile aynı formatta opsiyonel konfigürasyon dosyasıdır
velocity.properties Yes /WEB-INF/classes/ Öntanımlı Velocity konfigürasyonunu ezer (override)
TaglibTaglib’siz (JSP):
<% User user = ActionContext.getContext() %><form action="Profile_update.action" method="post"> <table> <tr> <td> align="right"><label>First name:</label></td> <td><input type="text" name="user.firstname" value="<%=user.getFirstname() %> /></td> </tr> <tr> <td> <input type="radio" name="user.gender" value="0" id="user.gender0" <% if (user.getGender()==0) { %> checked="checked" %> } %> /> <label for="user.gender0">Female</label>...
<s:actionerror/><s:form action="Profile_update" validate="true"> <s:textfield label="Username" name="username"/> <s:password label="Password" name="password"/> <s:password label="(Repeat) Password" name="password2"/> <s:textfield label="Full Name" name="fullName"/> <s:textfield label="From Address" name="fromAddress"/> <s:textfield label="Reply To Address" name="replyToAddress"/> <s:submit value="Save" name="Save"/> <s:submit action="Register_cancel" value="Cancel" name="Cancel" onclick="form.onsubmit=null"/></s:form>
Taglib’li (JSP):
Taglib devam
<%@ taglib uri="/struts-tags" prefix="s" %>
Tag kategorileri: Kontrol Veri UI (forma özgü olanlar ve diğerleri) Ajax
Servlet/JSP kapsamındaki nesneler
Application<s:property value="%{#application.foo}" />
Session<s:property value="%{#session.foo}" />
Request<s:property value="%{#request.foo}" />
Parameter<s:property value="%{#parameter.foo}" />
Context<s:property value="%{#foo}" />
OGNL
Object Graph Navigation Language JSTL - EL’den (Jsp Standard Tag
Library - Expression Language) daha güçlüdür
Spring entegrasyonu
Varsayılan, framework’un nesneleri yaratırken Spring kullanmayı en azından denemesidir
Eğer nesne Spring tarafından yaratılmamışsa, o zaman framework nesneleri kendisi yaratacaktır
Test
Doğrudan Action çağrımı Konteynır dışı test Interceptor ve/veya Result’ların testi
Struts 1 ve Struts 2Struts 1 Struts 2
struts-config.xml struts.xml
ActionServlet FilterDispatcher
Action (singleton) Action veya POJO
ActionForm Action veya POJO
RequestProcessor Interceptors
ActionForward Result
validation.xml {action}-validation.xml
Aynı ada sahip olmasına rağmen (Struts), Struts 1’den WebWork 2’ye geçiş oldukça zordur.
WebWork 2 ve Struts 2Yalnız isimlendirme ve namespace dışında hemen hemen aynıdır.
WebWork 2 Struts 2
xwork.xml struts.xml
com.opensymphony.webwork.* org.apache.struts2.*
com.opensymphony.xwork.* com.opensymphony.xwork2.*
webwork.properties struts.properties
<ww:*/> <s:*/>
“webwork” “struts”
Gereksinimler
Servlet API 2.4 JSP API 2.0 Java 5 ve üstü (veya Retroweaver ile
1.4)
Açık kaynak kütüphanelerle entegrasyon
Spring 2.0 Velocity Freemarker JasperReports DWR (Direct Web Remoting) Apache Pluto dojo ve daha birçoğu...
Bahsedilmeyenler Annotation desteği JSF, Ajax desteği plug-in’ler Hızlı başlangıç (QuickStart) Validation (onaylama) Değer yığıtı (Value stack) Wildcard haritalama (mappings) Sıfı configürasyon (Zero configuration)
Adresler
Struts 2http://struts.apache.org/2.x/
WebWorkhttp://www.opensymphony.com/webwork/
Teşekkürlerve örnek uygulama