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

Forward per accesso Legacy

Collegare applicazioni risorse o parti di applicazioni legacy all'applicazione Struts
Collegare applicazioni risorse o parti di applicazioni legacy all'applicazione Struts
Link copiato negli appunti

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.


Ti consigliamo anche