Richfaces etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Richfaces etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Salı, Ekim 27, 2009

rich:modalPanel ve rich:fileUpload

rich:fileUpload richfaces kütüphanesinde bulunan çok kullanışlı bir component. Fakat sayfa içinde biraz yer kapladığı için bazen modalpanel açıp onun içinde kullanmak gerekebilir.
rich:modalPanel içinde rich:fileUpload kullanmak için rich:modalPanel in form içinde olmaması gerekiyor. aynı zamanda modalpanel'in içinde fileupload'u içeren bir form olması gerekiyor. yoksa fileupload componenti çalışmaz. örnek kullanımı şöyle olabilir;
<h:form id="outform">
...
<a4j:commandButton value="Upload Excel File" id="fileuploadbutton">
<rich:componentControl for="fileuploadpanel" attachTo="fileuploadbutton" operation="show" event="onclick" />
</a4j:commandButton>
...
</h:form>
<rich:modalPanel id="fileuploadpanel" zindex="2000" autosized="true">
<f:facet name="header">
<h:outputText value="File Upload Panel"></h:outputText>
</f:facet>
<h:form id="fileuploadform">
<rich:fileUpload fileUploadListener="#{testBean.fileUploadListener}" acceptedTypes="csv" ontyperejected="alert('you can upload csv files');">
</rich:fileUpload>
...
</h:form>
</rich:modalPanel>

Çarşamba, Ağustos 05, 2009

jsf richfaces performance tuning

Jsf ve richfaces ile uygulama geliştirdiyseniz yavaşlık ile ilgili şikayetiniz olabilir. Bu teknolojiler dikkatli kullanılmadığında yavaşlık yaşayabilirsiniz. Aşağıda performans için yapılması gereken bir kaç şey eklenmiş.

Richfaces Filter
<filter>
<display-name>RichFacesFilter</display-name>
<filter-name>richfaces</filter-name>
<filter-class>org.ajax4jsf.Filter</filter-class>
<init-param>
<param-name>forceparser</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>enable-cache</param-name>
<param-value>true</param-value>
</init-param>
</filter>

enable-cache parametresi ile richfaces komponentlerini client tarafında cachelenmesini sağlar. bu sayede gözle görülür bir performans sağlanabilir. forceparser parametres ile de richfaces a sadece ajax geri dönüşleri düzenlemesini söylüyoruz. eğer bu parametreyi bu şekilde set etmezsek html dahil bütün geri dönüşleri düzenlemeye kalkar.

<context-param>
<param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
<param-value>true</param-value>
</context-param>

compress_script parametresi ile konteynır'a bütün richfaces kaynaklarını sıkıştırmasını söylüyoruz.

<!-- load all richfaces javascript onetime -->
<context-param>
<param-name>org.richfaces.LoadScriptStrategy</param-name>
<param-value>ALL</param-value>
</context-param>
<context-param>
<param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
<param-value>true</param-value>
</context-param>
<!-- load all richfaces css onetime -->
<context-param>
<param-name>org.richfaces.LoadStyleStrategy</param-name>
<param-value>ALL</param-value>
</context-param>


org.richfaces.LoadScriptStrategy parametresini ALL yapmakla bütün scriptleri ilk başta yüklemesini sağayabiliriz. böylelikle daha ilkin yavaşa yüklense de sonrasında uygulama hızlı bir şekilde çalışarak network trafğini azaltacaktır. aynı şekilde org.richfaces.LoadStyleStrategy parametresini ALL yaparak css lerinde ilk başta yüklemesini sağlayabiliriz.


Bunların dışında ajax kullanırken aşağıdaki durumlara dikkat etmekte fayda var;

-> herhangi bir partial rendering yaparken mutlaka ajaxSingle=true yu kullanmaya özen göstermek,

-> validasyonun gerekli olmadığı rendering durumlarında immediate=true yaparak hızlı bir şekilde cevap dönmesini sağlamak.

-> ajax response sonucunda sadece reRender="" litesini set edeceksek limitToList=true seçeneğini set ederek sadece ilgili alanların set edilmesini sağlamak.

-> ajax regionları kullanarak sadece ilgili region ın update edilmesini sağlamak. ajax region kullanırken renderRegionOnly yi true yaparsak sadece ilgili region update edilir.

-> jsf tagları ile halledilebilen bir işi richfaces tagı ile kullanmamak. örenğin h:datatable ile halledilebilecek bir iş için rich:datatable kullanmamak gerekiyor.

-> business logic kısmını getter lara koymamak.

Perşembe, Şubat 12, 2009

Ajax a4j:region

A4j:region ile sayfanızın hangi parçalarının ajax işlemi sırasında servera gideceğini belirlersiniz. Yani bir ajax request sırasında gerekli gereksiz sayfa nın tamamının servera gidip gelmesini ve bu şekilde trafik oluşmasını önlemiş oluruz. zaten ajax işlemlerinin hızlı gerçekleşmesi gerekiyor. eğer a4j:region gibi componentleri kullanıp sayfanın sadece ilgili kısmını göndermezsek sayfalar çok yavaş yüklenir ve networkte trafik oluşturur. Eğer region(servera gönderilecek alan) belirlenmezse f:view taglari arasındaki alanlar default region kabul edilir.
<f:view>
....
<a4j:region>
jsf komponentleri
</a4j:region>
....
</f:view>

Ajax a4j:outputPanel

a4j:outputPanel kendi içindeki componentlerin ajax responsunda render edilmesini sağlar. ayrıca outputpanel kendi içindeki componentlerin ajax işlemi sonunda rerender etme işleminde de kullanılır. ajaxRendered="true" kullandığınızda ajaxın rerender metoduna herhangi bir şey yazmanıza bile gerek kalmaz. şöyle ki;
<a4j:outputPanel 
ajaxRendered="true">
<h:panelGrid id="toppanelgrid" columns="2" width="750"
columnClasses="colStyle1,colStyle2">
<h:column>
<h:outputText value="Select One:"></h:outputText>
</h:column>
<h:column>
<h:selectOneMenu value="#{bean.selecteditem}"
required="true">
<f:selectItem itemLabel="Please Select" itemValue="" />
<f:selectItem itemLabel="item1" itemValue="item1" />
<f:selectItem itemLabel="item2" itemValue="item2" />
<a4j:support event="onchange" ajaxSingle="true"
actionListener="#{bean.itemrenderer}"></a4j:support>
</h:selectOneMenu>
</h:column>

<h:column rendered="#{bean.item1renderer}">
<h:outputText value="item1"></h:outputText>
</h:column>
<h:column rendered="#{bean.item1renderer}">
<h:inputText value="#{bean.item1text}"></h:inputText>
</h:column>

<h:column rendered="#{bean.item2renderer}">
<h:outputText value="item2"></h:outputText>
</h:column>
<h:column rendered="#{bean.item2renderer}">
<h:inputText value="#{bean.item2text}"></h:inputText>
</h:column>
</h:panelGrid>
</a4j:outputPanel>

Fakat önemli bir noktayı gözardı etmemek lazım. formunuzda ajaxRendered="true" olan birden fazla outputpanel iniz varsa bunların çalışması birbirini etkileyebilir. bu durumlarda rerender metodunu kullanmak gerekecektir.

Cuma, Kasım 14, 2008

JSF rich:combobox problemi

sayfanızda daha güzel diye rich:combobox kullanmaya kalkışırsanız benim gibi neye uğradığınızı şaşırırsınız. çünkü rich:combobox value ve label değerini ayrı ayrı veremiyorsun. daha doğrusu label yok. sadece value değerini label olarak gösteriyor.
söz gelimi siz;

<rich:comboBox><f:selectItem itemValue="1" itemLabel="label1" />
<f:selectItem itemValue="2" itemLabel="label2" />
<f:selectItem itemValue="3" itemLabel="label3" />
<f:selectItem itemValue="4" itemLabel="llabel4" />
<f:selectItem itemValue="5" itemLabel="llabel5" />
</rich:comboBox>

yazdığınızda üretilen combobox ta label1 .. label5 görmeyi umuyorken 1,2..5 görürsünüz.

Bunu bir bug olarak yazmışlar jboss a ama bug değil kendi özelliği böyle. keşke bug olsaydıda düzeltilseydi. çünkü güzel özellikleri olan bir component.

ne diyelim clasik h:selectOneMenu ya devam :)