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
- Creare un action mapping per questo action handler utilizzando l'attributo
parameter
- Impostare i messaggi nel resource boundle per le etichette e i valori per i pulsanti
- Utilizzare
bean:message
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()
java.util.Map
LookupDispatchAction
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.