Supponiamo di avere una risorsa Web legacy che si vuole utilizzare con la validazione form di Struts, purtroppo, la risorsa legacy fa parte di un modello MVC elaborato che è stato creato prima dell'implementazione di Struts.
Per ragioni di semplicità la nostra risorsa legacy sarà una servlet. Essenzialmente si vuole fare in modo che il metodo doGet
di una servlet venga chiamato solo se l'ActionForm valida i dati con successo. Ecco la nostra servlet d'esempio:
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.*;
import java.io.*;
public class LegacyServlet extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ActionMapping mapping = (ActionMapping) request.getAttribute(Globals.MAPPING_KEY);
UserForm form = (UserForm)request.getAttribute(mapping.getName());
response.getWriter().println("User name: " + form.getUsername() + " Password: " + form.getPassword());
}
}
e questo è lo UserForm.java
, che passa UserName
e password
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import javax.servlet.http.HttpServletRequest;
public class UserForm extends ActionForm {
private String username = null;
private String password = null;
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public void reset(ActionMapping mapping, HttpServletRequest request) {
this.username = null;
this.password = null;
}
}
Notiamo che la servlet può accedere al contesto che il Framework di Struts ha mappato su request (Codice completo del web.xml).
<!-- ... -->
<servlet>
<servlet-name>legacy</servlet-name>
<servlet-class>simone.LegacyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>legacy</servlet-name>
<url-pattern>/legacy/roar</url-pattern>
</servlet-mapping>
<!-- ... -->
Quindi, un post su /legacy/roar
causerebbe l'esecuzione del metodo doGet
della servlet.
Ora, per mappare questa servlet su un'azione che agisce come form handler, è necessario mettere mano a 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="userForm" type="simone.UserForm" />
</form-beans>
<action-mappings>
<action path="/legacy" forward="/legacy/roar"
input="/userForm.jsp" name="userForm"
parameter="/legacy/roar" validate="true"
scope="request">
</action>
</action-mappings>
</struts-config>
E infine ecco la JSP:
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html>
<body>
<html: form action="/legacy">
username: <html:text property="username"/><br/>
password: <html:password property="password"/><br/>
<html:submit/><html:cancel />
</html:form>
</body>
</html>
Il RequestDispatcher
effettua la chiamata al metodo doGet()
della Servlet solo se il metodo execute()
della ForwardAction viene chiamato.
Avendo impostato il metodo validate
su true nell'action mapping per la servlet, il metodo execute()
di ForwardAction
viene chiamato solo se ActionForm (UserForm) validates
restituisce nessun oggetto ActionError
.