2011-07-15 10 views
8

Estoy a punto de comenzar con el proyecto e que utiliza Struts 1.2. No hay un plan para pasar a otro marco.Struts 1 ActionForms - ¿Cuál es la convención para las fechas en el formulario?

Quería saber cuál es la convención al manejar una fecha en el formulario?

  1. ¿Debo crear una variable de fecha y crear un método setDate(String date) donde tendrá lugar la conversión?

  2. Crear una variable de fecha, setDate(Date date) y registrar un convertidor especial en algún lugar de la cadena? (no sé si es posible)

  3. Crear una variable String, setDate(String date) y dejar la conversión/validación al método validate en el bean ActionForm?

¿O otro enfoque?

Además, si tiene algún consejo para ponerse al día con este marco, realmente lo agradecería.

Respuesta

16

Antes de responder a su pregunta, permítanme comenzar diciendo esto: La gente no entiende lo que es o lo que ActionForm ActionForm hace

El ActionForm representa los datos que el usuario rellena el formulario HTML. Struts lee en los parámetros de solicitud y los relaciona por su nombre con el ActionForm configurado para la Acción objetivo del envío. Son datos ingresados ​​por el usuario, simple y llanamente.

Los datos que se obtienen a petición son siempre del tipo java.lang.String. Pero las personas pueden tener un campo de formulario llamado "edad" que es un int en sus datos de modelo. O tal vez en lugar de "edad" tienen una "fecha de nacimiento" que, por supuesto, es java.util.Date en sus datos de modelo. Entonces piensan que es una buena idea tener el tipo int y la Fecha colocados en el ActionForm y permitir que Struts convierta las cadenas que llegan a solicitud en ints y fechas.

Es una conversión muy útil y usted como desarrollador no tiene que manejarlo, Struts sí. Es un poco de magia de marco.

¡Pero esto no está volviendo loco Harry Potter! La conversión puede fallar en ints y fechas. ¿Por qué?

int es un tipo primitivo y, como tal, siempre debe tener un valor. La inicialización predeterminada es con cero. Al realizar el enlace (parámetros de solicitud a las propiedades del objeto ActionForm) Struts ve un tipo int en ActionForm e intenta convertir el valor de la cadena de solicitud a int.

Si el usuario insertó la Cadena "5", el campo se establece en 5. ¡Está bien!

¿Pero qué pasa si el usuario inserta "bla"? ¿Recibiremos una excepción en nuestra cara? ¡No! Recuperamos un valor de cero porque la conversión (silenciosa) falló. ¡Ups!

Las fechas son un problema. ¿Por qué? Porque su valor llega a petición como String. Su formato podría ser algo simple como "12/01/2011", que es completamente inútil como información. ¿Por qué?Porque las fechas representadas como cadenas deben ir de la mano con un Locale para transformarse en la instancia de fecha correcta que representa.

"12/01/2011" + Locale.US = 01 December 2011 
"12/01/2011" + Locale.FRENCH = 12 January 2011 

Ups!

Bien, ¡así que esta fue la introducción! Ahora vamos a su pregunta.

  1. ¿Debo crear un variable de tipo Fecha y crear un método en el que se producirá la conversión setDate (fecha de cuerdas).

En algún momento, tendrá que enviar a la fecha de regreso a la vista y la Struts html tags Normalmente, tendrá que ir a un getDate() que devuelve cadena. El "12/01/2011" que recibe la entrada del usuario puede aparecer como "12 de enero de 2011 00:00:00" si el comprador devuelve la fecha (Struts hará un toString() en el valor del captador). De modo que realmente necesita el campo Fecha con un setter/getter de tipo Date y un setter/getter de tipo String. Use el tipo Fecha en su clase de Acción y use Cadena para interactuar con las etiquetas de vista.

¿Pregunta? ¿Cómo maneja el valor regional apropiado en su ActionForm?

  1. Crear una variable de fecha, un setDate (fecha Fecha) y registrar un convertidor especial en algún lugar de la cadena (no sé si es posible)

It is possible. Puede crear y registrar un convertidor personalizado que pueda tomar representaciones de fechas de String y convertirlas a la fecha. Si utiliza el formato ISO 8601, creo que estará a salvo.

¿Pregunta? ¿Puede acomodar esto en la aplicación existente sin romper el código que transforma String en fechas a su manera usando todo tipo de formatos o configuraciones regionales?

  1. crear una variable de cadena, un setDate (fecha de cuerdas) y dejar que la conversión A/validación para el método de validación en el bean ActionForm

Este won no funciona El método validate se llama después de los enlaces de parámetros en el objeto ActionForm. Cuando llegues a este punto ya es tarde. Struts hizo la conversión. Si tiene un campo de tipo int con valor cero, no hay forma de saber si el usuario realmente insertó cero y la conversión funcionó o si el usuario insertó "bla" y la conversión falló y volvió cero como valor de inicialización predeterminado. Si cero es un valor válido para su aplicación, usted está en un problema aún mayor.

¿Cuál es la convención?

No hay ninguna convención. Use la información anterior y aplique el sentido común dada su situación.

Lo ideal es que tenga todas las propiedades en ActionForm como Strings para no perder información durante el enlace. Pero esto implica la conversión manual de las propiedades al tipo correcto en la clase Acción, antes de usarlas. Tienes control total (Struts ya no realiza conversiones porque los valores de origen y destino son de tipo String) pero también tienes un montón de código de placa de caldera para escribir para hacerlo de la manera adecuada, que en algún momento puede volverse molesto.

P.S. Antes de terminar esto e irme a la cama (es 01:00 a.m. en mi país: D) Solo quiero mencionar una cosa que la gente a menudo no ve. ActionForm no forma parte del modelo, ni debería interactuar directamente con el modelo.

Si necesita los datos del ActionForm para ser procesados ​​en el modelo, entonces correlacione como una relación de uno a uno con un modelo DTO (objeto de transferencia de datos). Si no lo hace, entonces crea un acoplamiento estrecho entre el modelo y el marco Struts porque sus objetos ActionForm no son un POJO. Su clase debe extender la clase ActionForm desde Struts de la que hemos estado hablando. La gente no hace esto y envía el ActionForm directamente al Modelo. Lo que es aún peor es que también usan el método validate para realizar validaciones comerciales en lugar de validación básica como "es obligatorio", "es el rango de valores", etc.

ActionForms son solo una ruta de comunicación entre la Acción (controlador) y la vista. Trátelo como tal.

Cuestiones relacionadas