Il Blog degli smanetta!!!

Ottobre 31, 2008

Struts2 – Tips and Trick (per la migrazione da Struts1)

Archiviato in: Java, Programmazione, struts2, web application — resmanetta @ 3:37 pm
Tags:

Con questo post inizio una serie di articoli contenenti suggerimenti e soluzioni per la migrazione da struts1 a struts2. Sull’argomento si trovano numerosi documenti in rete ai quali non mi posso e non mi voglio sostituire. Parlerò soltanto di questioni pratiche in cui mi sono imbattuto e delle soluzioni intraprese per superarli. In alcuni casi quindi darò per scontato terminologie e sintassi che si possono trovare nella documentazione del framework: http://struts.apache.org/2.x/docs/home.html

Internazionalizzazione delle pagine

Iniziamo dalla configurazione. In struts1 si indica il nome del file generico language.properties di risorsa(indicando anche il package che lo contiente) con il tag :

<message-resources null=”false” parameter=”it.example.struts.language” />

Per ogni lingua (oltre a quella di default utilizzata dal file generico) che si vuole supportare sarà necessario aggiungere nel package, ad esempio per la lingua inglese, un file con nome language_en.properties.

In struts2, posso stabilire il nome del mio file di risorsa lingua, utilizzando la configurazione :

<constant name=”struts.custom.i18n.resources” value=”language”/>  nel file struts.xml  o
struts.custom.i18n.resources=ssolanguage nel file struts.properties

In entrambi i casi , il file di lingua è a tutti gli effetti un file di properties standard di coppie key/value. Ad esempio:

commons.user.firstName=Nome
commons.user.lastName=Cognome

Per visualizzare una pagina che risponda ad esempio alla lingua impostata dal browser del client, devo utilizzare all’interno delle jsp un tag specifico che data la key, vada a recuperare dal file di lingua il value che voglio visualizzare  (non è obbligatorio l’uso del tag, ma rende più semplice la lettura della jsp ai designer che dovranno abbellirla!)

<bean:message key=”commons.user.firstName”/>   per struts1
<s:text name=”commons.user.firstName” />    per struts2

Tutto questo nei casi più semplici. Supponiamo ora di avere una lista di profili di accesso al nostro sito che ho inserito in una variabile statica all’interno della classe User:

public class User {
public static final String[] PROFILES = {“USER”,”ADMIN”,”OTHER”};
….
}

Nel file di lingua metterò queste chiavi:

user.profile.USER=Utente standard
user.profile.ADMIN=Amministratore
user.profile.OTHER=Altro utente

In struts1, ad esempio in una select del profilo, potevo cavarmela in questo modo:

<select name=”profile”>
<% for(int cont=0; cont < User.PROFILES.length; cont++) {%>
<option value=”<%=User.PROFILES[cont] %>”>
<bean:message key=”<%=”user.profile.”+User.PROFILES[cont]%>”/>
<% } %>
</select>

In struts2 non ho la possibilità di usare scriptlet negli attributi dei tag. Decisione se volete discutibile (ma la condivido) , ma che va sempre nella direzione di rendere facilmente leggibile la jsp ad un designer. Posso comunque utilizzare espressioni adattandomi alla nuova sintassi di struts2 (http://struts.apache.org/2.x/docs/tag-syntax.html) ,sfruttando il meccanismo del Value Stack al quale posso accedere via OGNL.

<select name=”profile”>
<% for(int cont=0; cont < User.PROFILES.length; cont++) { pageContext.setAttribute(“type”,”user.profile.”+User.PROFILES[cont]);%>

<option value=”<%=User.PROFILES[cont] %>”>
<s:text name=”%{#attr.type}”/>
<% } %>
</select>

Usando l’operatore %{} sto chiedendo al tag di valutare un’espressione (già..proprio come facevo in struts1) e con # sto chiedendo di recuperare un oggetto dal Value Stack. In particolare voglio recuperare l’attributo di nome type (che in effetti ho messo nel PageContext con un setAttribute)

Blog su WordPress.com.