Iniciando un proyecto con appfuse

From Wickle Wiki

Contents

Iniciando un proyecto con appfuse

Es imprescindible, al bajarse un proyecto realizado con el appfuse, del CVS hacer un ant setup para que el ant haga una limpieza y regeneracion de archivos ligados a la maquina de compilacion.

Añadiendo el menu (struts-menu)

Archivo: decorators/default.jsp

Nuevos estilos :

<link rel="stylesheet" type="text/css" media="screen" href="styles/global.css" />
<link rel="stylesheet" type="text/css" media="screen" href="styles/tabs.css" />
<script type="text/javascript" src="scripts/tabs.js"></script>

el Menu en decorators/default.jsp, permissions=rolesAdapter es para que el menu esconda submenus o items en funcion de los roles del usuario.

<menu:useMenuDisplayer name="TabbedMenu" bundle="org.apache.struts.action.MESSAGE" permissions="rolesAdapter">
 <menu:displayMenu name="TabbedHome"/>
 <menu:displayMenu name="TabbedAbout"/>
 <menu:displayMenu name="TabbedContact"/>
 <menu:displayMenu name="TabbedExit"/>
</menu:useMenuDisplayer>

Añadiendo los items y sus acciones a WEB-INF/menu-config.xml:

<Displayer name="TabbedMenu" type="net.sf.navigator.displayer.TabbedMenuDisplayer"/>
...
<Menu name="TabbedHome" title="menu.clickstream" description="User Menu" forward="accion1" roles="admin"/>
<Menu name="TabbedAbout" title="menu.user" description="User Menu" forward="editProfile2"/>
<Menu name="TabbedContact" title="menu.admin" description="User Menu" forward="editProfile3"/>
<Menu name="TabbedExit" title="menu.flushCache" description="User Menu" forward="editProfile4"/>

Creado un objeto

Creamos el POJO en el directorio: src/dao/**/model Al POJO, le tenemos que crear los campos minimos, crear los getter y los setter.

Ademas debemos especificar con que tabla de la base de datos se va a relacionar el objeto, y los campos con los que se relacionan las propiedades de la clase, ej.:

@hibernate.class table="metodo_man"
@struts.form include-all="true" extends="BaseForm"
...
@hibernate.id column="equi_num_id" generator-class="native"
unsaved-value="null"
...
@hibernate.property column="metodo_desc" lenght="30"

Una vez hecho esto, modificamos el archivo : src/dao/**/dao/hibernate/applicationContext-hibernate.xml para indicarle el lugar del nuevo objeto, EJ.:

<value>com/queres/sgei/model/TipoEquipo.hbm.xml</value>
...
    <!-- TipoEquipo: Hibernate implementation -->
    <bean id="tipoequipoDAO" class="com.queres.sgei.dao.hibernate.TipoEquipoDAOHibernate">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

Usamos appgen para generar DAOs, TESTs y demas ...

cd extras/appgen
ant -Dmodel.name=TipoEquipo -Dmodel.name.lowercase=tipoequipo
ant install-detailed

Stop_hand.png OJO: Esta accion modifica el arbol de directorios de nuestro codigo fuente. Ademas añade una linea ERRONEA al final del archivo src/dao/**/dao/hibernate/applicationContext-hibernate.xml. ELIMINARLA!!


Al final de todo comprobar que ha ido bien :

  • ant setup-db (creamos y aplicamos las modificaciones oportunas a la BBDD)
  • ant test-dao -Dtestcase=TipoEquipo
  • ant test-web -Dtestcase=TipoEquipo (Indispensable, GENERA el TipoEquipoForm.class)

Antes de pasar el test-all aun debemos modificar a mano otra cosa :

Al final de la jsp Form recien creado hay que comentar estas lineas (p.ej. tipoequipoForm.jsp):

<html:javascript formName="personForm" cdata="false"
    dynamicJavascript="true" staticJavascript="false"/>
<script type="text/javascript" 
    src="<html:rewrite page="/scripts/validator.jsp"/>"></script>

explicacion del BUG

finalmente ya podemos pasar el test final y deployar:

  • ant test-all
  • ant deploy


Como añadir entradas fijas al struts-config.xml

Para añdir entradas NO generadas automaticamente por el ant del appfuse al archivo struts-config.xml (por ejemplo un forward a maestras.html que no tiene action asociado ni nada), tenemos que editar los archivos :

metadata/web/struts-actions.xml
metadata/web/global-forwards.xml

Hay mas archivos que se usan en la generacion autoamtica, echarles un vistazo en el directorio metadata/web

Cargando un objeto a la inicializacion de la aplicacion

Archivos que debemos retocar para que un objeto con todos sus elemetos se carge al inicio de la aplicacion o cuando se hace un refresh a mano, por ejemplo una Clase Provincias. Archivos involucrados:

LookupDAO.java
LookupDAOHibernate.java
LookupManagerImpl.java 
LookupManager.java

StartupListener.java


Como hacer que un campo de un formulario sea obligatorio

Para ello nos vamos al model del objeto y al get del campo que queramos que sea obligatorio añadimos la tag de @struts.validator type="required"

/**
* @return Returns the metodoId.
* @hibernate.property column="metodo_id"
* @struts.validator type="required"
*/
public Long getMetodoId() {
	return metodoId;
}

una vez hecho esto limpiamos y regeneramos el validator.xml:

ant  clean webddoclet
ant deploy

y deployamos los cambios, que no es mas que copiar el nuevo validation.xml al directorio WEB-INF de nuestra aplicacion:

ant deploy

Errores comunes

org.dbunit.DatabaseUnitException: java.sql.SQLException: ... IDENTITY_INSERT is set to OFF.

BUILD FAILED /home/vic/queresworkspace/coma/build.xml:676: org.dbunit.DatabaseUnitException: java.sql.SQLException: Cannot insert explicit value for identity column in table 'seccion' when IDENTITY_INSERT is set to OFF.

Se debe a que si ponemos generator-class="native" en el ID, SQL SERVER necesita que se ponga el parametro SET IDENTITY_INSERT a TRUE , para que puedas añadir campos autonumericos a mano (que lo hace el script de llenado de la bbdd con datos generados)

No form found under 'equipoForm' in locale 'es'

javaxjavax.servlet.jsp.JspException: No form found under 'equipoForm' in locale 'es'
	at org.apache.struts.taglib.html.JavascriptValidatorTag.renderJavascript(JavascriptValidatorTag.java:364)
	at org.apache.struts.taglib.html.JavascriptValidatorTag.doStartTag(JavascriptValidatorTag.java:335)
	at org.apache.jsp.WEB_002dINF.pages.equipoForm_jsp._jspx_meth_html_javascript_0(equipoForm_jsp.java:1352)
	at org.apache.jsp.WEB_002dINF.pages.equipoForm_jsp._jspService(equipoForm_jsp.java:130)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
	at 
.............

El problema es el archivo equipoForm.jsp y las ultimas 5 lineas, que deben ser comentadas:

<!--html:javascript formName="equipoForm" cdata="false"
    dynamicJavascript="true" staticJavascript="false"/>
<script type="text/javascript"
    src="<html:rewrite page="/scripts/validator.jsp"/>"></script-->

Could not load user defined filter: org.tuckey.web.filters.urlrewrite.UrlRewriteFilter

<06-oct-05 13:59:44 CEST> <Error> <HTTP> <101165> <Could not load user defined filter: org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
java.lang.NoClassDefFoundError: java/lang/CharSequence
        at org.tuckey.web.filters.urlrewrite.Conf.processConfDoc(Conf.java:157)
        at org.tuckey.web.filters.urlrewrite.Conf.loadDom(Conf.java:137)
        at org.tuckey.web.filters.urlrewrite.Conf.<init>(Conf.java:87)
        at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.loadConf(UrlRewriteFilter.java:219)
        at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.init(UrlRewriteFilter.java:205)
        at weblogic.servlet.internal.WebAppServletContext$FilterInitAction.run(WebAppServletContext.java:5475)
        at weblogic.security.service.SecurityServiceManager.runAs(SecurityServiceManager.java:780)
        at weblogic.servlet.internal.WebAppServletContext.registerFilter(WebAppServletContext.java:2452)
        at weblogic.servlet.internal.WebAppServletContext.initFilters(WebAppServletContext.java:2433)
        at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:2703)
        at weblogic.servlet.internal.WebAppServletContext.setStarted(WebAppServletContext.java:4768)
        at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:548)
        at weblogic.j2ee.J2EEApplicationContainer.start(J2EEApplicationContainer.java:1039)
        at weblogic.j2ee.J2EEApplicationContainer.activate(J2EEApplicationContainer.java:1075)
        at weblogic.management.deploy.slave.SlaveDeployer.processPrepareTask(SlaveDeployer.java:1110)
        at weblogic.management.deploy.slave.SlaveDeployer.prepareUpdate(SlaveDeployer.java:730)
        at weblogic.drs.internal.SlaveCallbackHandler$1.execute(SlaveCallbackHandler.java:24)
        at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:213)
        at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:189)

El problema es que la JVM que estamos usando es la 1.3.x o inferior y esto no es posible con la version que tenemos instalada de urlrewrite, Para solucionarlo basta con instalar la version 1.2 de urlrewrite que viene con appfuse 1.8.1 por ejemplo.

The taglib validator rejected the page

This error is WEBLOGIC 7.0 SPECIFIC

java.io.IOException: javax.servlet.jsp.JspException: The taglib validator rejected the page: "org.xml.sax.SAXParseException: The markup in the document preceding the root element must be well-formed., "
        at weblogic.servlet.jsp.Jsp2Java.outputs(Jsp2Java.java:124)
        at weblogic.utils.compiler.CodeGenerator.generate(CodeGenerator.java:258)
        at weblogic.servlet.jsp.JspStub.compilePage(JspStub.java:353)
        at weblogic.servlet.jsp.JspStub.prepareServlet(JspStub.java:211)
        at weblogic.servlet.jsp.JspStub.prepareServlet(JspStub.java:164)
        at weblogic.servlet.internal.ServletStubImpl.getServlet(ServletStubImpl.java:517)
        at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:351)
...

La Solucion temporal es NO usar tildes ni caracteres no internacionales dentro de las TAGS STRUTS

Personal tools
This site is powered by Queres Tecnologias