Tema: NET y MVC
Pregunta: clase ActionForm?
Respuesta:
Continuando con los mini tutos, este ejercicio consiste en realizar un ActionForm de prueba que implemente la dinámica de las clases anteriores.
DireccionForm.java
Esta clase extiende de ActionForm y la mayoría de sus metodos son get y set de sus atributos, para el caso de los tipos boléanos en lugar de get se usa el termino is, también contiene un método validate y un método reset los cuales se pueden sobre escribir para realizar validaciones a gusto del usuario.
Código PHP:
import org.apache.struts.action.ActionForm;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import com.lino.prueba.dto.*;
public class DireccionForm extends ActionForm{
private String postalCode=null;
private DireccionDTO direccion=new DireccionDTO();
public DireccionForm(){}
public void setPostalCode(String postalCode){
this.postalCode=postalCode;
}
public String getPostalCode(){
return this.postalCode;
}
public DireccionDTO getDireccion(){
return this.direccion;
}
public void setDireccion(DireccionDTO direccion){
this.direccion=direccion;
}
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if ((postalCode == null) || (postalCode.length() < 1))
errors.add("postalcode1", new ActionError("error.postalcode.required"));
return errors;
}
public void reset(ActionMapping actionMapping, HttpServletRequest Request) {
postalCode = "";
}
}
Este form tiene dos variables, un tipo String llamado postalCode y un tipo compuesto llamado direccion, algo que es importante definir en las reglas de java es que los nombres de variables siempre deben comenzar con minúscula en el caso de que estas variables contengan un método get y set, esto dado que el compilador no hallará estos métodos si las variables comienzan con mayúscula.
Una clase form debe tener para cada atributo (variable) que se presentara en un <html:form> un método get y set, la clase form puede tener atributos que no se presenten en un <html:form> e incluso métodos que no sean get y set, tal como una clase tradicional. Un error frecuente al momento de cargar una clase form en un <html:form> es que no encuentre los metodos get y set de los atributos. Esto por que los métodos get y set no corresponden a las variables (atributos que se declaran). Por ejemplo si tenemos lo siguiente
Código PHP:
String nombre=null;
public void setNombres(String nombre){
this.nombre=nombre;
}
Este fragmento de código es erróneo por que a pesar de que este método set use la variable “nombre” el método se llama “setNombres” cuando debería llamarse “setNombre” otro caso común de error como ya se menciono es este.
Código PHP:
String Nombre=null;
public void setNombre(String nombre){
this.nombre=nombre;
}
En este caso la variable y el método parecen llamarse igual pero no es así, por regla si quieres tener un método set y get para un atributo debe comenzar con minúscula por eso cuando el compilador encuentra que estamos usando el atributo Nombre en el <html:form> marca que no existe método set o get, en todo caso lo mas correcto seria llamar el método así.
Código PHP:
String nombre=null;
public void setNombre(String nombre){
this.nombre=nombre;
}
Una vez que se ha entendido esto es mucho más fácil evitar errores de este tipo. La clase Form puede o no tener los métodos validate y reset, estos métodos son sobre escríbibles y en ellos se puede establecer condiciones para que los datos lleguen de forma optima al ActionServlet, si el lector observa en este ejemplo de clase Form el método validate solamente comprueba de que el código postal no sea nulo o menor de 1 y el método reset establece a nulo la variable postalCode.
Los ActionErrors y ActionMessages son instrucciones que a final de cuentas se toman como mensajes que pueden ser visualizados en las paginas JSP esto mas adelante se verá un poco mas a profundidad, estos mensajes puede ser manipulados por el usuario o descritos en un archivo ApplicationResources.properties, este archivo no solo se ocupa para esto, pero eso también se verá mas adelante.
Esta clase se debe crear dentro del paquete com.lino.prueba.form