La classe LookupDispatchAction (org.apache.struts.actions.LookupDispatchAction
), è una sottoclasse della DispatchAction
e come quest'ultima ci permette di specificare metodi multipli. Ciascun metodo poi sarà invocato utilizzando il meccanismo del parametro speciale da inserire nelle richieste, parametro che viene indicato nel file di configurazione.
Mentre la DispatchAction
usa il valore del parametro della request per determinare quale metodo deve essere invocato, la LookupDispatchAction
usa il valore del parametro della request per effettuare un reverse lookup dal resource bundle usando il valore del parametro e per farlo corrispondere a un metodo della classe.
In altre parole ci permette di pescare valori dal file delle risorse in modo dinamico.
Per utilizzare LookupDispatchAction
è necessario eseguire i seguenti step:
- Creare un action handler che erediti
LookupDispatchAction
- Creare un metodo che rappresenti ciascuna azione logica
- Implementare il metodo
getKeyMethodMap
per mappare le chiavi del file di risorsa ai nomi dei metodi - Creare un action mapping per questo action handler utilizzando l'attributo
parameter
per specificare quale parametro conterrà il nome del metodo che si vuole invocare nelle richieste - Impostare i messaggi nel resource boundle per le etichette e i valori per i pulsanti
- Utilizzare
bean:message
per mostrare le etichette sul pulsante
Il primo step è creare una classe action handler che erediti LookupDispatchAction
(codice completo):
// Handler che eredita LookupDispatchAction
public class UserLookupDispatchAction extends LookupDispatchAction {
// È necessario implementare questo metodo che mappi
// le chiavi del file di risorse ai nomi dei metodi
Map getKeyMethodMap() {
Map map = new HashMap();
map.put("userForm.remove", "remove");
map.put("userForm.save", "save");
return map;
}
//...
Questa classe implementa il metodo getKeyMethodMap()
che restituisce un oggetto di tipo java.util.Map
contenente una serie di coppie del tipo chiave/valore. Le chiavi di questo Map dovrebbero corrispondere a quelle del resource bundle, mentre il valore associato dovrebbe essere il nome del metodo della sottoclasse LookupDispatchAction
. Questo valore sarà invocato quando è incluso un parametro della request corrispondente al messaggio del resource bundle per la chiave.
Produciamo il bean che conterrà il valore di method, unica proprietà del form inviante:
import javax.servlet.http.*;
import org.apache.struts.action.*;
// Bean che contiene il valore di method
public class UserForm2 extends ActionForm {
private String method = null;
public String getMethod() { return method; }
public void setMethod(String method) { this.method = method; }
public void reset(ActionMapping mapping, HttpServletRequest request) {
this.method = method;
}
}
Creiamo un action mapping
(struts-config.xml
):
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<form-beans>
<form-bean name="userForm2" type="simone.UserForm2" />
</form-beans>
<action-mappings>
<action path="/lookupDispatchUserSubmit"
type="simone.UserLookupDispatchAction"
input="/userForm2.jsp"
name="userForm2"
parameter="method"
scope="request"
validate="true">
<forward name="success" path="/success.jsp" />
</action>
</action-mappings>
</struts-config>
Scriviamo le nostre viste. Prima il form:
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<!-- Form JSP -->
<html>
<body>
<html:form action="/lookupDispatchUserSubmit">
<html:submit property="method">
<bean:message key="userForm.remove" />
</html:submit>
<html:submit property="method">
<bean:message key="userForm.save" />
</html:submit>
<html:cancel></html:cancel>
</html:form>
</body>
</html>
poi la pagina con il risultato:
<%@ page language="java" %>
<!-- JSP con il risultato del form -->
<html>
<body>success!!</body>
</html>
infine il file di risorse, dove impostiamo le etichette e i valori per i pulsanti:
ApplicationResources_it_IT.properties userForm.save=Salva userForm.remove=Rimuovi ApplicationResources_en_US.properties userForm.save=Save userForm.remove=Remove
È importante modificare anche il file web.xml
a causa dei file di risorse:
<init-param>
<param-name>application</param-name>
<param-value>ApplicationResources</param-value>
</init-param>
Si tratta di un percorso piuttosto lungo semplicemente per determinare quale metodo invocare. L'intento di questa classe è di rendere tutto più facile quando si ha un modulo HTML con pulsanti di immissione multipli con lo stesso nome.