Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

LookupDispatchAction

Richiamare metodi multipli utilizzando parametri nelle request
Richiamare metodi multipli utilizzando parametri nelle request
Link copiato negli appunti

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:

  1. Creare un action handler che erediti LookupDispatchAction
  2. Creare un metodo che rappresenti ciascuna azione logica
  3. Implementare il metodo getKeyMethodMap per mappare le chiavi del file di risorsa ai nomi dei metodi
  4. 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
  5. Impostare i messaggi nel resource boundle per le etichette e i valori per i pulsanti
  6. 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.

Ti consigliamo anche