Páginas JSP y beans de datos

Un bean de datos es un bean Java que se utiliza en una página JSP para proporcionar contenido dinámico. Normalmente un bean de datos proporciona una representación simple de un bean de entidad de HCL Commerce. El bean de datos encapsula las propiedades que se pueden recuperar o establecer en el bean de entidad. Como tal, el bean de datos simplifica la tarea de incorporar datos dinámicos en las páginas JSP.

Un bean de datos se activa de uno de los dos modos siguientes:

  • Mediante el código wcbase:useBean tag (recomendado)
  • Mediante la llamada siguiente:
    
    com.ibm.commerce.beans.DataBeanManager.activate(data_bean, request, response)
    

    Donde data_bean es el bean de datos que se ha de activar, request es un objeto HTTPServletRequest y response es un objeto HTTPServletResponse.

Los desarrolladores de tienda deben tener en cuenta las propiedades de la tienda y los aspectos de globalización cuando desarrollen páginas JSP.

Consideraciones sobre la seguridad de los beans de datos

Una práctica de codificación determinada para el uso de los beans de datos minimiza la posibilidad de que usuarios mal intencionados puedan acceder a la base de datos sin autorización. Las partes de inserción, selección, actualización y supresión de las sentencias SQL deben crearse en el momento del desarrollo. Utilice la inserción de parámetros para recopilar información de entrada de ejecución.

A continuación se muestra un ejemplo de utilización de una inserción de parámetro para recopilar información de entrada de tiempo de ejecución:


select * from Order where owner =?

Por el contrario, debe evitar el uso de series de entrada para componer una sentencia SQL. A continuación se muestra un ejemplo de utilización de una serie de entrada:


select * from Order where owner = "input_string"

Tipos de beans de datos

Un bean de datos es un bean Java que se utiliza principalmente para proporcionar datos dinámicos en páginas JSP. Hay dos tipos de beans de datos: Beans de datos inteligentes y beans de datos de mandato.

Un bean de datos inteligente utiliza un método de lazy fetch para recuperar sus propios datos. Este tipo de bean de datos puede proporcionar un mejor rendimiento en situaciones en las que no son necesarios todos los datos del bean de acceso, puesto que solo recupera los datos necesarios. Los beans de datos inteligentes que necesitan acceder a la base de datos deben ampliarse del bean de acceso para el bean de entidad correspondiente e implementar la interfaz com.ibm.commerce.SmartDataBean. Por ejemplo, el bean de datos ProductDataBean amplía el bean de acceso ProductAccessBean, que corresponde al bean de entidad de producto.

Algunos beans de datos inteligentes no necesitan acceder a la base de datos. Por ejemplo, el bean de datos inteligente PropertyResource recupera datos de un paquete de recursos, en vez de recuperarlos de la base de datos. Cuando no es necesario acceder a la base de datos, el bean de datos inteligente debe ampliar la clase SmartDataBeanImpl.

Un bean de datos de mandato necesita utilizar un mandato para recuperar sus datos y es un bean de datos menos potente. El mandato recupera a la vez todos los atributos del bean de datos, independientemente de si la página JSP los necesita o no. Por ello, para las páginas JSP que solo utilizan una selección de atributos del bean de datos, un bean de datos de mandato puede ser muy costoso en términos de rendimiento. Aunque se puede aplicar el control de acceso a nivel de bean de datos cuando se utiliza el bean de datos inteligente, esto no es así para el bean de datos de mandato. Utilice únicamente el bean de datos de mandatos si utilizar un bean de datos inteligente no le resulta práctico.

Los beans de datos de mandato también pueden ampliarse de sus beans de acceso correspondientes e implementar la interfaz com.ibm.commerce.CommandDataBean.

Interfaces de bean de datos

Los beans de datos implementan una o todas las interfaces Java siguientes:

  • com.ibm.commerce.SmartDataBean.
  • com.ibm.commerce.CommandDataBean
  • com.ibm.commerce.InputDataBean (opcional)

Cada interfaz Java describe la fuente de los datos que se insertan en un bean de datos. Si implementa varias interfaces, el bean de datos puede acceder a datos de distintas fuentes. A continuación se proporciona más información sobre cada una de las interfaces.

Interfaz SmartDataBean

Un bean de datos que implementa la interfaz SmartDataBean puede recuperar sus propios datos sin tener asociado ningún mandato de bean de datos. Un bean de datos inteligente normalmente se amplía a partir del bean de acceso de un bean de entidad correspondiente. Al activar un bean de datos inteligente, el gestor de bean de datos invoca el método de inserción de datos del bean de datos. Si utiliza el método de inserción de datos, el bean de datos puede recuperar todos los atributos a excepción de los atributos de los objetos asociados. Por ejemplo, si el bean de datos se amplía de una clase de bean de acceso de un bean de entidad, el bean de datos invoca el método refreshCopyHelper. Todos los atributos del bean de entidad correspondiente se insertan automáticamente en el bean de datos inteligente. Sin embargo, si el bean de entidad tiene objetos asociados, los atributos de dichos objetos no se recuperan. Las principales ventajas de utilizar beans de datos inteligentes son las siguientes:

  • La implementación es sencilla y no es necesario escribir un mandato de bean de datos.
  • Al añadir nuevos campos al bean de entidad, no es necesario realizar cambios en el bean de datos. Después de modificar el bean de entidad, se debe volver a generar el bean de acceso (con las herramientas de WebSphere Commerce Developer). Tan pronto como se haya vuelto a generar el bean de acceso, todos los atributos nuevos estarán automáticamente disponibles para el bean de datos inteligente.
  • Los beans de entidad a menudo contienen atributos que representan objetos asociados. Por motivos de rendimiento, el bean de datos inteligente no recupera automáticamente estos atributos. En lugar de eso, es preferible retrasar la recuperación de dichos atributos hasta que sean necesarios, tal como se muestra en el siguiente diagrama:

    Pulse el enlace D para obtener una descripción.

    Para obtener más información acerca de cómo implementar una recuperación de recopilación diferida, consulte la sección Recuperación de datos de recopilación diferida.

Interfaz CommandDataBean

Un bean de datos que implementa la interfaz CommandDataBean recupera los datos de un mandato de bean de datos. Un bean de datos de este tipo es un objeto poco potente; depende de que un mandato de bean de datos inserte sus datos. El bean de datos debe implementar el método getCommandInterfaceName() (tal como lo define la interfaz com.ibm.commerce.CommandDataBean), que devuelve el nombre de interfaz del mandato de bean de datos.

Interfaz InputDataBean

Un bean de datos que implementa la interfaz InputDataBean recupera datos de los parámetros de URL o de los atributos establecidos por la vista.

Los atributos definidos en esta interfaz pueden utilizarse como campos de clave primaria para obtener datos adicionales. Al invocar una página JSP, el código de servlet JSP generado inserta datos en todos los atributos que coinciden con los parámetros de URL y, a continuación, activa el bean de datos pasándolo al gestor de beans de datos. Después, el gestor de bean de datos invoca el método setRequestProperties() del bean de datos (tal como define la interfaz com.ibm.commerce.InputDataBean) para pasar todos los atributos establecidos por la vista. Se deberá tener en cuenta que es necesario el código siguiente para que se active el bean de datos:


com.ibm.commerce.beans.DataBeanManager.activate(data_bean, request, response)

Donde data_bean es el bean de datos que se ha de activar, request es un objeto HTTPServletRequest y response es un objeto HTTPServletResponse.

Activación de los beans de datos

Los beans de datos pueden activarse utilizando los métodos activate o silentActivate que están en la clase com.ibm.commerce.beans.DataBeanManager. El método activate es un método de activación completo en el que el suceso de activación es satisfactorio solo si están disponibles todos los atributos. Incluso en el caso de que solo falte un atributo, se generará una excepción para todo el proceso de activación.

El método silentActivate no genera excepciones cuando no están disponibles atributos individuales.

Invocar mandatos de controlador desde una página JSP

No invoque los mandatos de controlador dentro de páginas JSP.

Recuperación de datos de recopilación diferida

Cuando se activa un bean de datos, éste puede rellenarse con datos mediante un mandato de bean de datos o mediante el método populate() del bean de datos. Los atributos que se recuperan proceden del bean de entidad correspondiente al bean de datos. Un bean de entidad también puede tener objetos asociados, que a su vez tienen varios atributos.

Si, durante la activación, se recuperan automáticamente los atributos de todos los objetos asociados, puede que haya un problema de rendimiento. El rendimiento puede disminuir a medida que aumente el número de objetos asociados.

Suponga un bean de datos de producto que contenga un gran número de productos de venta cruzada, venta ascendente o accesorios (objetos asociados). Es posible insertar datos en todos los objetos asociados tan pronto se active el bean de datos de producto. Sin embargo, si se insertan datos de esta forma será necesario realizar múltiples consultas a la base de datos. Si la página no necesita todos los atributos, puede que las múltiples consultas a la base de datos sean inútiles.

En general, una página no necesita todos los atributos y, por lo tanto, el mejor patrón de diseño es realizar una recopilación diferida tal como se muestra a continuación:


getCrossSellProducts () {
         if (crossSellDataBeans == null){
                 crossSellDataBeans= getCrossSellDataBeans();    
        }
         return crossSellDataBean;
          }