Você está na página 1de 13

Usos y prcticas de la arquitectura para el proyecto de Bancoppel.

Carlos Alberto Chong Antonio 31/07/2012

[Escriba aqu una descripcin breve del documento. Normalmente, una descripcin breve es un resumen corto del contenido del documento. Escriba aqu una descripcin breve del documento. Normalmente, una descripcin breve es un resumen corto del contenido del documento.]

Usos y prcticas de la arquitectura para un proyecto de software.

31 de julio de 2012

Tabla de contenido
1 Definicin y nomenclatura de los componentes................................................................... 2 1.1 Controller. Clases java que sirven para procesar o recibir las peticiones del usuario. . 2

1.2 ReqBeanDTO. Clases java que sirven como parmetro para hacer llamada a los servicios. .................................................................................................................................... 2 1.3 ResBeanDTO. Clases java que sirven como variables de retorno de los servicios. ....... 2

1.4 Interfaces de servicios. Interfaces (interfaces java) que definen los servicios expuestos. ................................................................................................................................. 2 1.5 Servicios. Clases java donde se implementan las interfaces de servicios. .................... 2

1.6 Clases de ayuda de persistencia. Objetos que se utilizaran para dar soporte a la ejecucin de los servicios. ......................................................................................................... 3 1.7 1.8 2 Fbrica de objetos. Objetos que se encargan de la creacin de los objetos. ............... 3 Excepciones. .................................................................................................................. 3

Mdulo de presentacin. ...................................................................................................... 3 2.1 2.2 Rutas .............................................................................................................................. 3 Buenas Prcticas en html, jsp, javascript y java. ........................................................... 4 No usar variables en javascript sin declarar con var ............................................. 4

2.2.1

2.2.2 Evitar escribir cdigo javascript directamente en las pginas jsp, mejor generar un archivo con extensin js que contenga el cdigo que se quiera ejecutar. ...................... 4 2.2.3 Evitar escribir el manejo de los eventos directamente en los elementos HTML, en lugar de eso se agregan por medio de javascript............................................................. 4 2.2.4 Evitar crear las hojas de estilo directamente en el jsp o html (Inline style), en su lugar generar la hoja de estilo en un archivo css. ................................................................. 5 2.2.5 Evitar enviar una cadena como parmetro al setTimeout, en lugar usar funciones annimas. ............................................................................................................. 5 2.2.6 2.2.7 2.3 2.4 2.5 3 No escribir cdigo java dentro de los jsp, para eso es el controller ..................... 5 Evitar usar las excepciones como control de flujo. ............................................... 6

Internacionalizacin ...................................................................................................... 6 Controller ...................................................................................................................... 7 Llamadas a los servicios ................................................................................................ 8

Servicios (Mdulos: negocio, seguridad, persistencia, configuracin, auditoria, etc.) ....... 10 3.1.1 3.1.2 3.1.3 Rutas .................................................................................................................... 10 Construccin de los servicios .............................................................................. 11 Uso de los parmetros de configuracin ............................................................ 11

Mdulo de persistencia ....................................................................................................... 12 4.1 Ejecucin hacia el middleware InterAct ...................................................................... 12

Usos y prcticas de la arquitectura para un proyecto de software.

31 de julio de 2012

Definicin y nomenclatura de los componentes

1.1 Controller. Clases java que sirven para procesar o recibir las peticiones del usuario. Nomenclatura: Controller{nombre del controlador} Ruta: mx.com.solser.bancoppel.presentacion.controller Nota: Deben de tener la anotacin @Controller 1.2 ReqBeanDTO. Clases java que sirven como parmetro para hacer llamada a los servicios. Nomenclatura: Req{nombre}DTO. Ruta: mx.com.solser.bancoppel.beans.req Nota: Deben de implementar la interfaz Serializable, el constructor debe tener visibilidad por default. 1.3 ResBeanDTO. Clases java que sirven como variables de retorno de los servicios. Nomenclatura: Res{nombre}DTO. Ruta: mx.com.solser.bancoppel.beans.res Nota: Deben de extender la clase abstracta AbstractRespuesta e implementar la interfaz Serializable, el constructor debe tener visibilidad por default. 1.4 Interfaces de servicios. Interfaces (interfaces java) que definen los servicios expuestos. Nomenclatura: I{nombre}. Ruta: mx.com.solser.bancoppel.{modulo}.interfaces 1.5 Servicios. Clases java donde se implementan las interfaces de servicios. Nomenclatura: {nombre}EJBImp. Ruta: mx.com.solser.bancoppel.{modulo}.ejb Nota: Deben de extender de la clase ArchitectBase, y contienen las siguientes anotaciones: @Stateless .- Indica que es un EJB sin estado. @Remote({nombreInterfaz}.class).- Indica que es un EJB remoto, se pone como parmetro el nombre de la interfaz. @Interceptors(SpringBeanAutowiringInterceptor.class).- Anotacin requerida por Spring. @RemoteBinding(jndiBinding="{nombreEJB}).- Anotacin para indicar el nombre con que se podr buscar el servicio por jndi.

Usos y prcticas de la arquitectura para un proyecto de software. 1.6

31 de julio de 2012

Clases de ayuda de persistencia. Objetos que se utilizaran para dar soporte a la ejecucin de los servicios.

Nomenclatura: Los mismos nombres que en el proyecto original Ruta: mx.com.solser.bancoppel.persistencia.helper 1.7 Fbrica de objetos. Objetos que se encargan de la creacin de los objetos.

FactoryBeanReq se encarga de la construccin de los objetos que se utilizan como parmetros de los servicios. Ruta: mx.com.solser.bancoppel.beans.req FactoryBeanRes se encarga de la construccin de los objetos que se utilizan como parmetros de regreso de los servicios. Ruta: mx.com.solser.bancoppel.beans.res FactoryBeanDTO se encarga de la construccin de los beans. Ruta: mx.com.solser.bancoppel.beans

1.8

Excepciones.

ArchitectException.- Se lanzan cuando no se cumple con lo especificado en la arquitectura. PersistenciaException.- Se lanza cuando fallan los llamados a InterAct.

2 Mdulo de presentacin. El mdulo de la presentacin, est formado por archivos java, jsp, js, css, png, jpg, etc. utilizando como base el framework de spring mvc. 2.1 Rutas

Las rutas donde se deben de colocar cada uno de los componentes es la siguiente: Archivos de contexto de la aplicacin: mx\com\solser\architecbase\bancoppel\config\Context-Mode.xml mx\com\solser\architecbase\bancoppel\config\ApplicationContext.xml WebContent\WEB-INF\Principal-servlet.xml WebContent\WEB-INF\Publico-servlet.xml

Usos y prcticas de la arquitectura para un proyecto de software. Archivos jsp: WebContent\WEB-INF\jsp\privado\ WebContent\WEB-INF\jsp\publico\

31 de julio de 2012

Archivos java Controller: mx.com.solser.bancoppel.presentacion.controller Archivos js: WebContent\js\publico WebContent\js\privado 2.2 Buenas Prcticas en html, jsp, javascript y java.

2.2.1 Mal:

No usar variables en javascript sin declarar con var

index = 0 Correcto: var index = 0

2.2.2

Evitar escribir cdigo javascript directamente en las pginas jsp, mejor generar un archivo con extensin js que contenga el cdigo que se quiera ejecutar.

Mal:

<SCRIPT LANGUAGE="JavaScript"> <!-addListener(window.document, 'keyup', disableCtrlKeyCombination, false); addListener(window.document, 'keydown', disableCtrlKeyCombination, false); //--> </SCRIPT> Correcto: <script type="text/javascript" src="${pageContext.servletContext.contextPath}/js/publico/index.js"></script> deshabilita:function(){$('body').bind('keydown',global.disableCtrlKeyCombination);}

2.2.3

Evitar escribir el manejo de los eventos directamente en los elementos HTML, en lugar de eso se agregan por medio de javascript.

Mal: <a href="" style="color: #4ae7ff; font-family: verdana; font-size: 10;" onclick="abreSesion(2, 'frmActivacion.jsp'); window.status='BanCoppel'; return false;" >Activar Usuario</a>

Usos y prcticas de la arquitectura para un proyecto de software. Correcto: $('#frmActivacion').bind('click',function(){ index.abreSesion(2, 'frmActivacion.go'); window.status='BanCoppel'; return false; });

31 de julio de 2012

2.2.4

Evitar crear las hojas de estilo directamente en el jsp o html (Inline style), en su lugar generar la hoja de estilo en un archivo css.

Mal: <table border="0" align="center" style="color: #4ae7ff; font-size: 10;"> Correcto: table { font-family:Arial, Helvetica, sans-serif; font-size:10px; color: #4ae7ff;} 2.2.5 Evitar enviar una cadena como parmetro al setTimeout, en lugar usar funciones annimas. cellspacing='3' bgcolor="#0171b9" width="100%"

Mal: var det_maskUsuario=setTimeout('EnmascaraV2("maskUsuario","usuario",true)',1); Correcto: var maskUsuario = maskUsuario; var usuario = usuario; var det_maskUsuario=setTimeout( function(){ EnmascaraV2(maskUsuario,usuario,true); },1); 2.2.6 Mal : <% request.getSession().setAttribute("SesionActiva", "True"); request.getSession().setAttribute("mostrarCodigo", new Boolean(true)); %> No escribir cdigo java dentro de los jsp, para eso es el controller

Usos y prcticas de la arquitectura para un proyecto de software. 2.2.7 Mal :


try{

31 de julio de 2012

Evitar usar las excepciones como control de flujo.

if(iDv != iDvNumero){ throw new Exception("error:UsuarioGeneral"); } if(usuarioForm.getNumCliente().trim().compareTo(respStores[1].trim())==0){ bValida=true; }else { throw new Exception("error:UsuarioGeneral"); } }catch(Exception e){ if(e.getMessage().compareTo("error:UsuarioGeneral")==0){ request.setAttribute("error", "error.usuario.datoserroneos"); } }

Correcto:
if(iDv == iDvNumero){ if(usuarioForm.getNumCliente().trim(). compareTo(respStores[1].trim())==0){ bValida=true; }else { request.setAttribute("error", "error.usuario.datoserroneos"); } }else{ request.setAttribute("error", "error.usuario.datoserroneos"); }

2.3

Internacionalizacin

Para manejar la internacionalizacin se debe de agregar al inicio de cada jsp las siguientes lneas: <%@ page isELIgnored="false" %> <%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%> Cada uno de los textos que se van a internacionalizar deben agregarse en alguno de los archivos de properties: publico.properties: para los textos de los jsp que se encuentren en la parte pblica. privado.properties: para los textos de los jsp que se encuentren en la parte privada. messages.properties: para los mensajes de error Los archivos mencionados se encontraran en la siguiente ruta del proyecto BanCoppelClient:

Usos y prcticas de la arquitectura para un proyecto de software. mx.com.solser.architecbase.bancoppel.config.i18n La nomenclatura que se seguir para los properties es la siguiente: {publico|privado}.{nombre del jsp}.{label} = {descripcion} Ejemplo: publico.index.nomBanco = Banca Electrnica BanCoppel publico.index.cveAcceso = Clave de Acceso:

31 de julio de 2012

Para hacer uso de dichos properties primero se deben de declarar dentro de los jsp y esto se hace de la siguiente manera: <spring:message code="publico.index.nomBanco" var="nomBanco" /> <spring:message code="publico.index.cveAcceso" var="cveAcceso"/> Ya que hayan sido declarados se pueden utilizar con la notacin ${variale}. Ejemplo: <td><strong>${cveAcceso}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong></td>

2.4

Controller

El controller es el encargado de recibir y/o procesar las peticiones del cliente, para generar un controlador se genera una clase java con la anotacin de @Controller. Ejemplo: @Controller public class ControllerPublico { ... } El nombre de la clase puede ser cualquiera pero por convencin en el proyecto debe de empezar con el prefijo Controller y todos los controller se ubicaran en la siguiente ruta: mx.com.solser.bancoppel.presentacion.controller. Dicha clase se debe de registrar en uno de los archivos de contexto que se estn manejando en la aplicacin (/WEB-INF/Publico-servlet.xml, /WEB-INF/Principal-servlet.xml). Ejemplo: <bean id="controllerPublico" name="controllerPublico" class="mx.com.solser.bancoppel.presentacion.controller.ControllerPublico"> </bean>

Usos y prcticas de la arquitectura para un proyecto de software.

31 de julio de 2012

Para que el controlador pueda procesar la peticin del usuario, primero se debe de definir un mtodo con la anotacin @RequestMapping. La anotacin @RequestMapping sirve para hacer el mapeo de la peticin con el mtodo, por lo cual dicha anotacin requiere como parmetro el nombre de la peticin (pagina). Cada mtodo que se utiliza para procesar peticiones debe de regresar un objeto del tipo ModelAndView. En el constructor del objeto ModelAndView se enva el nombre del jsp sin extensin como parmetro. Ejemplo: @RequestMapping(value="index.go") public ModelAndView view() { return new ModelAndView("index"); } En la mayora de las ocasiones las peticiones vienen con parmetros, para poder procesar dichos parmetros se deben de utilizar los objetos HttpServletRequest request y HttpServletResponse response, los cuales se deben de definir como parmetros del mtodo que va a procesar la solicitud. Ejemplo: @RequestMapping(value="/activar.go") public ModelAndView activar(HttpServletRequest request, HttpServletResponse response) { String numTarjeta = request.getParameter("numTarjeta"); String folioact = request.getParameter("folioact"); String sucursal = request.getParameter("sucursal"); return new ModelAndView("activar"); }

Para que el controlador pueda funcionar desde la arquitectura debe de extender de la clase ArchitectBase. Ejemplo: @Controller public class ControllerPublico extends ArchitectBase{ } 2.5 Llamadas a los servicios

Para que el controlador pueda hacer llamados a los servicios de otros mdulos primero se tiene que registrar un objeto del tipo JndiTemplate, dicho objeto nos permitir obtener las referencias a los servicios remotos. Para poder usar el JndiTemplate primero se tiene que configurar y para esto se carga un archivo de properties llamado jndi.properties. El archivo jndi se encuentra en la siguiente ruta: mx/com/solser/architecbase/bancoppel/config/jndi.properties

Usos y prcticas de la arquitectura para un proyecto de software.

31 de julio de 2012

Para cargar el archivo de properties se tiene que agregar una configuracin a los archivos de contexto de la aplicacin: <context:property-placeholder location="classpath:mx/com/solser/architecbase/bancoppel/config/jndi.properties"/>

Registro del objeto del tipo JndiTemplate: <bean id="jndiSeguridadTemplate" class="org.springframework.jndi.JndiTemplate"> <property name="environment"> <value> java.naming.factory.initial = ${seguridad.java.naming.factory.initial} java.naming.factory.url.pkgs = ${seguridad.java.naming.factory.url.pkgs} java.naming.provider.url = ${seguridad.java.naming.provider.url} </value> </property> </bean> Ya que se tiene registrado el objeto JndiTemplate se pasa a registrar el servicio a utilizar, para eso se utilizara como ayuda un objeto del tipo JndiObjectFactoryBean el cual recibe los siguientes parmetros: Propiedad: jndiTemplate Referencia: Es el nombre del objeto JndiTemplate que se defini con anterioridad en nuestro caso es jndiSeguridadTemplate. Propiedad: jndiName Referencia: Es el jndi con el que se va a localizar el servicio mx.com.solser.bancoppel.seguridad.ejb.LoginEJB Propiedad: proxyInterface Referencia: Es la interface (interface java) definida para el servicio. <bean id="loginService" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiTemplate" ref=" jndiSeguridadTemplate"/> <property name="jndiName" value="mx.com.solser.bancoppel.seguridad.ejb.LoginEJB"/> <property name="proxyInterface" value="mx.com.solser.bancoppel.seguridad.interfaces.ILogin"/> </bean> Ya que se tiene definido el servicio a utilizar, el siguiente paso es configurar el controller para que se le pueda inyectar dicho servicio, para lo cual se requieren dos pasos el primer paso es definir una propiedad cuyo tipo es el definido en proxyInterface: mx.com.solser.bancoppel.seguridad.interfaces.ILogin. Ejemplo: @Controller public class ControllerPublico extends ArchitectBase{ private ILogin loginService = null; /** * @return El loginService */ public ILogin getLoginService() {

Usos y prcticas de la arquitectura para un proyecto de software. return loginService; } /** * @param loginService lo setea en la propiedad loginService */ public void setLoginService(ILogin loginService) { this.loginService = loginService; } }

31 de julio de 2012

El segundo paso es modificar la definicin del controller en el archivo de contexto, en la definicin del controller se agrega la propiedad del servicio. <bean id="controllerPublico" name="controllerPublico" class="mx.com.solser.bancoppel.presentacion.controller.ControllerPublico"> <property name="loginService" ref="loginService"/> </bean> Despus de que se hayan realizados los 2 pasos anteriores se puede utilizar el servicio en cualquier mtodo dentro del controller. @RequestMapping(value="/login.go") public ModelAndView activar(HttpServletRequest request, HttpServletResponse response) { . String usuario = request.getParameter("usuario"); String password = request.getParameter("password"); reqLoginDTO = FactoryBeanReq.getReqLoginDTO(usuario, password, remoteAddr); loginService.login(reqLoginDTO,getSessionBean()); return new ModelAndView("inicio"); }

NOTA: Al hacer la llamada a los servicios siempre se debe de pasar como parmetro un objeto del tipo ArchitectSessionBean el cual se puede obtener haciendo uso del mtodo getSessionBean() que proporciona la arquitectura.

Servicios (Mdulos: negocio, seguridad, persistencia, configuracin, auditoria, etc.)

3.1.1

Rutas

Las rutas que tendrn cada uno de los componentes sern los siguientes: Interfaces: mx.com.solser.bancoppel.{modulo}.interfaces Implementaciones EJB:

Usos y prcticas de la arquitectura para un proyecto de software. mx.com.solser.bancoppel.{modulo}.ejb Archivos de contexto: /beanRefContext.xml mx\com\solser\architecbase\bancoppel\config\SeguridadContext.xml mx\com\solser\architecbase\bancoppel\config\PersistenciaContext.xml mx\com\solser\architecbase\bancoppel\config\ConfigContext.xml mx\com\solser\architecbase\bancoppel\config\NegocioContext.xml 3.1.2 Construccin de los servicios

31 de julio de 2012

Los servicios estn construidos a partir de EJBs versin 3.0 utilizando como ayuda el framework de spring. Los pasos para definir un servicio son los siguientes: a) Generar un interfaz (interfaz de java) con los servicios que se expondrn al cliente. Cada uno de los mtodos definidos en la interfaz debern recibir un objeto del tipo ArchitectSessionBean. Como parmetro debe de recibir un objeto del tipo con prefijo Req, y el objeto de la arquitectura ArchitectSessionBean y como respuesta debe ser un objeto del tipo con prefijo Res. public interface ILogin { ResLoginDTO login(ReqLoginDTO login, ArchitectSessionBean sessionBean); }

b) Generar la clase que implementa dicha interface con las anotaciones correspondientes

@Stateless @Remote(IUsuarios.class) @Interceptors(SpringBeanAutowiringInterceptor.class) @RemoteBinding(jndiBinding="mx.com.solser.bancoppel.persistencia.ejb.UsuariosEJB") public class LoginEJBImp implements ILogin{ public ResLoginDTO login(ReqLoginDTO login, ArchitectSessionBean sessionBean) { ... } 3.1.3 Uso de los parmetros de configuracin

Para poder utilizar los parmetros de configuracin, se tienen que agregar como propiedad el servicio parametroService tanto en los contextos de la aplicacin como en la clase java.

Usos y prcticas de la arquitectura para un proyecto de software.

31 de julio de 2012

<bean id="bDIbpi" name="bDIbpi" class="mx.com.solser.bancoppel.persistencia.helper.BDIbpi" depends-on="parametroService"> <property name="parametroService" ref="parametroService"></property> </bean>

Mdulo de persistencia

4.1

Ejecucin hacia el middleware InterAct

Se utilizaran clases de ayuda las cuales tendrn como propiedad un objeto del tipo Executor. Este objeto ser el encargado de mandar a ejecutar la trama hacia interAct. Para la ejecucin se realiza con el llamado al mtodo executeInterAct la cual recibe dos parmetros, el primero parmetro es la trama y el segundo parmetro es el nombre de la base. Ejemplo: private Executor executor = Executor.getInstance(); public ResLoginDTO login(final ReqLoginDTO reqLoginDTO) { ... oRec = executor.executeInterAct(trama, paramNegocio.BDBPI); ... } El mtodo executeInterAct regresa un objeto del tipo Header que contiene el resultado de la consulta. La cadena resultante se obtiene a partir de la llamada get_io_buf. Ejemplo: oRec = executor.executeInterAct(trama, paramNegocio.BDBPI); String resp = oRec.get_io_buf()

Você também pode gostar