Creacion Servicios Web Restfull Con Wildfly V 1 1 PDF
Creacion Servicios Web Restfull Con Wildfly V 1 1 PDF
Creacion Servicios Web Restfull Con Wildfly V 1 1 PDF
Cree un nuevo login role que tenga como nombre producto y clave producto. Para
crear un nuevo login role haga click con el boton derecho del mouse en el men
[Login Roles] y seleccione [New Login Role].
Digite el nombre del role [Role name], para este caso producto.
Seleccione la ficha [Definition], digite el password (producto) y confrmelo
(producto), finalmente haga click en el boton [OK].
Para crear la base de datos, haga click haga click con el boton derecho del mouse
en el men [Databases] y seleccione la opcin [New Database].
En la ventana de [New Database], digite el nombre de la base de datos [Name] y
seleccione el propietario [Owner], finalmente haga click en el boton [OK].
Haga click en el boton de [Execute query], para insertar los registros en la tabla.
Para visualizar los datos, seleccione la tabla (producto) y haga click en el boton [Ver
datos] que se encuentra arriba en la barra de herramientas.
Para crear un nuevo proyecto en eclipse, haga click en el men [File], [New] y en la
opcin [Dynamic Web Project].
Al final debe tener los dos paquetes creados dentro de la carpeta [src].
Dentro del paquete org.comercio.producto debe crear tres clases:
Producto
ProductoLista
ProductoServicio
Para crear una clase haga click con el boton derecho del mouse en el paquete
[org.comercio.producto], seleccione [New] y finalmente haga click en [Class].
Repita esta operacin con las otras dos clases (ProductoLista y ProductoServicio),
al finalizar debe tener creadas las tres clases.
Dentro del paquete (org.comercio.utilidad) debe crear dos clases:
BaseDato
WebConfig
Para crear las clases haga click en el paquete [org.comercio.utilidad], [New] y
finalmente en [Class].
Al finalizar debe tener las dos clases (BaseDato y WebConfig) creadas dentro del
paquete [org.comercio.utilidad].
En la clase WebConfig digite el siguiente contenido.
package org.comercio.utilidad;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/servicios")
public class WebConfig extends Application {
// No methods defined inside
}
import java.sql.Connection;
import java.sql.DriverManager;
try{
Class.forName(driver);
conexion1 = DriverManager.getConnection(url, user, password);
}
catch(Exception e){
System.out.println("Error: " + e.toString());
}
return conexion1;
}
}
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="listing")
public class ProductoLista {
private List<Producto> items;
public ProductoLista(){
}
@XmlElement(name="data")
public List<Producto> getItems(){
return items;
}
}
El contenido de la clase ProductoServicio es el siguiente:
package org.comercio.producto;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.DELETE;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import org.comercio.utilidad.BaseDato;
@Path("/producto")
public class ProductoServicio {
@POST
@Path("/adicionar")
@Consumes({"application/json"})
@Produces("application/json")
public Response adicionar(Producto producto) {
BaseDato basedato = new BaseDato();
Connection conexion1 = null;
PreparedStatement sentenciaPreparada1 = null;
String sql = "";
String mensaje = "";
int insertados = 0;
try{
conexion1 = basedato.getConexion();
sentenciaPreparada1 = conexion1.prepareStatement(sql);
sentenciaPreparada1.setString(1, producto.getNombre());
sentenciaPreparada1.setDouble(2, producto.getPrecio());
insertados = sentenciaPreparada1.executeUpdate();
}
catch(Exception e){
System.out.println("Error: " + e.toString());
}
try{
conexion1 = basedato.getConexion();
sentenciaPreparada1 = conexion1.prepareStatement(sql);
sentenciaPreparada1.setString(1, producto.getNombre());
sentenciaPreparada1.setDouble(2, producto.getPrecio());
sentenciaPreparada1.setIn(3, codigo);
modificados = sentenciaPreparada1.executeUpdate();
}
catch(Exception e){
System.out.println("Error: " + e.toString());
}
//return Response.ok().entity(mensaje).build();
if(modificados > 0){
mensaje = "{\"mensaje\":\"Modificar OK\"}";
return Response.status(200).entity(mensaje).build();
}
else{
mensaje = "{\"mensaje\":\"Error al modificar\"}";
return Response.status(400).entity(mensaje).build();
}
}
@DELETE
@Path("/eliminar/{codigo}")
@Consumes({"application/json"})
@Produces("application/json")
public Response adicionar(@PathParam(value = "codigo") int codigo) {
BaseDato basedato = new BaseDato();
Connection conexion1 = null;
PreparedStatement sentenciaPreparada1 = null;
String sql = "";
String mensaje = "";
int eliminados = 0;
try{
conexion1 = basedato.getConexion();
sentenciaPreparada1 = conexion1.prepareStatement(sql);
sentenciaPreparada1.setInt(1, codigo);
eliminados = sentenciaPreparada1.executeUpdate();
}
catch(Exception e){
System.out.println("Error: " + e.toString());
}
@GET
@Path("/listar")
@Produces("application/json")
//@Produces("application/xml")
public ProductoLista getProductos() {
ArrayList lista = new ArrayList();
try{
conexion1 = basedato.getConexion();
sentencia1 = conexion1.createStatement();
rs1 = sentencia1.executeQuery(sql);
while(rs1.next()){
int codigo = rs1.getInt("pro_codigo");
String nombre = rs1.getString("pro_nombre");
double precio = rs1.getDouble("pro_precio");
producto.setCodigo(codigo);
producto.setNombre(nombre);
producto.setPrecio(precio);
lista.add(producto);
}
}
catch(Exception e){
System.out.println("Error: " + e.toString());
}
Para configurar la aplicacin en eclipse, haga click con el boton derecho del mouse
sobre el proyecto [comercio], seleccione la opcin [New] y finalmente haga click en
[Folder].
Verifique que la carpeta WebContent este vaca y que su contenido este ahora en
WebContent2. Haga click con el boton derecho del mouse sobre el folder
WebContent y seleccione la opcin de borrar [Delete].
Renombre la carpeta WebContent2 como WebContent, haga click con el boton
derecho del mouse sobre el folder WebContent2, seleccione la opcin renombrar
[Rename].
Digite el nuevo nombre [New name] (WebContent) y haga click en el boton [OK].
Configure eclipse para que al compilar las clases (archivos .java) grabe los
resultados (archivos .class) en la carpeta de publicaciones (WEB-INF/classes). Para
crear la carpeta de salida (WEB-INF/classes), haga click con el boton derecho del
mouse sobre la carpeta WEB-INF que est dentro de (WebContent), seleccione
[New] y finalmente haga click en [Folder].
En la ventana [New Folder] digite el nombre de la nueva carpeta (classes) y haga
click en el boton [Finish].
Para cambiar la carpeta de salida (donde se graban los archivos compilados .class),
haga click con el boton derecho del mouse sobre el proyecto (comercio) y seleccione
la opcin propiedades [Properties].
Para confirmar que desea hacer el cambio de la carpeta de salida y mover los
contenidos, haga click en el boton [Yes].
Para verificar que los archivos compilados (.class) estn en la carpeta de salida,
abra el explorador de archivos y navegue hasta las carpetas que representan los
dos paquetes creados (org.comercio.producto).
(/wildfly/standalone/deployments/comercio.war/WEB-INF/classes /org/comercio/producto).
(/wildfly/standalone/deployments/comercio.war/WEB-INF/classes /org/comercio/utilidad).
Abra una ventana de comandos (cmd para Windows o un terminal para Linux).
Para probar que la aplicacin web esta publicada abra el explorador de archivos y
navegue hasta la carpeta de publicaciones (/wildfly/standalone/deployments) y el
archivo de publicacin de la aplicacin debe haber cambiado la extensin de
dodeploy a deployed (comercio.war.deployed).
En el navegador digite la url del servicio web que permite listar todos los registros
de la base de datos a travs del mtodo HTTP GET
(http://localhost:8080/comercio/servicios/producto/listar).
La prueba de los servicios web la podemos hacer de diversas formas, para este
proyecto se utilizar la extensin de Chrome llamada Postman. Para instalar la
extensin, abra el administrador de extensiones (chrome://extensions) y haga click
en el enlace [Obtener ms extensiones].
Abra el Postman y pruebe los servicios web, seleccione el mtodo HTTP (GET),
digite la url (http://localhost:8080/comercio/servicios/producto/listar) y finalmente
haga click en el boton [Send]. En la seccin de resultados se puede observar el
estado de la peticin (Status 200 OK), el formato de salida (JSON) y los datos
enviados por el servidor de aplicaciones.
Para ver los encabezados de la respuesta [Headers] haga click en la ficha [Headers]
en la seccin de respuesta, aqu podemos ver la longitud del contenido (Content-
Length 258), el tipo de contenido (Content-Type application/json), el nombre
del servidor (Server WildFly/10), etc.
Para crear otra peticin haga click en el boton de nueva peticin [+].
Pruebe el servicio web para adicionar un producto, digite la url de la nueva peticin
(http://localhost:8080/comercio/servicios/producto/adicionar), seleccione el mtodo
HTTP (POST), haga click en la ficha Body, en la opcin [raw] y seleccione el tipo de
contenido [JSON (application/json)], digite el contenido a enviar, es decir el objeto
JSON {"nombre":"Nuevo Producto","precio":88500} y finalmente haga click en el
boton [Send]. Observe la respuesta del servidor [Status 200 OK], tipo de contenido
[JSON] y el contenido de la respuesta {"mensaje":"Insertar OK"}.
Para comprobar que se est grabando en la base de datos, en el administrador de
la base de datos (pgAdmin3), haga click con el boton derecho del mouse en la tabla
producto, seleccione el men Ver datos [View Data] y la opcin Ver las primeras
100 filas [View Top 100 Rows].
En la ventana de datos se puede ver el nuevo registro insertado.
Otra forma de comprobar los resultados de las operaciones es volver a listar los
datos, llamando de nuevo al servicio web de producto/listar.
Pruebe el servicio web para modificar un producto, digite la url de la nueva peticin
(http://localhost:8080/comercio/servicios/producto/modificar/5), el 5 corresponde al
codigo del producto que se desea modificar, seleccione el mtodo HTTP (PUT),
haga click en la ficha Body, en la opcin [raw] y seleccione el tipo de contenido
[JSON (application/json)], digite el contenido a enviar, es decir el objeto JSON {
"nombre":"Pijama","precio":49200}) y finalmente haga click en el boton [Send].
Observe la respuesta del servidor [Status 200 OK], tipo de contenido [JSON] y el
contenido de la respuesta {"mensaje": "Modificar OK"}.
Compruebe que el registro ha sido modificado, ejecute de nuevo el servicio web de
listar (producto/listar).
Pruebe el servicio web para eliminar un producto, digite la url de la nueva peticin
(http://localhost:8080/comercio/servicios/producto/eliminar/1), el 1 corresponde al
codigo del producto que se desea eliminar, seleccione el mtodo HTTP (DELETE)
y finalmente haga click en el boton [Send]. Observe la respuesta del servidor [Status
200 OK], tipo de contenido [JSON] y el contenido de la respuesta {"mensaje":
"Eliminar OK"}.
4. CREACION DEL CLIENTE REST CON JAVASCRIPT
La librera RestEasy permite crear de una manera fcil el cliente rest en JavaScript
para los servicios web que se han creado. Adicione el codigo para registrar el Servlet
JSAPI en el archivo de configuracin de la aplicacin (WEB-INF/web.xml).
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>comercio</display-name>
<servlet>
<servlet-name>RESTEasy-JSAPI</servlet-name>
<servlet-class>org.jboss.resteasy.jsapi.JSAPIServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RESTEasy-JSAPI</servlet-name>
<url-pattern>/rest-api.js</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
Cree una carpeta js dentro del folder WebContent y adicione en ella un archivo
JavaScript (producto.js) con el siguiente codigo:
$(function() {
var dialog, form;
function editar(accion) {
var codigo = "0";
var nombre = "";
var precio = "";
if (accion != "Adicionar") {
codigo = table.row('.selected').data().codigo;
nombre = table.row('.selected').data().nombre;
precio = table.row('.selected').data().precio;
}
document.getElementById("accion").value = accion;
document.getElementById("codigo").value = codigo;
document.getElementById("nombre").value = nombre;
document.getElementById("precio").value = precio;
dialog.dialog("open");
}
function ejecutar() {
var accion = document.getElementById("accion").value;
if (accion == "Adicionar") {
adicionarProducto();
}
if (accion == "Modificar") {
modificarProducto();
}
if (accion == "Eliminar") {
eliminarProducto();
}
}
function adicionarProducto() {
// Collect input from html page
var nombre = document.getElementById("nombre").value;
var precio = document.getElementById("precio").value;
function modificarProducto() {
// Collect input from html page
var codigo = document.getElementById("codigo").value;
var nombre = document.getElementById("nombre").value;
var precio = document.getElementById("precio").value;
var r = new REST.Request();
r.setURI(REST.apiURL + "/producto/modificar/" + codigo);
r.setMethod("PUT");
r.setContentType("application/json");
r.setEntity({
nombre : nombre,
precio : precio
});
r.execute(function(status, request, entity) {
mostrarRespuesta(entity);
});
}
function eliminarProducto() {
// Collect input from html page
var codigo = document.getElementById("codigo").value;
function mostrarRespuesta(entity){
table.ajax.reload();
dialog.dialog("close");
document.getElementById("dialogo-mensaje").innerHTML = "<p>"
+ entity.mensaje + "</p>";
$("#dialogo-mensaje").dialog({
modal : true,
buttons : {
Ok : function() {
$(this).dialog("close");
}
}
});
}
dialog = $("#dialog-form").dialog({
autoOpen : false,
height : 360,
width : 640,
modal : true,
buttons : {
"Ejecutar": {
id: 'boton',
text: 'Ejecutar',
click: function () {
ejecutar();
}
},
Cancel : function() {
dialog.dialog("close");
}
},
close : function() {
form[0].reset();
}
});
form = dialog.find("form").on("submit", function(event) {
event.preventDefault();
ejecutar();
});
$("#adicionar").button().on("click", function() {
editar('Adicionar');
});
$("#modificar").button().on("click", function() {
editar('Modificar');
});
$("#eliminar").button().on("click", function() {
editar('Eliminar');
});
});
Cree una carpeta css dentro del folder WebContent y adicione en ella el archivo
css (estilo.css) con el siguiente contenido.
label, input {
display: block;
}
input.text {
margin-bottom: 12px;
width: 95%;
padding: .4em;
}
fieldset {
padding: 0;
border: 0;
margin-top: 25px;
}
h1 {
font-size: 2.2em;
margin: .6em 0;
}
Dentro de la carpeta WebContent cree el archive index.jsp con el siguiente
contenido.
<%@ 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>Insert title here</title>
<!-- This will include the whole javascript file including ajax handling -->
<script lang="javascript" src="rest-api.js"></script>
<link rel="stylesheet"
href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
<script type="text/javascript"
src="https://code.jquery.com/jquery-1.12.0.min.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<script type="text/javascript"
src="https://cdn.datatables.net/1.10.11/js/jquery.dataTables.min.js"></script>
<link rel="stylesheet"
href="https://cdn.datatables.net/1.10.11/css/jquery.dataTables.min.css">
<link rel="stylesheet"
href="css/estilo.css">
<script type="text/javascript" src="js/producto.js"></script>
</head>
<body>
<h1>GESTION DE PRODUCTOS</h1>
<div style="float: right;">
<input type="button" value="Adicionar" id="adicionar" />
<input type="button" value="Modificar" id="modificar" />
<input type="button" value="Eliminar" id="eliminar" />
</div>
<!
Allow form submission with keyboard without duplicating
The dialog button
-->
<input type="submit" tabindex="-1"
style="position: absolute; top: -1000px">
</fieldset>
</form>
</div>
</body>
</html>
La aplicacin web creada permite la gestin de los productos (CRUD, Create, Read,
Update, Delete) empleando los servicios web tipo RESTful.
Para modificar un registro, seleccione la fila (registro) que desea modificar, haga
click en el boton [Modificar], los datos actuales del registro seleccionado se cargaran
en el formulario, cambie los datos y finalmente haga click en el boton [Ejecutar].
JQuery tiene una gran cantidad de temas y estilos que puede utilizar, por ejemplo
pruebe con este tema.
<link rel="stylesheet"
href="http://code.jquery.com/ui/1.11.4/themes/ui-lightness/jquery-ui.css">
Obtendr como resultado una apariencia diferente.