PrettyFaces: una soluzione per l’URL rewriting per Servlet, JSF e Java EE

PrettyFaces: una soluzione per l’URL rewriting per Servlet, JSF e Java EE

In questo articolo vedremo una libreria java che ci consente di poter effettuare l'URL rewriting (letteralmente la riscrittura delle URL) per le nostre web application scritte utilizzando Servlet, JSF o altra tecnologia Java EE. L'URL rewriting è una tecnica che permette ad un server web di riscrivere quelle che sono indirizzi di pagina dinamici, cioè di pagine generate tramite tecnologie quali appunto JSF o Struts, in URL che sono statiche, dimodochè una pagina abbia un indirizzo web che sia più facilmente comprensibile e mnemonico sia per un utente umano ma anche e soprattutto per un motore di ricerca.

Creare interfacce grafiche Java con Google WindowBuilder Pro
Pentaho Mondrian: un motore OLAP per Java
Apache PDFBox: una libreria Java per lavorare con i documenti PDF

Nella pagina index definiamo tre differenti link, utilizzando tre differenti tecniche, le quali ci condurranno  ad una particolare categoria (scarpe, cappelli, maglioni), ma l’URL di base si presenta sempre nella medesima forma:

http://localhost:8080/TestPrettyFaces/negozio/[categoria]

URL che è decisamente più leggibile e compresibile rispetto a quella che avremmo non usando prettyfaces:

http://localhost:8080/TestPrettyFaces/faces/category.xhtml?categoria=[categoria]

dove il nome della categoria viene passato come parametro tramite URL.

Il tag h:link (e quello simile h:button) è stato definito a partire dalla specifica 2.0 delle JSF e consente una gestione delle richieste di tipo GET, cioè permette di passare esplicitamente dei parametri sulla URL. Viene inoltre introdotto l’attributo outcome che specifica la destinazione del link (che quindi non deve essere specificata nel file faces-config.xml), in questo caso utilizzando la chiave pretty nel valore dell’attrivbuto è possibile redirigere la richiesta verso un id dichiarato nell’url-mapping del file pretty-config.xml.

Il tag pretty:link è invece disponibile grazie alla libreria PrettyFaces ed ha un comportamento simile al tag h:link, infatti, tramite l’attributo mappingId, permette di redirigere le richieste verso un id dichiarato nell’url-mapping del file pretty-config.xml.

Vediamo ora come è composta la seconda pagina:

category.xhtml

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Pagina categoria</title>
</head>
<body>
<h:form id="form">
<h:panelGrid columns="2">
<h:outputText value="Salve, benvenuto nella categoria: "/>
<h:outputText value="#{BeanCateg.categoria}"/>
<f:metadata>
<f:viewParam name="categoria" value="#{cat}"></f:viewParam>
</f:metadata>
Questa è la categoria: #{cat}
</h:panelGrid>
</h:form>
</body>
</html>

in questa pagina semplicemente recuperiamo il valore della categoria dal bean BeanCateg che viene valorizzato quando si effettua la richiesta; ciò è possibile perchè PrettyFaces si occupa di valorizzare automaticamente (quella che viene definita EL value injection) il valore di un managed bean tramite parametri passati attraverso le URL.

Grazie a dei nuovi tag presenti nella versione 2.0 delle jsf (f:metadata e f:viewParam) possiamo recuperare i parametri GET passati con le URL in un modo alternativo. Il tag f:viewParam permette di associare ad una variabile definita con l’attributo value il valore passato nel parametro il cui nome è definito nell’attributo name.

Notiamo inoltre che prima che la seconda pagina venga caricata viene invocato il metodo carica() del bean BeanCateg poichè lo abbiamo definito nell’attributo action del tag url-mapping del file pretty-config.xml.

Riportiamo infine la definizione dei due bean utilizzati nel nostro esempio:

BeanCategoria .java

package it.appuntisoftware;

public class BeanCategoria {
private String categoria;

public String getCategoria() {
return categoria;
}
public void setCategoria(String categoria) {
this.categoria = categoria;
}
public void carica(){
setCategoria(categoria.toUpperCase());
System.out.println(&quot;Carico i Bean.&quot;);
}
}

BeanListaCategorie .java

package it.appuntisoftware;

public class BeanListaCategorie {
private String categoria1;
private String categoria2;
private String categoria3;
public BeanListaCategorie(){
categoria1=&quot;scarpe&quot;;
categoria2=&quot;cappelli&quot;;
categoria3=&quot;maglioni&quot;;
}
public String getCategoria1() {
return categoria1;
}
public void setCategoria1(String categoria1) {
this.categoria1 = categoria1;
}
public String getCategoria2() {
return categoria2;
}
public void setCategoria2(String categoria2) {
this.categoria2 = categoria2;
}
public String getCategoria3() {
return categoria3;
}
public void setCategoria3(String categoria3) {
this.categoria3 = categoria3;
}
}

Ed il file faces-config.xml:


<?xml version="1.0" encoding="UTF-8"?>
<faces-config
 xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
 version="2.0">
 <managed-bean>
 <managed-bean-name>BeanCateg</managed-bean-name>
 <managed-bean-class>it.appuntisoftware.BeanCategoria</managed-bean-class>
 <managed-bean-scope>request</managed-bean-scope>
 </managed-bean>
 <managed-bean>
 <managed-bean-name>BeanListaCateg</managed-bean-name>
 <managed-bean-class>it.appuntisoftware.BeanListaCategorie</managed-bean-class>
 <managed-bean-scope>request</managed-bean-scope>
 </managed-bean>
</faces-config>

In allegato trovate il file .war del progetto sviluppato:

TestPrettyFaces.war

PAGES

1 2

COMMENTS

WORDPRESS: 0