miércoles, 7 febrero 2007
Apuntes maven2
mvn help:describe -DgroupId=org.apache.maven.plugins -DartifactId=maven-site-plugin
mvn help:describe -DgroupId=org.apache.maven.plugins -DartifactId=maven-site-plugin
ANT_OPTS="-Xms512m -Xmx512m" ant WarProduccion
Todo parece que va bien, pero ..... Intento insertar en la base de datos y los caracteres acentuados me los inserta mal (Caracteres raros).
Lo primero que puenso es que la base de datos está usando Latin1 y se le envía datos en utf8, pero no es así. Resulta que los datos que recupero mediante request.getParameter(..) ya contienen esos caracteres raros.
Es decir, el problema reside en la comunicación entre el cliente y el servidor. Será que el cliente no envía bien los datos, o será que el servidor no los recoge bien.
Tras buscar y buscar en internet, probar soluciones de todo tipo (gracias, Alfredo) me encuentro lo que parece ser el origen del problema, pero no la solución.
Parece ser cuando se envía la información por post, el servidor de aplicaciones es incapaz de enterarse qué codificación está usando el navegador.
Los pasos que yo he seguido para que (por lo menos aparentemente, el tiempo lo dirá) funcione todo con UTF8 son los siguiente:
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<Connector acceptCount="100" connectionTimeout="20000"
disableUploadTimeout="true" port="8080" redirectPort="8443" maxSpareThreads="75"
maxThreads="150" minSpareThreads="25" URIEncoding="UTF-8">
</Connector>
Lo importante es el URIEncoding="UTF-8"
package com.acervera.commons.filtros;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class UTF8Filter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// Si no se especificar el encoding, le indicamos que use el utf-8. De lo contrario, usaría el iso-8859-1
if(request.getCharacterEncoding()==null) {
request.setCharacterEncoding("utf-8");
}
chain.doFilter(request,response);
}
public void destroy() {
}
}
Lo instalo en el web.xml asegurándome que es el primero de todos en ejecutarse (Es decir, lo mapeo el primero):
<web-app > <filter> <filter-name>UTF8Filter</filter-name> <filter-class>com.acervera.commons.filtros.UTF8Filter</filter-class> </filter> ............. <filter-mapping> <filter-name>UTF8Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ............. </web-app>
<action ............ > <forward name="elForward" path="/loquesea.jsp" /> <forward name="elForward2" path="/loquesea.do" /> </action>
ForwardConfig forwardConfig = mapping.findForward("elForward");
ActionRedirect redirect = new ActionRedirect(forwardConfig);
redirect.addParameter("param1","value1");
redirect.addParameter("param2","2");
redirect.addParameter("param3","3.0");
return redirect;
/** * Autentifica un usuario mediante un pool de conexiones y dos queries. * Se debe indicar en la inicialización:
* dataSourceName: Pool de conexiones. Ejemplo: jdbc/mypool * queryUser: * Query para obtener el password y el id del usuario logado. * Como primer y único parámetro de la query (la ?) será el nombre del usuario. * En la "select list", el primer campo será el ID del usuario y el segundo el campo con el password. * ejemplo: SELECT UserId, Password FROM USUARIO WHERE UserName=?; * queryRoles: * Query para obtener la lista de roles del usuario. * Como primer y único parámetro de la query (la ?) será el id del usuario, es decir, el primer campo de la select list de queryUser. * En la "select list", el único primer campo será el campo con el role. * ejemplo: SELECT RoleName FROM ROLES WHERE userId=?; * @author angel * */
<Listener
className = "org.apache.catalina.mbeans.ServerLifecycleListener"
debug = "0"
descriptors = "/com/acervera/commons/realm/mbeans-descriptors.xml"
/>
Una vez hecho esto, ya podemos usar nuestro Realm como comoes habitual.<Realm className="com.acervera.commons.realm.CustomQueryDataSourceRealm" localDataSource="true" dataSourceName="jdbc/INTRANETDB" queryUser="SELECT ID, PASSWORD FROM USUARIO WHERE CODIGO=?" queryRoles="SELECT ROLE FROM USUARIO_ROLE WHERE ID=?" />Configurar la aplicación para que use el Realm está ampliamente explicado en multitud de artículos en internet.
GRAVE: Begin event threw error
java.lang.NoClassDefFoundError: org/apache/catalina/realm/RealmBase
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
at org.apache.catalina.loader.StandardClassLoader.findClass(StandardClassLoader.java:485)
at org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClassLoader.java:820)
at org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClassLoader.java:721)
at org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClassLoader.java:803)
at org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClassLoader.java:721)
at org.apache.commons.digester.ObjectCreateRule.begin(ObjectCreateRule.java:252)
at org.apache.commons.digester.Rule.begin(Rule.java:200)
at org.apache.commons.digester.Digester.startElement
igester.java:1273)
at org.apache.catalina.util.CatalinaDigester.startElement(CatalinaDigester.java:65)
at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.commons.digester.Digester.parse
igester.java:1567)
at org.apache.catalina.core.StandardHostDeployer.install(StandardHostDeployer.java:488)
at org.apache.catalina.core.StandardHost.install(StandardHost.java:863)
at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:483)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:427)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:983)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:349)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1091)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:789)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1083)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:478)
at org.apache.catalina.core.StandardService.start(StandardService.java:480)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:2313)
at org.apache.catalina.startup.Catalina.start(Catalina.java:556)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
elegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:287)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:425)
04-jul-2005 3:58:31 org.apache.catalina.startup.HostConfig deployDescriptors
Después de buscar por internet y buscar y volver a buscar. Después de tirarme toda la noche dandole vueltas, encuentro la solución.<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
Copyright (C) 2005 Angel Cervera Claudio
Se puede distribuir libremente, siempre y cuando se haga referencia al documento original.