Android desde cero

Anímate a realizar con el Android Studio tu primera aplicaión móvil

Abre el eclipse y escribe el mas simple "Hola Mundo!"con Spring MVC

Sigue 8 simples pasos para obtener al proyecto mas simple de Spring MVC con Eclipse y Maven.

Como subr una app al Google Play

Te mostramos en tres post, como subir una app en Android al Google Play

Mostrando entradas con la etiqueta tomcat7. Mostrar todas las entradas
Mostrando entradas con la etiqueta tomcat7. Mostrar todas las entradas

domingo, 20 de septiembre de 2015

Proyecto myApiRest en GitHub con Eclipse

Vamos a subir un proyecto simple a GitHub con una API Rest muy básica, que tenga un interceptor y Spring MVC

Utilizamos
La versión inicial del myApiRest.war para los que quieran seguir el post, se encuentra en la siguiente dirección de dropbox:


La evolución del myApiRest.war la realizaremos en GitHub

Comencemos:

Tomamos el war de myApiRest.war y lo importamos en el eclipse, como un nuevo proyecto maven:


Además ejecutamos, run > maven install que nos trae las dependencias y complica el proyecto.






Observemos el pom.xml que contiene el plugin de Tomcat, con lo cual, vamos a ejecutar el war y realizar algunas invocaciones:


  org.apache.tomcat.maven
  tomcat7-maven-plugin
  2.2



Para probar el proyecto, agregamos una nueva configuración al eclipse, equivalente a:

mvm tomcat7:run



Lo cual nos permitirá consumir algunas URL del WAR, después de ejecutar el tomcat7:run que configuramos






Podemos hacer lo mismo para utilizar Jetty en vez del Tomcat.


  org.eclipse.jetty
  jetty-maven-plugin
  9.3.7.v20160115

  
    10
    
      /myApiRest
    
    
      8080
    
  



Ok, con jetty levantado, también podemos invocar  a las url anteriores.

En esta primera versión, tenemos el ejemplo funcionando, con spring MVC, un interceptor, y además está swagger incorporado al proyecto.

Probando el WAR

Invocamos a uno de los controladores de spring

http://localhost:8080/myApiRest/javaBookManager/

Observamos en el log, que el controlador responde, además que el interceptor también lo captura.

El error que muestra es recién en la respuesta, porque intentamos retornar una respuesta JSON y nos falta incluir a jackson al proyecto



Las dependencias a agregar al pom.xml son las siguientes:
    
        com.fasterxml.jackson.core
        jackson-core
        2.2.3
    
    
        com.fasterxml.jackson.core
        jackson-databind
        2.2.3
    
    
        com.fasterxml.jackson.core
        jackson-annotations
        2.2.3
    

Y vemos el resultado, donde se recupera el JSON, a su vez, en el log podemos ver al interceptor trabajando:




Clases Java - Controller y @ResponseBody

Si bien el ejercicio completo está en GitHub en:


Vamos a mencionar un par de componentes Java: Observemos el  @ResponseBody para convertir las respuestas a JSON

   

package com.javaen.web;

import java.util.Collection;

import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import com.javaen.business.BookManagerService;
import com.javaen.domain.JavaBook;


/**
 * @author [Pablo Ezequiel]
 *
 * REST API Book Manager
 * 
 *  - getAll
 *  - {id}
 *  - update (string, book)
 *  - add() 
 * 
 *   http://localhost:8080/myApiRest/javaBookManager/
 *   http://localhost:8080/myApiRest/javaBookManager/001
 *
 *   http://localhost:8080/myApiRest/swagger-ui/index.html
 */

@Controller
@RequestMapping("/javaBookManager")
public class BookManagerController {
 
 static final Logger LOG = LoggerFactory.getLogger(BookManagerController.class);

 @Autowired BookManagerService bookManagerService;
 
 @RequestMapping(value="/{id}",method=RequestMethod.GET)
 public  @ResponseBody JavaBook get(@PathVariable String id) {
  
  LOG.debug("BookManagerController::get("+id+")");
  
  JavaBook book = bookManagerService.get(id);
  
  LOG.debug("Book("+id+"): " + book);
  
  return book;
 }
 

 @RequestMapping(method=RequestMethod.GET)
 public  @ResponseBody  Collection select() {
  LOG.debug("BookManagerController::getAll()");
  
  Collection books =  bookManagerService.getAll();
  
  LOG.debug("BookManagerController select(): " + books);
  
  return books;
 }

 @RequestMapping(value="/{id}",method=RequestMethod.PUT)
 @ResponseStatus(HttpStatus.NO_CONTENT)
 public void update(@PathVariable String id, @RequestBody JavaBook book) {
  
  LOG.debug("BookManagerController::update("+id+","+book+")");
  
  book.setId(id);
  bookManagerService.update(id, book);
 }

 
 @RequestMapping(method=RequestMethod.POST)
 @ResponseStatus(HttpStatus.CREATED)
 public void add(@RequestBody JavaBook book, HttpServletResponse response) {
  
  LOG.debug("BookManagerController::add("+book+")");
  
  bookManagerService.add(book);
 } 
 
}



Con esto damos finalizado el ejercicio de un proyecto con Spring MVC para una hacer una API REST

Se deja el siguiente TAG en GitHub para el que le interese recuperar el estado de esta versión:

https://github.com/PabloEzequiel/Java/releases/tag/v1.0.1


En un próximo post, el objetivo será que swagger levante la info de la API Rest para documentarla.


Un poco de Feedback


  • ¿Pudieron hacer funcionar el ejemplo?



sábado, 4 de julio de 2015

¿Como es un proyecto simple de SpringMVC en Eclipse con Maven y Tomcat?

Veamos como podemos armar el proyecto mas simple posible de Spring MVC utilizando Eclipse, Maven y Tomcat.


Versiones:

  • Eclipse (Eclipse Luna 4.4.1)
  • Maven (Apache Maven 3.3.3)
  • Tomcat (Apache Tomcat 7.0.62)
  • Java (jdk1.8.0_20)
  • Spring MVC (4.1.1.RELEASE)


Paso 01: Creamos un Dynamic Web Project


En Eclipse Luna creamos un nuevo proyecto web de la siguiente manera:



 
Utilizamos para el proyecto el nombre enSpringMVC_v001 y presionamos el botón “Finish”



Paso 02: Convertimos al Proyecto Web un Proyecto Maven


En eclipse esto se logra con un click derecho sobre el proyecto y eligiendo: Project > Configure > Convert to Maven Project





Nos muestra la siguiente pantalla, que está Ok, con lo cual no modificamos ningún valor:





Luego, una vez creado el pom.xml le vamos a agregar dependencias:




Podremos agregar dependencias en el pom.xml presionando el botón “Add... “





Las dependencias que buscaremos incorporar son las siguientes:


  • Spring Framework: versión 4.1.1.RELEASE
  • Servlet JSTL: versión 1.2
  • Log con Logback: versión 1.0.13








En el pom.xml sería como sigue, Igual dejaremos que el eclipse sea quien edite el pom.xml


Para Spring Framework: versión 4.1.1.RELEASE


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.1.RELEASE</version>
        </dependency>


Para Servlet JSTL: versión 1.2

1
2
3
4
5
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency> 

Para Log con Logback: versión 1.0.13

1
2
3
4
5
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.13</version>
        </dependency>

Comenzamos agregando las dependencias con el Eclipse:

Primero Spring Framework: versión 4.1.1.RELEASE




Y seguimos agregando las dependencias anteriormente mencionadas hasta que llegamos a la última:


Dependencia Log con Logback: versión 1.0.13





El pom.xml que nos genera el eclipse queda de la siguiente manera:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>enSpringMVC_v01</groupId>
 <artifactId>enSpringMVC_v01</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>war</packaging>
 <build>
  <sourceDirectory>src</sourceDirectory>
  <plugins>
   <plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
     <warSourceDirectory>WebContent</warSourceDirectory>
     <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
   </plugin>
   <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.3</version>
    <configuration>
     <source>1.8</source>
     <target>1.8</target>
    </configuration>
   </plugin>
  </plugins>
 </build>
 <dependencies>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>4.1.1.RELEASE</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-aop</artifactId>
   <version>4.1.1.RELEASE</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>4.1.1.RELEASE</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-web</artifactId>
   <version>4.1.1.RELEASE</version>
  </dependency>

   <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>jstl</artifactId>
   <version>1.2</version>
  </dependency>

   <dependency>
   <groupId>ch.qos.logback</groupId>
   <artifactId>logback-classic</artifactId>
   <version>1.0.13</version>
  </dependency>
 </dependencies>
</project>

Paso 03: Agregamos el archivo XML de beans de Spring 


Creamos el archivo XML para definir los beans de spring. Por convención (convention over configuration) tenemos que nombrarlo  javaen-servlet.xml para que spring lo encuentre dentro del WEB-INF:


LA convención se debe a que en el web.xml utilizamos el nombre del servlet de spring javaen
<servlet-name>javaen</servlet-name>


Desde el eclipse > New XML File




Lo creamos vacío presionando Finish y hacemos copy&paste de este sencillo xml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:p="http://www.springframework.org/schema/p"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
 
 <context:component-scan base-package="com.javaen.controller" />
 
 <bean id="viewResolver"
  class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  <property name="viewClass"
   value="org.springframework.web.servlet.view.JstlView" />
  <property name="prefix" value="/WEB-INF/jsp/" />
  <property name="suffix" value=".jsp" />
 </bean>
</beans>


Como se puede observar, ya estamos definiendo dónde vamos a dejar los Controller de Spring, o sea dentro del paquete com.javaen.controller


Y también donde vamos a dejar las “vistas”, o sea las páginas JSP que alojaremos dentro del directorio /WEB-INF/jsp/







Paso 04: Agregamos el web.xml al proyecto web


A continuación, generamos el web.xml si no está en nuestro proyecto. En nuestro caso, no está con lo cual lo tuvimos que agregarlo:


Hacemos click con el botón derecho del mouse sobre nuestro Proyecto y elegimos:


Java EE Tools > Generate Deployment Descriptor Stub





Editamos al web.xml para agregar al DispatchServlet de Spring

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<web-app 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
  version="3.0">
  <display-name>enSpringMVC_v01</display-name>

     <servlet>
        <servlet-name>javaen</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>javaen</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
      
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>






Paso 05: Creamos nuestro primer Controller de Spring






Y después de presionar el botón Finish obtenemos nuestra clase Java sobre la cual copiaremos el siguiente código que define el controller de Spring con sus anotaciones:


HelloController.java


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.javaen.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

 /**
 * @author [Pablo Ezequiel]
 *
 */
@Controller
public class HelloController {
 
 @RequestMapping("/helloController")
 public ModelAndView helloController() {
 
  String message = "<br>"
          +"<div style='text-align:center;'>"
    +"<h2>Hola Mundo Spring MVC!</h2>"
    +"Mensaje del Controller de Spring"
    +"</div><br><br>";
  
  return new ModelAndView("respuesta", "message", message);
 }
}


Compartimos a continuación la imagen de la clase HelloController en el eclipse





A continuación crearemos las páginas JSP

Paso 06: Creamos las vistas en páginas JSP



Vamos a crear a dos páginas JSP:


  • index.jsp Una para dar la bienvenida
  • respuesta.jsp para ser accedida a través del controller de Spring MVC


Contenido de la página index.jsp de bienvenida:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Hola Spring MVC</title>
</head>
<body>

 <br>Primera aplicación con Spring MVC
<br> 
<a href="helloController.htm">Click para un nuevo mensaje de bienvenida</a>
</body>
</html>




Creación de la página respuesta.jsp en el directorio WEB-INF/jsp para alojar las vistas:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Hola Spring MVC</title>
</head>
<body>

 Hola! Soy la respuesta con el Mensaje desde el controller:
<br>
${message} 

 </body>
</html>

Veamos las pantallas en el Eclipse:




Paso 07: Revisamos la estructura del proyecto

La estructura del proyecto debería verse de la siguiente manera:

Resaltamos con el marcado amarillo a los componentes mas importantes:





Paso 08: Agregamos el proyecto web al Tomcat


Con el botón derecho sobre el servidor Tomcat nos aparece el diálogo que nos permite agregar a nuestra aplicación web al Tomcat con “Add and Remove …”



A continuación podemos iniciar el servidor web Tomcat habilitando a nuestro proyecto enSpringMVC_v001 a brindar servicio:





Con el Tomcat levantado, accedemos a la URL donde nuestro proyecto enSpringMVC_v001 está escuchando:







Y ahora:





Referencias:

El artículo estuvo basado en el tutorial http://crunfy.me/1FI1eHD  del blog de java http://crunchify.com/  


Descargar el código de GitHub:

Pueden descargar el código de este ejemplo en el repositorio de GitHub del Blog


Un poco de Feedback...

¿Pudieron seguir todos los pasos?
¿De que manera les gustaría ampliar el contenido de este artículo?