03 action forms

19
mayo de 2005 Manejo de parámetros Request con Beans de Formulario

Upload: roberto-moreno-donoro

Post on 11-Jul-2015

590 views

Category:

Education


0 download

TRANSCRIPT

Page 1: 03 action forms

mayo de 2005

Manejo de parámetros Request con Beans de Formulario

Page 2: 03 action forms

Formularios HTML

Parte fundamental de aplicación web Dos retos para el desarrollador:

Recoger datos al recibir formulario Rellenar el formulario con datos incompletos para

corrección Struts facilita la tarea del programador

ActionForms Autorellenado de formulario desde ActionForm:

<html:input property="address"/>

Chequeo automática del tipo de dato del campo del formulario HTML en la recepción

Validación automática de campos del formulario

Page 3: 03 action forms

Características de ActionForm

Un ActionForm debe: Derivarse de org.apache.struts.ActionForm Seguir esquema de JavaBean (accesor, mutator) Declarar una propiedad por cada control HTML con

el que se va a relacionar, con el mismo nombre

Un ActionForm puede: Implementar método validate() para validación

propiedades Implementar método reset() para inicializar las

variables antes de rellenarlas

Page 4: 03 action forms

Ejemplo ActionForm Creamos un ActionForm partiendo del proyecto struts-blank. Creamos directorio app dentro de src/java y creamos

MiFormulario.java:

package java.app;

import org.apache.struts.action.*;

public class MiFormulario extends ActionForm { protected String nombre; protected String direccion; public String getNombre() {return this.nombre;} public void setNombre(String nombre) { this.nombre = nombre; } public String getDireccion() {return this.direccion;} public void setDireccion(String direccion) { this.direccion = direccion; }}

Page 5: 03 action forms

¿Qué Funciones cumple un ActionForm? (I)

Colector de información Abstrae de las peculiaridades de HTTP

Convierte texto de campos HTML a datos nativos Java Independiza del método utilizado (GET / POST) Gestiona tipos de codificación diferentes (puede recibir

ficheros) Todo campo HTML se transforma transparentemente al

desarrollador a una propiedad de JavaBean

Buffer de Datos Proporciona almacén de datos hasta que son

validados

Page 6: 03 action forms

¿Qué Funciones cumple un ActionForm? (II)

Validador Verificación de datos correctos

Verifica si dato puede ser convertido a Integer, Float, Double, etc. Chequea conversión correcta

Verificación si datos coherentes Método validate() llama a lógica de negocio P.e. Saber si cantidad de pago está dentro de crédito

Devuelve datos a usuario indicando incorrectos Transformador de tipos

Pueden incorporarse métodos helper para establecer estrucutura de datos: P.e. teléfono, fecha.

Page 7: 03 action forms

¿Qué Funciones cumple un ActionForm? (III)

Objeto de transferencia Transporte de datos que irán a modelo u

otro proceso

Firewall Permite examinar datos antes de que “afecten” a la aplicación

Page 8: 03 action forms

Capacidades de ActionForms (I)

Permiten compartición de nombres Un ActionForm puede tener propiedades con mismo nombre que

JavaBean de lógica de negocio (columnas de BBDD, etc) Mapeo manual No hay peligro

Minimización de código a medida Son adaptadores de capa de presentación Típicamente contiene

código de presentación (validación, etc). Fomentan incluir lógica de negocio separada (en beans de negocio)

Reutilización en otras partes Pueden encapusular helpers

Puede ser práctico importar objetos de capa de negociopublic String getTelephoneText() {

return ContactBean.formatTelephone(this.telephoneText,getLocale());

}

Page 9: 03 action forms

Capacidades de ActionForms (II)

Pueden encapsular otros Beans Struts autorrellena beans encapsulados:

<html:text property="values.telephoneText"

size="14"

maxlength="14"/>

Equivale a: aForm.getValues().setTelephoneText((String)

request.getAttribute(valueBean.telephoneText);

Page 10: 03 action forms

Tipos de ActionForms (I) ActionForm

Tipo básico (visto hasta ahora). Requiere declarar una clase y esquema de bean típico

ActionForm en base a Map Minimizar escribir código (gran cantidad de propiedades) Incorpora objeto Map para “meter” datos Se pueden mezclar propiedades “normales” con “mapeadas” Implica:

Escribir par métodos para manejar cualquier propiedad “mapeada”:public void setValue(String key, Object value)public Object getValue(String key)

Utilizar sintaxis algo diferente en JSPs value(key):<html:text property="value(key)"/><bean:write name="formBean" property="value(key)"/>

Page 11: 03 action forms

Tipos de ActionForms (II) DynaActionForm

Menos trabajo de codificación que Mapped ActionForms No se codifica ninguna clase Java, sólo configuración (struts-

config.xml) Se maneja como un ActionForm desde el código Versión DynaActionForm de MiFormulario:

<form-bean name="miFormulario" type="org.apache.struts.action.DynaActionForm"> <form-property name="nombre" type="java.lang.String"/> <form-property name=“direccion" type="java.lang.String"/></form-bean>

Page 12: 03 action forms

Transferencia de datos a lógica de negocio

JSP ActionServlet

ActionForm

Bean Datos o

lógica negocio

HTTP

RellenadoRetorno valores incorrectos

Transferencia lógica de negocio

Proceso asitistido (JSP tags Struts)

Proceso manual

Proceso automático (Struts)

Page 13: 03 action forms

Estrategias transferencia (I)

Implementar capa de negocio ActionForms implementan interfaces definidas por capa de negocio

public class UserPreferencesForm extends ActionFormimplements UserPreferencesBean {// ...

}

form es un objeto UserPreferencesForm

userPreferencesModel.save((UserPreferencesBean) form);

userPreferencesModel es un objeto de lógica de negocio (p.e. DAO acceso BBDD)

Conversión de datos Los ActionForms requiere datos miembro de tipo String o boolean. La lógica de negocio requiere datos nativos (Integer, Double, etc.) Conversión a datos nativos (requeridos en lógica de negocio) dentro del

ActionForm (métodos de la interfaz)

Page 14: 03 action forms

Estrategias transferencia (II)

Anidar objeto de datos mutable Sólo si objetos de datos requieren sólo

datos tipo boolean o String. Acceso a datos del modelo como

propiedades de ActionForm:values.telephone getValues().getTelephone();

Inconveniente Se liga presentación a objetos de datos

Page 15: 03 action forms

Estrategias transferencia (III)

Usar objeto de datos externo Los datos se le pasarían desde ActionForm a través de constructor o métodos set. Ejemplo:

ArticleForm aForm = (ArticleForm) form;ArticleBean aBean = new ArticleBean();aBean.setRecordHeader(

aForm.getArticleKey(),aForm.getEditor());

aBean.setPeople(aForm.getContributor(),aForm.getCreator());

aBean.setText(aForm.getTitle(),aForm.getContent());

Conversión de tipos Se realiza en el Action Internamente dentro del objeto de datos Usar método helper dentro del ActionForm que haga la conversión:

Integer getArticleKeyInteger() {return new Integer(this.getArticle())

} Inconvenientes

Cambio de objeto de datos si cambian propiedades de formularios

Page 16: 03 action forms

Estrategias transferencia (IV)

Utilizar método factoría En vez de convertir propiedad a propiedad devolver

el objeto de datos desde un método del ActionForm

public ArticleBean getArticleBean() {}

pulic void setArticleBean(ArticleBean bean) {}

Conversión de tipos Se realizan dentro del ActionForm en vez de en el Action

Page 17: 03 action forms

Estrategias transferencia (V)

Pasar un Map Aprovechar capacidades de Mapped ActionForms Se define el Map como propiedad del ActionForm (getMap, setMap) Se incluyen métodos para recuperar propiedades mapeadas (getValue, setValue)

public void setValue(String key, Object value) throws Exception { getMap().put(key,value);}public Object getValue(String key) throws Exception { return getMap().get(key);}

El objeto de datos del modelo deberá implementar método para pasarle el Mapform.setMap(bean.getMap());bean.setMap(form.getMap());

Conversión de tipos Si capa de negocio espera tipos nativos la conversión se puede hacer en un método helper del

ActionForm:public Map getTypedMap() { Map map = this.getMap(); String keyString = (String) map.get("key"); Integer keyInteger = new Integer(keyString); map.put("key",keyInteger); return map;}

Page 18: 03 action forms

Estrategias transferencia (VI)

Utilizar reflexión El paquete BeanUtils facilita el copiado de

propiedades y la transformación automática de tipos

BeanUtils.copyProperties(myBusinessBean,myActionForm);

myBusinessOperation(myBusinessbean);

BeanUtils.copyProperties(myActionForm,myBusinessBean);

Si se requiere hacer conversión a tipos no nativos (p.e. Timestamp) se pueden registrar conversores con BeanUtils

Page 19: 03 action forms

Estrategias transferencia (VII)

Utilizar clase adaptadora Es llevar el código a una clase intermedia

// Get data into ActionForm

DataBean dBean = new DataBean();

dBean.execute(something);

AdaptorBean aBean = new AdaptorBean(dBean);

aBean.populate(form);

// Fetch data from ActionForm

AdaptorBean adaptor = new AdaptorBean(new DataBean());

BaseForm actionForm = (BaseForm) form;

adaptor.set(actionForm);

DataBean model = (DataBean) adaptor.getBean();

data.execute();