martes, 15 de julio de 2008

JDeveloper

Al ejectutar el archivo ejecutable "jdeveloper.exe" nos pedirá un path, que será "C:\Archivos de programa\Java\jdk1.6.0_06\bin\java.exe".
Una vez llegados a abrir el programa, creamos una nueva aplicación tal que así.

...Aceptamos.
Ahora menú contextual en la carpeta "Web content/new/JSF". Aceptar. El nombre del archivo a crear: "prueba1.jspx". Le decimos que no al Backing Bean:


..y siguiente hasta el final.

Vemos una de las ventanitas que se llama "Component Palette", que es donde se encuentra la lista de componentes para cada tipo de página. Nosotros seleccionamos para "JSF-HTML". PAra incluir un componente en una vista sólo arrastramos el componente que queramos a la misma, estando ésta en modo Design.

Ahora vamos a crear otro JSF (prueba2) pero esta vez con respaldo de bean (Backing Bean):

..esto te genera automáticamente un paquete y un Bean en la carpeta "Application Sources". Ahora, todo lo que vayamos modificando en el .jspx está relacionado con el bean. Si creamos un textBox, un boton, o lo que sea, el Bean se modifica; si modificamos las propiedades, también se modifica. Por ejemplo, si en un boton, le modificamos la propiedad "Action", aparecerá un método automaticamente en el Bean con el nombre que le hayamos puesto.

martes, 8 de julio de 2008

+ Spring MVC

Para ver lo que está pasando por debajo de la ejecución en el proyecto de ayer (Eticom-libreria-web), es decir, que aparezca por consola lo que está sucediendo en cuanto a las consultas SQL de Hibernate a la Base de datos, hay que modificar la propiedad "hibernateProperties" del bean "SessionFactory" en el archivo "applicationContext-hibernate.xml" añadiéndole una propiedad:

<prop key="hibernate.show_sql">true</prop>

Y ahora, continuando con el proyecto de ayer (Eticom-libreria-web), en la salida por pantalla de los "libros.html" vamos a añadir una nueva columna para que nos muestre solamente los libros del autor seleccionado, esto tiene que ocurrir en la página "capitulosDeLibro.html", para lo cual enviamos en el enlace, el id del autor del que queramos sus libros: "http://localhost:8080/capitulosDeLibro.html?id=2".

Para que al enviar el id del objeto de nuestra tabla sea recogido en el controlador de la solicitud, hay que realizar dicha solicitud y recogerla en un método de nuestro controlador, anotado con la etiqueta "@RequestMapping("/pathCorrespondiente.html")". Luego hay que incluir otra anotación dentro del parámetro para poder recogerlo (en mi caso el 'id'):
@RequestMapping("/capitulosDeLibro.html")
public String listadoCapitulosDeLibro(ModelMap model, @RequestParam(value="id", required=true) Long id){
Session session = getSessionFactory().openSession();
Libro libro = (Libro) session.get(Libro.class,id);
model.addAttribute("capitulos", libro.getCapitulos());
// session.close();

return "listaCapitulos";
}
Nota: se puede apreciar que no se cierra la sesión porque, como ocurría ayer, si se cierra entonces ya no te permite acceder a otra consulta en la base de datos.
Nota2: vemos que la etiqueta "@RequestParam" puede tiene dos parámetros, 1) el "value", que es el nombre del parámetro que se recibe por la barra de direcciones (en este caso el "id"), y 2) el "required" que indica si el parámetro va a ser obligatorio o no (true por defecto, o false). Se podrían omitir dichos parámetros porque en este caso el parámetro es obligatorio, con lo que la cabecera del método quedaría asi:
"public String listadoCapitulosDeLibro(ModelMap model, @RequestParam Long id){...}".

Bueno, ahora vamos a añadirle la nueva columna en la vista "listaLibros.jsp" donde aparezcan los capitulos de cada libro. Así que en esta vista le añadimos un nuevo "display:column" pero que cierre la etiqueta con otra etiqueta del mismo tipo para poder incluir en medio, el codigo HTML que queramos:
<display:table name="libros" class="table" requestURI="" id="librosList" export="true" pagesize="10">
...
<display:column>
<a href="/capitulosDeLibro.html?id=${librosList.id}" />
</display:column>
</display:table>
Nota: en el display:table, el "name" es el nombre de la colección que se va a representar en la tabla y el "id" es la variable/objeto que empleamos en cada pasada del bucle.

Enlace al foro sobre esto

######## Formularios de Búsqueda ########

pendiente.

lunes, 7 de julio de 2008

Spring MVC

Nos descargamos el proyecto "eticom-libreria-hibernate-xml" y el "eticom-libreria-spring", que se basa en SPRINGFramework, y trabaja con SpringMVC. No hace falta trabajar con ambas herramientas.

En AppFuse.org, es una aplicación que genera un archivo Ant o un comando Maven para generar proyectos vacíos que emplean/integran otras herramientas, pero ya preparados.

Al arrancar la aplicación intentará arrancar Hibernate teniendo en cuenta una serie de archivos, como "src/main/resources/jdbc.properties", "src/main/webapp/WEB-INF/applicationContext-hibernate.xml" o "src/main/resources/import.sql".

En "applicationContext-hibernate.xml" le inidicamos los archivos de mapeo. Los mapeos pueden provenir de distintos lugares o proyectos. En este proyecto vemos como unos vienen de un paquete y otros.. (MP3).

Como he dicho, "src/main/webapp/WEB-INF/applicationContext-hibernate.xml" arranca con la aplicación, y genera el "dataSource" y el "sessionFactory".
Es Spring el que se encarga de crearlos.

El problema del MVC se soluciona mediante anotaciones. Para el controlador "@Controller". Por cada petición web, hay que poner una anotación "@RequestMapping("/libros.html")", al que le sigue un método public String solicitud(ModelMap model){}, que devuelve una lista (en este caso de libros).
Spring MVC también proporciona una serie de tags de librerías, que se encuentran en "taglibs.jsp":

<%@ taglib uri="http://www.springmodules.org/tags/commons-validator" prefix="v" %> <%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %> <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>

También tenemos un escuchador/listener que se encarga de leer la configuración de Spring, es decir, arranca el SpringFramework (se encuentra en el "web.xml"):

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Hay que indicar el lugar donde se van a encontrar los controladores, así como la forma de inyección de recursos. Ambos se harán mediante anotaciones:

<!-- Activates mapping of @Controller -->
<context:component-scan base-package="eticom.libreria.web"/>

<!-- Activates @Autowired for Controllers -->
<context:annotation-config/>

--------------------

Vamos a poner esto en práctica en el proyecto "eticom-libreria-web".

jueves, 3 de julio de 2008

Seguimos con Struts

Vamos a crear un nuevo proyecto Maven (eticom-discografica-hibernate) del mismo modo que creamos un nuevo proyecto Maven (info aquí), al que le vamos a pasar, del proyecto "eticom-discografica-servlet-JSTL", las clases Cantante, Disco y Cancion, así como la carpeta "src/main/resources", del cual nos quedamos con 'hibernate-properties', 'import.sql' y 'log4j.xml', los cuales guardamos en "src/test/resources". También le borramos los paquetes que se crean automáticamente cuando creamos un nuevo proyecto maven. Seguidamente le hacemos un package-install.

Del "eticom-discografica-servlet-JSTL" borramos el paquete contenedor de las clases, y le hacemos una dependencia del proyecto que acabamos de crear (eticom-discografica-hibernate). Si nos da error, probar cerrando este proyecto, o desmavenizando y mavenizando de nuevo.

Nos descargamos el proyecto del repositorio "eticom-club-struts-basico".

Internacionalización (i18n) en Struts
Si abrimos el web.xml del proyecto, en...

<context-param>
<param-name>
javax.servlet.jsp.jstl.fmt.localizationContext
</param-name>
<param-value>Traducciones</param-value>
</context-param>

...lo que carga es el archivo "Traducciones.properties" que se encuentra en "src/main/resources", que es donde están nuetras traducciones.
Luego en "layout.jsp" hay que importar una librería de 'tags-bean' y con prefijo 'bean', para que podamos sacar la traducción a través de la etiqueta 'message':

<bean:message key="label.header" /
>

-------------------------

Existen dos tipos de etiquetas struts:
¿Cómo validar los datos de un ActionForm de Struts -formulario-?
ActionForm contiene un método 'validate()', y lo que tenemos que hacer es sobreescribir este método en nuestra clase formulario, en este caso en 'SaludoForm.java'.

Esto sirve para que el formulario, si no está correctamente definino, no llegue a acceder a la base de datos, es decir, que no lance el Action (SaludoAction).

-----------------------

Ahora estamos en 'struts-config.xml':
Si hacemos ctrl+espacio entre las etiquetas form-beans y action-mapping, nos ofrece 'global-forwards', que sirve para no repetir código, es decir, que si queremos que todas las acciones que nos devuelvan la palabra "error" nos envíen a "error.jsp", lo hacemos añadiendo la siguiente etiqueta:
<global-forwards>
<forward name="error" path="/error.jsp"></forward>
</global-forwards>
-------------------------

Si queremos hacer un plugin, solo tenemos que crear una clase que implemente a 'plugin'.

miércoles, 2 de julio de 2008

Descargando librerías para Struts. Struts2 y Appfuse

Bueno, en primer lugar voy a descargarme las librerías necesarias para el buen trabajo con struts2. para lo cual tenemos que abrir nuestra consola e irnos al directorio workspace:

Para generar con MAVEN una App con Struts2

c:\>cd workspace

c:\>mvn archetype:create -DgroupId=eticom -DartifactId=eticom-struts2-servlet -DarchetypeGroupId=org.apache.struts -DarchetypeArtifactId=struts2-archetype-starter -DarchetypeVersion=2.0.5-SNAPSHOT -DremoteRepositories=http://people.apache.org/repo/m2-snapshot-repository

c:\>cd eticom-struts2-servlet
c:\>mvn jetty:run-war (comando empleado para el despliegue)

Para generar con MAVEN una App con Struts y Appfuse

c:\>cd workspace

c:\>mvn archetype:create -DgroupId=eticom -DartifactId=eticom-appfuse-struts2-servlet -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-struts -DarchetypeVersion=2.0 -DremoteRepositories=http://repo1.maven.org/maven2

c:\>cd eticom-struts2-servlet
c:\>mvn jetty:run-war