Un oggetto ActionMapping descrive un'istanza di un'azione alla ActionServlet, rappresenta le informazioni che in modo univoco definiscono un'istanza di una classe azione. I valori definiti da un oggetto ActionMapping sono ciò che rendono univoca un azione particolare.
L'oggetto ActionMapping fornisce: informazioni utili al metodo Action.execute()
e all'oggetto Action la possibilità di modificare il suo comportamento in base ai valori descritti in una particolare istanza ActionMappig.
ActionMapping personalizzata
La default ActionMapping definisce un numero di attributi e la combinazione di ciascuno di essi viene utilizzata per descrivere univocamente un'istanza di una Azione; solitamente questi attributi sono sufficienti, comunque ci sono delle situazioni in cui è necessario descrivere ulteriormente un'azione. Il Framework di Struts fornisce una soluzione a questo problema definendo proprietà specifiche ai bisogni della nostra applicazione.
È possibile definire queste proprietà supplementari semplicemente estendendo la classe ActionMapping e aggiungendo un numero n di sottoelementi <action> e di elementi <set-property> per ciascuna proprietà addizionale.
Creare un estensione di ActionMapping
Creiamo la nostra estensione di ActionMapping che utilizziamo per descrivere le azioni dell'applicazione. L'estensione di ActionMapping che creiamo permette di abilitare o disabilitare l'attività di logging utilizzando un singolo elemento <set-property>.
Per creare un estensione ActionMapping è necessario seguire i seguenti step:
- Creare una classe che estende
org.apache.struts.action.ActionMapping
; - Definire proprietà addizionali che saranno utilizzate per descrivere gli oggetti Action;
- Chiamare il metodo
super()
, che chiama il costruttore di default di ActionMapping; - Definire i metodi set e get per modificare e recuperare i valori della proprietà definita.
Listato 1. Creazione di un estensione ActionMapping
import org.apache.struts.action.ActionMapping;
// Step 1. Estensione dell' ActionMapping
public class ProvaActionMapping
extends ActionMapping {
// Step 2. Aggiunta delle nuove property
protected boolean logResults = false;
public ProvaActionMapping() {
// Step 3. Chiamata del costruttore dell'ActionMapping
super();
}
// Step 4. Aggiunta dei metodi setter/getter
public void setLogResults(boolean logResults) {
this.logResults = logResults;
}
public boolean getLogResults() {
return logResults;
}
}
Utilizzo dell'estensione ProvaActionMapping
Ecco l'azione che nasce per utilizzare l'estensione appena definita:
Listato 2. Azione per utilizzare l'estensione (Guarda il codice completo)
..//
ProvaActionMapping provaMapping = (ProvaActionMapping) mapping;
Double price = null;
String symbol = null;
String target = new String("success");
if (form!=null) {
LookupForm2 lookupForm = (LookupForm2) form;
symbol = lookupForm.getSymbol();
price = new Double(1234.56);
}
if (price==null) {
target = new String("failure");
} else {
if (provaMapping.getLogResults()) {
System.err.println("SYMBOL: " + symbol + " PRICE: " + price);
}
request.setAttribute("PRICE", price);
}
return mapping.findForward(target);
..//
L'azione precedente si base su questo ActionForm:
Listato 3. ActionForm per l'azione precedente
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import javax.servlet.http.HttpServletRequest;
public class LookupForm2 extends ActionForm {
private String symbol = null;
public String getSymbol() {
return symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
this.symbol = null;
}
}
Deploy dell'estensione ProvaActionMapping
Vediamo le modifiche che figurano nel file struts-config.xml:
Listato 4. Modifiche da apportare al file struts-config.xml
<form-bean type="fulvios.LookupForm2" name="lookupForm2" />
<action
className="fulvios.FulviosActionMapping"
path="/FulviosLookup"
type="fulvios.LookupAction2"
name="lookupForm2"
input="/index.jsp">
<set-property property="logResults" value="true" />
<forward name="success" path="/quote2.jsp" />
<forward name="failure" path="/index2.jsp" />
</action>
Questa è la index2.jsp:
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html>
<body>
<html:form action="FulviosLookup">
Symbol:<html:text property="symbol" />
<html:submit/>
</html:form>
</body>
</html>
e la solita quote2.jsp:
<%= request.getAttribute("PRICE") %>