miércoles, 11 de agosto de 2010

Ejemplo completo con JSTL(core,xml, function,sql,format)

Para este ejemplo estoy utilizando Ubuntu 10.04 y Netbeans version 9
Primeramente creamos un nuevo proyecto web en Netbeans, lo llamaremos JSTL .

Además utilizaremos el servidor Glassfish V3 y damos click en Finish

Una vez hecho esto damos boton derecho sobre el proyecto y seleccionamos properties

Luego la opción Libraries y damos click en Add Library. Ahi seleccionamos JSTL 1.1 y luego damos click en Add Library y OK. Esto es para dar el soporte de JSTL a nuestro proyecto.

Ahora tenemos que crear una base de datos en Derby para conectar nuestra aplicacion JSTL a una base de datos
Seleccionamos Services, luego Databases.

Luego sobre JavaDB, seleccionamos Create Database
Le damos el nombre ejemplo, con el user usuario1 y la clave usuario1 y damos click en ok
Luego seleccionamos la conexion, nos conectamos.
abrimos APP y damos botón derecho sobre tables y seleccionamos CREATE TABLE.
Entonces creamos una tabla llamada Clientes.
Con los campos Id de tipo Integer, Nombre del tipo varchar(20) y Direccion del tipo varchar(20)





Con esto tenemos creada una base de datos, con la que vamos a interactuar cuando usemos JSTL con SQL


Luego de esto abrimos index.jsp , que tendrá enlaces a pagainas y Servlets con funcionalidades de JSTL.

En index.jsp vamos a colocar el siguiente codigo:
- Una referencia a JSTL
- Declaración de varaibles
- Visualización de esas variables

Todo esto corresponde al siguiente código:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<c:set var="opcion1" value="Mapa"/>
<c:set var="opcion2" value="Funciones.jsp"/>
<c:set var="opcion3" value="Formatos"/>
<c:set var="opcion4" value="SQL.jsp"/>
<c:set var="opcion5" value="XML.jsp"/>
<c:out value="Seleccione una opción:"/><br/>
<a href='<c:url value="${opcion1}"/>'>${opcion1}</a><br/>
<a href='<c:url value="${opcion2}"/>'>${opcion2}</a><br/>
<a href='<c:url value="${opcion3}"/>'>${opcion3}</a><br/>
<a href='<c:url value="${opcion4}"/>'>${opcion4}</a><br/>
<a href='<c:url value="${opcion5}"/>'>${opcion5}</a><br/>
</body>
</html>


Una vez hecho esto, tenemos que crear el sisguiente paquete:com.ejemplo
Este paquete contendrá dos servlets
Mapa.java: Este servlet crea un mapa simple, coloca valores y luego usando un dispatcher, los envia a otra página, acontinuación coloco el método processRequest:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
List<Map<String,String>> listadoPersonas=new ArrayList<Map<String,String>>();
for(int i=0;i<10;i++){
Map<String, String> persona=new HashMap<String,String>();
persona.put("id", String.valueOf(i));
persona.put("nombre", "persona"+i);
persona.put("direccion", "direccion"+i);
listadoPersonas.add(persona);
}
RequestDispatcher rd = request.getRequestDispatcher("VerMapa.jsp");
request.setAttribute("personas", listadoPersonas);
rd.forward(request, response);
} finally {
out.close();
}
}

Tambien creamos otro servlet dentro del mismo paquete que se llamará Formatos.java

Este servlet, no permite colocar una fecha en el request y un numero a los que se les aplicará un formato:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
Double valor=100000d/3d;
Date fecha= new Date();
RequestDispatcher rd = request.getRequestDispatcher("VerFormatos.jsp");
request.setAttribute("numero", valor);
request.setAttribute("fecha", fecha);
rd.forward(request, response);
} finally {
out.close();
}
}

También vamos a crear un archivo de propiedades llamado app.properties, que se encontrará junto al directorio com, de nuestro código fuente, el archivo de propiedades debe tener el siguiente contenido:
ejemplo1=prueba1
ejemplo2=prueba2
ejemplo3=prueba3


Hecho esto vamos a crear una página para ver el mapa que la llamaremos VerMapa.jsp
Esta pagina hace una llamada a JSTL y relaiza una iteración, creando una tabla de HTML:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<table border="1">
<tr>
<td>ID</td>
<td>NOMBRE</td>
<td>DIRECCION</td>
</tr>
<c:forEach var="persona" items="${personas}">

<tr
<c:choose>
<c:when test="${persona.id mod 2==0}"> bgColor="#FF0000"</c:when>
<c:when test="${persona.id mod 3==0}"> bgColor="#00FF00"</c:when>
<c:otherwise> bgColor="#0000FF"</c:otherwise>
</c:choose>
>
<td>${persona.id}</td>
<td>${persona.nombre}</td>
<td>${persona.direccion}</td>
</tr>
</c:forEach>
</table>
</body>
</html>


Ahora vamos a crear una tabla llamada VerFormatos.jsp
Esta tabla coloca un locale y aplica un formato a la fecha y numero colocados en el Servlet, además carga la información del archivo de propiedades llamado app que se encuentra junto al directorio com de nuestros paquetes

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<fmt:formatDate pattern="dd/MM/yyyy" value="${fecha}"/><br/>
<fmt:setLocale value="es_EC"/>
${numero}<br/>
<fmt:formatNumber pattern="###,###.###" value="${numero}"/><br/>
<fmt:bundle basename="app">
<fmt:message key='ejemplo1'/><br/>
<fmt:message key='ejemplo2'/><br/>
<fmt:message key='ejemplo3'/><br/>
</fmt:bundle>

</body>
</html>


Ahora vamos a crear la página llamada Funciones .jsp, esta página tiene las siguientes características:
- Carga una referencia al jslt encargado de usar funciones
- Usa ciertas funciones en una variable

El código es el siguiente:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<c:set var="cadena" value="Esta es una prueba"/>

Replace:${fn:replace(cadena,"a","A")}<br/>
Split: <c:forEach var="num" items="${fn:split(cadena, ' ')}">
<c:out value="${num}"/><br/>
</c:forEach>

Starts With:<c:if test="${fn:startsWith(cadena,'Esta es')}">
Puede ser: Esta es una cadena
</c:if>
</body>
</html>


Ahora tenemos que crear un archivo xml, llamado información.xml a la altura de index.jsp, este archivo tiene el siguiente contenido:
<?xml version="1.0" ?>
<libros>
<libro>
<titulo>Triangulos</titulo>
<autor>Pitagoras</autor>
</libro>
<libro>
<titulo>Java</titulo>
<autor>Alex</autor>
</libro>
<libro>
<titulo>Objective C</titulo>
<autor>Martinez</autor>
</libro>
</libros>


Luego de esto, tenemos que crear una página llamada XML.jsp, que se encargará de mostrarnos la informacion del archivo XML
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<c:import url="informacion.xml" var="archivo" />
<x:parse xml="${archivo}" var="doc" />
<br/>
<x:forEach var="i"
select="$doc/libros/libro">
<x:out select="$i/titulo" />
<br>
<x:out select="$i/autor" />
<br>

</x:forEach>
</body>
</html>



Ahora vamos a crear una pagina llamada SQL.jsp
Este código hace una conexion directa a la base de datos junto con un insert y una consulta que es devuelta a pantalla

El código es el siguiente:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<c:set var="nombre" value="otro"/>

<sql:setDataSource
var="ds"
driver="org.apache.derby.jdbc.ClientDriver"
url="jdbc:derby://localhost:1527/ejemplo"
user="usuario1"
password="usuario1"
/>

<sql:transaction dataSource="${ds}">
<sql:update var="actualizar">
INSERT INTO APP.CLIENTES VALUES (5,'${nombre}','direccion1')

</sql:update>

<sql:query var="clientes">
SELECT * FROM APP.CLIENTES
</sql:query>
</sql:transaction>


<table border=1>
<c:forEach var="row" items="${clientes.rows}">
<tr>
<td><c:out value="${row.id}"/></td>
<td><c:out value="${row.nombre}"/></td>
<td><c:out value="${row.direccion}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>

Nota: El uso de JSTL para conectarnos a una Base de Datos no es recomendado, es mejor tratar de utilizar un patrón MVC.

Si ejecutamos la aplicacón tenemos:

Mapa:
Funciones:

Formatos:

Sql:
XML:

Maven, Http Headers & Jetty

Para este ejemplo estoy utilizando Ubuntu 10.04 LTS y Maven version 2.2.1

La idea de este ejemplo es crear una aplicación web por medio de maven y ejecutarla en un servidor Jetty.





Ejecutamos el siguiente comando de maven

mvn archetype:create -DgroupId=com.ejemplo.app -DartifactId=AplicacionWeb -DarchetypeArtifactId=maven-archetype-webapp


Luego modificamos pom.xml de acuerdo a la siguiente estructura
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ejemplo.app</groupId>
<artifactId>AplicacionWeb</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>AplicacionWeb Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>AplicacionWeb</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
</plugin>

</plugins>
</build>
</project>
Luego modificamos index.jsp que se encuentra en la ruta:<RUTA>/AplicacionWeb/src/main/webapp y colocamos el siguiente codigo:

<html>
<body>
<jsp:forward page="pagina1.jsp"/>
</body>
</html>


Despues de esto, creamos una página JSP llamada pagina1.jsp en <RUTA>/AplicacionWeb/src/main/webapp, con el siguiente código:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<title>Pagina1</title>
</head>
<body>
<form name="form1" action="ServletInformacion" method="POST">
Ingresar un valor:<input type="text" name="valor1"/>
<input type="submit" value="Enviar">
</form>
</body>
</html>

Luego de esto, creamos el directorio de fuentes. Para esto vamos al directorio <RUTA>/AplicacionWeb/ y ejecutamos el comando:
mkdir -p src/main/java/com/ejemplo/servlets

y luego entramos a ese directorio, con el comando cd src/main/java/com/ejemplo/servlets

En este directorio, creamos un servlet llamado ServletInformacion.java

package com.ejemplo.servlets;

import java.io.*;
import java.util.Enumeration;
import javax.servlet.*;
import javax.servlet.http.*;

public class ServletInformacion extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet Headers</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet Headers at " + request.getContextPath() + "</h1>");
Enumeration listado = request.getHeaderNames();
out.println("REQUEST");
while (listado.hasMoreElements()) {
String nombre = (String) listado.nextElement();
out.println("<li>" + nombre + ":" + request.getHeader(nombre) + "</li>");
}
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}

}


Luego agregamos la informacion del mapeo del Servlet en <RUTA>/AplicacionWeb/src/main/webapp/WEB-INF/web.xml, con lo que web.xml nos queda de la siguiente manera:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>ServletInformacion</servlet-name>
<servlet-class>com.ejemplo.servlets.ServletInformacion</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletInformacion</servlet-name>
<url-pattern>/ServletInformacion</url-pattern>
</servlet-mapping>>
</web-app>

Finalmente ejecutamos
mvn clean install
mvn jetty:run

y entramos a:http://localhost:8080/AplicacionWeb/




Damos click en Enviar

jueves, 1 de julio de 2010

GWT & Netbeans

Google Web Toolkit
Para este ejemplo estoy usando Netbeans 6.8, Glassfish V3, GWT 2.0.3 y Ubuntu 10.0.4
Primeramente abrimos Netbeans 6.8

Luego vamos a Tools/Plugins y buscamos GWT4NB, lo marcamos y damos click en Install

Damos click sobre Next
Aceptamos la Licencia
Descargamos e instalamos el plugin
Luego tenemos que crear un nuevo proyecto, para este caso un Web Application
Le damos el nombre ProyectoGWT
Seleccionamos el server en este caso Glassfish V3
Y marcamos Google Web Toolkit, seleccionamos la ruta de instalacion de GWT(lo podemos descargar y descomprimir de http://code.google.com/webtoolkit/download.html), además damos la ruta de paquetes
Se nos abrira web.gwt.xml, que es un archivo de configuracion para gwt
Si ejecutamos el proyecto nos saldrá una pantalla de ejemplo:
GWT genera tres archivos importantes:
xxx.gwt.xml: Que es un archivo de configuración XML.
xxxEntryPoint: Que es la clase main
welcomeXXX: Que es una pagina web con una llamada a JavaScript que es el encargado de devolver el codigo HTML que se mostrará en pantalla:

La programación de los elementos de HTML es similar a la que hacemos cuando trabajamos con SWING o AWT. Esto lo hacemos por código y usamos contenedores como tablas y paneles para distribuir nuestros elementos. Además tambien llamamos a Handlers que nos permitiran usar los diferentes eventos de los elementos.
La programación se la realiza en la funcion onModuleLoad de xxxEntryPoint, para este ejemplo estoy creando un control que se encargara de agregar nombres a una lista, este es el código fuente de la clase:

package com.ejemplo2.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
* Main entry point.
*
* @author santiago
*/
public class webEntryPoint implements EntryPoint {

/**
* Creates a new instance of webEntryPoint
*/
private HorizontalPanel panelAgregar = new HorizontalPanel();
private VerticalPanel panel = new VerticalPanel();
private FlexTable tablaDatos = new FlexTable();
private TextBox txtNombre = new TextBox();
private Button agregar = new Button("Agregar");
private Label lblNombre = new Label("Nombre:");
private List listado = new ArrayList();

public webEntryPoint() {
}

/**
* The entry point method, called automatically by loading a module
* that declares an implementing class as an entry-point
*/
public void onModuleLoad() {
tablaDatos.setText(0, 0, "Numero");
tablaDatos.setText(0, 1, "Nombre");
tablaDatos.setText(0, 2, "Fecha Creación");
tablaDatos.setText(0, 3, "Retirar");

panelAgregar.add(lblNombre);
panelAgregar.add(txtNombre);
panelAgregar.add(agregar);

panel.add(panelAgregar);
panel.add(tablaDatos);
RootPanel.get().add(panel);

txtNombre.setFocus(true);

//MANEJO DE EVENTOS
//CLICK DE BOTON
agregar.addClickHandler(new ClickHandler() {

public void onClick(ClickEvent event) {
agregar();
}
});

//TECLA ENTER
txtNombre.addKeyPressHandler(new KeyPressHandler() {

public void onKeyPress(KeyPressEvent event) {
if (event.getCharCode() == KeyCodes.KEY_ENTER) {
agregar();
}
}
});
}

private void agregar() {
final String nombre = txtNombre.getText().toUpperCase();
if (listado.contains(nombre)) {
Window.alert("Ya existe ese nombre ingresado");
return;
}
int numeroFila = tablaDatos.getRowCount();
listado.add(nombre);
tablaDatos.setText(numeroFila, 0, numeroFila+")");
tablaDatos.setText(numeroFila, 1, nombre);
tablaDatos.setText(numeroFila, 2, DateTimeFormat.getFormat("dd/mm/yyyy hh:mm:ss").format(new Date()));

Button quitar = new Button("x");
quitar.addClickHandler(new ClickHandler() {

public void onClick(ClickEvent event) {
int indice = listado.indexOf(nombre);
listado.remove(indice);
tablaDatos.removeRow(indice + 1);
}
});
tablaDatos.setWidget(numeroFila, 3, quitar);
}
}

La salida del app es:

viernes, 4 de junio de 2010

Realms(Dominios) en Glassfish y autenticación con formularios

Para este ejemplo estoy utilizando Netbeans 6.8, Glassfish V3, JDK1.6 y Ubuntu 9.10 Karmic Koala
Como primer paso, debemos crear un Realm(Dominio) en Glassfish:
Bajo Security damos click en Realms y damos click sobre New:
Ahi creamos el Realm con la siguiente informacion:
Realm Name:realmexample
Class Name:com.sun.enterprise.security.auth.realm.file.FileRealm
JAAS Context:fileRealm
Key File:${com.sun.aas.instanceRoot}/config/keyfile

y damos click en OK

Luego damos click en realmexample
y luego click en Manage Users

Ahi damos click en New y creamos un usuario con:
UserId:usuario
Group List:Users
y le damos una clave y damos click en OK

Con esto tenemos ya creado un dominio y un usuario.

Ahora vamos a Netbeans 6.8
Aqui tenemos que crear un nuevo proyecto Java EE al que llamaremos PracticaSeguridades



Luego, bajo el proyecto web creamos un Servlet llamado Cliente, bajo el paquete com.web
En la siguiente pantalla marcamos el checkbox "Add information to deployment descriptor" para que nos genere el descriptor web.xml.



Luego modificamos index.jsp al siguiente código:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>JSP Page</title>
</head>
<body>
<a href="Cliente">Datos Informativos</a><br/>
<a href="logout.jsp">Salir</a>
</body>
</html>


y agregamos tres páginas jsp llamadas error.jsp, login.jsp, logout.jsp, que deben tener el siguiente código:

error.jsp:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Nombre de usuario incorrecto <a href="javascript:history.back(1)">Regresar</a></h1>
</body>
</html>

login.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Login de Usuario</title>
</head>
<body>
<form method=post action="j_security_check">
Usuario:<input type="text" name= "j_username"/><br/>
Clave:<input type="password" name= "j_password"/><br/>
<input type="submit" name="submit" value="Ingresar"/>
<input type="reset" name="reset" value="Cancelar"/>
</form>
</body>

</html>


logout.jsp:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>JSP Page</title>
</head>
<body>
<%session.invalidate();%>
<h1>Gracias por probar esta demo, visita <br/>
<a href="http://festintecnologico.blogspot.com/" target="_blank">Festín tecnológico</a></h1>
</body>
</html>


Hecho esto, tenemos que modificar los archivos sun-web.xml y web.xml para colocar las políticas de seguridades.
En este XML unimos el Perfil de usuario de Glassfish(Users) a uno que nosotros creamos en nuestra aplicación web (Usuarios)

en sun-web.xml agregamos las siguientes lineas antes de </sun-web-app>
<security-role-mapping>
<role-name>Usuarios</role-name>
<group-name>Users</group-name>
</security-role-mapping>

Con lo que el archivo sun-web.xml nos queda como:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Servlet 2.5//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd">
<sun-web-app error-url="">
<context-root>/PracticaSeguridades-war</context-root>
<class-loader delegate="true"/>
<jsp-config>
<property name="keepgenerated" value="true">
<description>Keep a copy of the generated servlet class' java code.</description>
</property>
</jsp-config>
<security-role-mapping>
<role-name>Usuarios</role-name>
<group-name>Users</group-name>
</security-role-mapping>
</sun-web-app>

En web.xml definimos que métodos(GET, POST, PUT, etc) se pueden realizar y sobre que recursos y que roles pueden usar esos recursos, para nuestro caso usaremos el rol de "Usuarios" que definimos en sun-web.xml. Tambien definimos que modo de autenticacion usaremos en nuestro caso, es de tipo Form usando la pagina login.jsp

Para web.xml agregamos las siguientes lineas antes de </web-app>
<security-constraint>
<display-name>Confirmacion Identidad</display-name>
<web-resource-collection>
<web-resource-name>PoliticasSeguridad</web-resource-name>
<description/>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>Usuarios</role-name>
</auth-constraint>

</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>realmexample</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>

Con lo que el archivo nos queda:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<security-constraint>
<display-name>Confirmacion Identidad</display-name>
<web-resource-collection>
<web-resource-name>PoliticasSeguridad</web-resource-name>
<description/>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>Usuarios</role-name>
</auth-constraint>

</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>realmexample</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
</web-app>


Luego, para el proyecto EJB, vamos a crear un nuevo Bean de Session y lo llamaremos EjemploSeguridadBean bajo el paquete com.ejb y marcamos la interface remote de la siguiente manera:



damos click en Finish.

Modificamos los archivos
EjemploSeguridadBeanRemote.java

package com.ejb;

import javax.ejb.Remote;

@Remote
public interface EjemploSeguridadBeanRemote {
String probarSeguridadEJB();
}


EjemploSeguridad.java
En este archivo usamos las anotaciones @RolesAllowed y @DeclareRoles({"Usuarios"}) para indicar que Roles de usuario definidos en sun-web.xml pueden ejecutar esta rutina

package com.ejb;

import javax.annotation.Resource;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
@Stateless
@DeclareRoles({"Usuarios"})
public class EjemploSeguridadBean implements EjemploSeguridadBeanRemote {
@Resource
SessionContext ctx;
@RolesAllowed(value = {"Usuarios"})
public String probarSeguridadEJB() {
return "El nombre de usuario desde EJB es:" + ctx.getCallerPrincipal().getName();
}
}


Luego de esto, regresamos al proyecto web y cambiamos el servlet Cliente.java al siguiente código:

Cliente.java

De la misma manera que en el Bean, por medio de las anotaciones @DeclareRoles({"Usuarios"})
y
@ServletSecurity(@HttpConstraint(rolesAllowed={"Usuarios"}))
podemos definir que usuarios pueden ejecutar estas rutinas

package com.web;

import com.ejb.EjemploSeguridadBeanRemote;
import java.io.IOException;
import java.io.PrintWriter;
import javax.annotation.security.DeclareRoles;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.HttpConstraint;
import javax.servlet.annotation.ServletSecurity;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name="Cliente", urlPatterns={"/Cliente"})
@DeclareRoles({"Usuarios"})
@ServletSecurity(@HttpConstraint(rolesAllowed={"Usuarios"}))
public class Cliente extends HttpServlet {
@EJB private EjemploSeguridadBeanRemote bean;

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet Cliente1</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Informacion de Seguridad Desde WEB</h1>");
out.println("Usuario: " + request.getUserPrincipal().getName()+"<br/>");
out.println("Tipo de Autenticacion: " + request.getAuthType()+"<br/>");
out.println("Nombre Servidor: " + request.getServerName()+"<br/>");
out.println("<h1>Informacion de Seguridad Desde EJB</h1>");
out.println(bean.probarSeguridadEJB());
out.println("</body>");
out.println("</html>");

} finally {
out.close();
}

}
....


Con lo cual tenemos:

Si nos equivocamos en el usuario o clave, nos saldrá el siguiente mensaje:
Si ingresamos con usuario y la clave que definimos en Glassfish.

Se nos muestran las siguientes opciones:
Si damos click en datos informativos tenemos:
y al dar click en logout:

jueves, 3 de junio de 2010

Restful Server & Client

Para este ejemplo estoy utilizando Netbeans 6.8, Glassfish V3, JDK1.6 y Windows 7
Primeramente abrimos Netbeans
Luego creamos un nuevo proyecto web

Le damos el nombre RestfulServer
Seleccionamos Glassfish V3 como servidor y la versión Java EE 6 Web
Luego creamos una nueva clase java
Le llamaremos Restful
La clase tiene el código siguiente(Llaman la atención las anotaciones) para saber que path es que se usará y que función se ejecutará de acuerdo tipo de método llamado

package com.web.ws;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;


@Path("/mensaje")
public class Restful {
public Restful() {
}

@GET
@Produces("text/html")
public String getHtml() {
return "<html><body><h1>Hello World!</body></h1></html>";
}

@PUT
@Consumes("text/html")
public void putHtml(String nombre) {
System.out.println("Saludos(PUT):"+nombre);
}
}


En el momento de guardar la clase, se mostrará esta ventana. La misma que nos ayuda a configurar la información en el descriptor (web.xml) de manera automática
Existe otra manera de crear la clase Restful del servidor con anotaciones, esta es por medio de la opción RESTful Web Services from Patterns
Si seleccionamos esta via para crear el web service, crearemos una clase con las anotaciones antes mostradas de manera automática
Luego hagamos un "Test RESTful Web Services"
Nos hará una pregunta de seguridad y Aceptaremos
El explorador de internet, nos mostrará los métodos disponibles y podremos hacer pruebas sobre los mismos:
Para la creación del cliente, vamos a crear una aplicación Java
A la aplicación le daremos el nombre de Cliente

La variable URL debe ser cambiada al URL que se muestra en Resource. Podemos ver esta variable cuando probamos el servicio Restful tres pantallas atrás

El código es el siguiente:

package cliente;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class Main {

private static String ruta="http://localhost:21405/RestfulServer/resources/mensaje";
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
get();
put();
}

public static void get() {
String respuesta = "";
BufferedReader buffer = null;
try {
URL url = new URL(ruta);
URLConnection conn = url.openConnection();
buffer = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = buffer.readLine()) != null) {
respuesta += line;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (buffer != null) {
try {
buffer.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
System.out.println(respuesta);
}

public static void put() {
String respuesta = "";
OutputStreamWriter wr = null;
BufferedReader rd = null;
try {
URL url = new URL(ruta);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("PUT");
conn.setDoOutput(true);
wr = new OutputStreamWriter(conn.getOutputStream());
wr.write("Santiago");
wr.flush();
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
respuesta += line;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (wr != null) {
wr.close();
}
if (rd != null) {
rd.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
System.out.println(respuesta);
}
}
Ejecutamos el servidor y luego el cliente
Con lo cual obtenemos las siguientes salidas: