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
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

