Buscando artículos sobre "Java"
20-octubre-2014
admin

Usar Apache CXF para montar servicios en java

En primer lugar comentar unos conceptos básicos… tenemos dos tipos de servicios web: SOAP y REST.
– SOAP consiste en el intercambio de mensajes envueltos en un XML. El cliente envía un mensaje XML en formato SOAP, dicho mensaje es recibido por el servidor, que desencapsula dicho mensaje en el formato correspondiente (SOAP es multilenguaje, acepta varios lenguajes, entre ellos Java), que recibe los datos, procesa una respuesta y la devuelve.
En Java existe la implementación JAX WS.

– Rest es una implementación posterior. No sólo utiliza un tipo de mensaje HTTP para el intercambio de mensajes, si no que permite más mensajes. Con Rest puedes tener un cliente que envíe mensajes HTTP de tipo GET, PUT, POST y DELETE. Cada mensaje enviará los datos correspondientes asociados hacia el servidor, que, recibirá la petición, la entenderá, y delegará en el método correspondiente. GET sirve para recuperar un dato desde el cliente al servidor, PUT para insertar un dato, POST para enviar información para modificar y DELETE para eliminar información del servidor.
En Java existe la implementación JAX RS.

Una forma muy sencilla de montar nuestros servicios en java es utilizar Apache CXF que se adapta tanto a Jax WS como a Jax RS. Además, se integra muy bien con Spring.
En la documentación hay numerosos ejemplos: Documentación oficial

A continuación un par de ejemplos muy sencillos:

package es.com.disastercode;

import javax.jws.WebService;

@WebService
public interface EjemploService{
    String getTipoCoche(String matricula);
}

Archivo de implementación JAX WS. Para exponer un servicio y publicarlo en un contendor de aplicaciones que soporte JAX-WS. Automáticamente el contenedor se encargará de generar el contrato (WSDL).

package es.com.disastercode;

import javax.jws.WebService;

@WebService(endpointInterface = "es.com.disastercode.EjemploService")
public class EjemploServiceWSImpl implements EjemploService {

    public String getTipoCoche(String matricula) {
        return "Seat Ibiza";
    }
}

Archivo de implementación JAX-RS. Permite realizar lo mismo que antes pero exponiendolo como recursos REST.

package es.com.disastercode;

import javax.jws.WebService;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

@WebService(endpointInterface = "es.com.disastercode.EjemploService")
@Produces("application/json")
public class EjemploServiceRSImpl implements EjemploService {
       
    @GET
    @Path("/{matricula}")
    public String getTipoCoche(@PathParam("matricula")String matricula) {
        return "Seat Ibiza";
    }
}

Ahora sólo nos faltaría configurar los servicios en Spring. Para ello:
1/ añadir al web.xml:

        < context-param>
                < param-name>contextConfigLocation< /param-name>
                < param-value>WEB-INF/appCtx.xml< /param-value>
        < /context-param>

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

        < servlet>
                < servlet-name>CXFServlet
                < servlet-class>
                        org.apache.cxf.transport.servlet.CXFServlet
                < /servlet-class>
                < load-on-startup>1
        < /servlet>

        < servlet-mapping>
                CXFServlet
                /*
        < /servlet-mapping>

2/ añadir la configuración de JAX WS a spring.

< beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

	< import resource="classpath:META-INF/cxf/cxf.xml" />
	< import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
        < import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />

	< bean id="ejemploServiceController"
		class="es.com.disastercode.EjemploServiceWSImpl">
	< /bean>

	< jaxws:endpoint id="ejemploService" implementor="#ejemploServiceController"
		address="/ws/exps">
        < jaxws:dataBinding>
        	
            < /bean>
        < /jaxws:dataBinding>
    < /jaxws:endpoint>     
< /beans>

3/ añadir la configuración de JAX RS a spring.

< beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:jaxrs="http://cxf.apache.org/jaxrs"
      xsi:schemaLocation="
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
         http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">

	< import resource="classpath:META-INF/cxf/cxf.xml" />
	< import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
        < import resource="classpath*:META-INF/cxf/cxf-extension-*.xml" />
    

	< bean id="ejemploServiceRestController"
		class="es.com.disastercode.EjemploServiceRSImpl">
	< /bean>


    < jaxrs:server id="ejemploServiceRest" address="/rest">
        < jaxrs:serviceBeans>
            < ref bean="ejemploServiceRestController" />
        < /jaxrs:serviceBeans>
        
         
		< jaxrs:providers>
		 < ref bean="jsonProvider"/>
		< /jaxrs:providers>
		 
		< jaxrs:features>
 		< /jaxrs:features>
 		
    < /jaxrs:server>

    < bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
< /beans>
5-octubre-2014
admin

Cómo acceder al ResourceBundle en un action Struts

A continuación se muestra un ejemplo en el cual se accede al ResourceBundle en un action de struts.

public static String getLocalizedMessage(HttpServletRequest request, 
                                                       String messageKey) {
    //Obtenermos el MessageResources de la request.
    MessageResources messageResources = (MessageResources) 
                                request.getAttribute(Globals.MESSAGES_KEY);

    String localizedMessage = null;
    if(messageResources != null) {
        //buscamos la key deseada en la request.
        localizedMessage = messageResources.getMessage(
                                           request.getLocale(), messageKey);
    }
    if(localizedMessage == null) {
        localizedMessage = "";
    }
    return localizedMessage;
}


//Ejemplo de uso 
//(suponemos que en el properties tenemos la key: key.welcome=bienvenido)
getLocalizedMessage(request, "key.welcome");

1-septiembre-2014
admin

Como usar la API de Twiter (parte 1)

Si tienes una cuenta de twiter y quieres realizarte una aplicación personalizada que utilice toda la información que hay en twiter (número de seguidores, amigos, tweets, etc), la gente de Twiter nos facilita una serie de llamadas rest que podemos utilizar para interactuar con ellos. Más información aquí.

En primer lugar decir que a día de hoy la versión de la API de twitter es la 1.1 (la 1.0 ya está deprecada). Esta versión 1.1 requiere usar autentificación OAUTH, de otra forma no podremos poner a funcionar la aplicación.

Por lo tanto para poder utilizar la api se deben seguir estos pasos:
1/ Crear una cuenta de desarrollador: esto se hace en https://dev.twitter.com/

2/ Una vez creada la cuenta de desarrollador ya podrás crear una nueva aplicación en la zona de «Mis Aplicaciones«.

3/ Tras crear la aplicación lo siguiente es crear los Tokens de acceso. (API keys y Access Tokens)

4/ Llegados a este punto ya podriamos utilizar la api. Existen ya un gran número de librerias que nos facilitaran el uso del api twiter para no tener que implementarlo de cero. Además, hay librerías para casi cualquier lenguaje posible. (Ver aquí)

5-abril-2014
admin

Libreria de funciones JSTL

La libreria functions de JSTL (TAGLIB) nos facilita trabajar con Strings y Arrays en el lenguaje EL de JSP. Consta de las siguientes funciones:

fn:contains()
fn:containsIgnoreCase()
fn:endsWith()
fn:escapeXml()
fn:indexOf()
fn:join()
fn:length()
fn:replace()
fn:split()
fn:startsWith()
fn:substring()
fn:substringAfter()
fn:substringBefore()
fn:toLowerCase()
fn:toUpperCase()
fn:trim()

Para poder utilizarla es necesario incluir la siguiente cabecera:

< %@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

Tutorial
JavaDoc
Página con ejemplos de uso

31-marzo-2014
admin

Tipos de generadores de identificadores en hibernate

En hibernate podemos utilizar el elemento generator para generar identificadores únicos para instancias de la clase persistente. De requerirse algún parámetro para configurar o inicializar la instancia del generador, se pasa utilizando el elemento .

Todos los generadores implementan la interfaz org.hibernate.id.IdentifierGenerator. Algunas aplicaciones pueden decidir brindar sus propias implementaciones especializadas. Sin embargo, Hibernate provee un rango de implementaciones ya incorporadas. Los nombres de atajo para los generadores incorporados son los siguientes:

increment: genera indentificadores de tipo long, short o int que sólamente son únicos cuando ningún otro proceso está insertando datos en la misma tabla. No lo utilice en un clúster.

identity: soporta columnas de identidad en DB2, MySQL, MS SQL Server, Sybase y HypersonicSQL. El identificador devuelto es de tipo long, short o int.

sequence: usa una secuencia en DB2, PostgreSQL, Oracle, SAP DB, McKoi o un generador en Interbase. El identificador devuelto es de tipo long, short o int.

hilo: utiliza un algoritmo alto/bajo para generar eficientemente identificadores de tipo long, short o int, dada una tabla y columna como fuente de valores altos (por defecto hibernate_unique_key y next_hi respectivamente). El algoritmo alto/bajo genera identificadores que son únicos sólamente para una base de datos particular.

seqhilo: utiliza un algoritmo alto/bajo para generar eficientemente identificadores de tipo long, short o int, dada una secuencia de base de datos.

uuid: utiliza un algoritmo UUID de 128 bits para generar identificadores de tipo cadena, únicos dentro de una red (se utiliza la direccón IP). El UUID se codifica como una cadena hexadecimal de 32 dígitos de largo.

guid: utiliza una cadena GUID generada por base de datos en MS SQL Server y MySQL.

native: selecciona identity, sequence o hilo dependiendo de las capacidades de la base de datos subyacente.

assigned: deja a la aplicación asignar un identificador al objeto antes de que se llame a save(). Esta es la estrategia por defecto si no se especifica un elemento < generator>.

select: recupera una clave principal asignada por un disparador de base de datos seleccionando la fila por alguna clave única y recuperando el valor de la clave principal.

foreign: utiliza el identificador de otro objeto asociado. Generalmente se usa en conjunto cón a una asociación de clave principal < one-to-one>.

sequence-identity: una estrategia de generación de secuencias especilizadas que utiliza una secuencia de base de datos para el valor real de la generación, pero combina esto junto con JDBC3 getGeneratedKeys para devolver el valor del identificador generado como parte de la ejecución de la declaración de inserción. Esta estrategia está soportada sólamente en los controladores 10g de Oracle destinados para JDK1.4. Los comentarios en estas declaraciones de inserción están desactivados debido a un error en los controladores de Oracle.

Ejemplo 1:
Si tenemos una clave primaria «idAplicacion» en MySQL con la propiedad auto_increment, se mapearia así:

//Mapeo usando anotaciones
        @Id
        @GeneratedValue
        private Integer idAplicacion;

//Mapeo en fichero hbm
        < id name="idAplicacion" type="int" unsaved-value="0">
            < column name="idAplicacion" precision="5" scale="0"/>
	    < generator class="identity"/>
        < /id>

Ejemplo 2:
Si tenemos una clave primaria «idAplicacion» en una BD oracle y queremos asignarle una secuencia llamada SEQ_ID_APLICACION, se mapearía así:

//Mapeo usando anotaciones
        @Id
        @SequenceGenerator(name="seq", sequenceName="SEQ_ID_APLICACION")
        @GeneratedValue(strategy=GenerationType.AUTO, generator="seq")
        private Integer idAplicacion;

//Mapeo en fichero hbm
        
                
                
                        SEQ_ID_APLICACION
                
        

Fuente
Explicación de diferentes generadores con ejemplos

6-enero-2014
admin

Desordenar aleatoriamente un array en java y en php

Para desordenar un array en PHP tenemos la función shuffle. En el ejemplo se crea una array ordenado de 1 a 6 mediante la función range para luego mezclarlos:


En java tenemos la función Collections.shuffle que es equivalente. Recibe como parámetro una lista y mezcla los distintos objetos o tipos que la componen.

List< TuObjeto> asks = new LinkedList< TuObjeto>();
asks.add(new TuObjeto(1));
asks.add(new TuObjeto(2));
asks.add(new TuObjeto(3));
Collections.shuffle(asks);

Como apunte decir que si lo que queremos es desordenar una lista obtenida directamente desde una Base de Datos MySql podemos usar la función rand(). Más información de esta y otras funciones en la documentación oficial de MySql.

SELECT * FROM wth_users ORDER BY rand()

9-marzo-2013
admin

MongoDB, Spark y FreeMarker

Ejemplo de uso de MongoDB, Spark y FreeMarker. Además, se utilizará Maven para incluir las dependencias necesarias para ello.

En primer lugar se necesita el driver de Java, ya que es la tecnología sobre la que está implementado el framework Spark y será el encargado de interactuar o explotar la base de datos.

              
	org.mongodb	
	mongo-java-driver
	2.10.1      
    

Un ejemplo de uso de este driver puede ser:

        MongoClient client = new MongoClient( new ServerAddress("localhost", 27017));
        DB data = client.getDB("course");
        DBCollection col = data.getCollection("hello");
        DBObject doc = col.findOne();

Spark Web Application Framework

     
            spark
            spark
            0.9.9.4-SNAPSHOT
     
      
	import static spark.Spark.*;
	import spark.*;

	public class HelloWorld {

	   public static void main(String[] args) {
	      	get(new Route("/hello") {
        		 @Override
		         public Object handle(Request request, Response response) {
        		    return "Hello World!";
	        	 }
      		});
	   }
	}

Para probarlo si estás usando IntelliJ IDEA basta lanzar con run y luego en el navegador http://localhost:4567/hello.


Uso de plantillas con Freemarker

   
      org.freemarker
      freemarker
      [2.3.19,2.4)
   

Ejemplo de plantilla. Se puede observar que hay una variable ${name}. Ésta variable se rellenará mediante el framework de Spark.

< html >
< head >
  < title >Welcome!

< body >
  < h1 >Hello ${name}


        final Configuration configuration = new Configuration();
	configuration.setClassForTemplateLoading(HelloWorldSparkFreemarkerStyle.class, "/");
	Spark.get(new Route("/") {
            
		@Override
		public Object handle(final Request request, final Response response) {
			StringWriter writer = new StringWriter();
			try {
				Template helloTemplate = configuration.getTemplate("hello.ftl");
				Map helloMap = new HashMap();
				helloMap.put("name", "Freemarker");
				helloTemplate.process(helloMap, writer);
                
			} catch (Exception e) {
				halt(500);
				e.printStackTrace();
			}
			return writer;
		}
        });

Podría utilizarse el acceso a la BD mediante el driver de java para obtener cualquier información y posteriormente poder mostrarla en una jsp mediante un plantilla freemaker.


25-febrero-2013
admin

Depurar con Logs en Android

Android proporciona un API de logging (la clase android.util.Log).

En Android, todos los mensajes de log llevarán asociada la siguiente información:
– Fecha/Hora del mensaje.
– Criticidad. Nivel de gravedad del mensaje (se detalla más adelante).
– PID. Código interno del proceso que ha introducido el mensaje.
– Tag. Etiqueta identificativa del mensaje (se detalla más adelante).
– Mensaje. El texto completo del mensaje.

Los mensajes de log se van a clasificar por su criticidad:
– Error
– Warning
– Info
– Debug
– Verbose

public class LogsAndroid extends Activity {
 
    private static final String LOGS = "LogsAppAndroid";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        Log.e(LOGS , "Mensaje de error");
        Log.w(LOGS , "Mensaje de warning");
        Log.i(LOGS , "Mensaje de información");
        Log.d(LOGS , "Mensaje de depuración");
        Log.v(LOGS , "Mensaje de verbose");
    }
}

Para ver los mensajes de log hay que ir a la vista llamada LogCat en el eclipse.

24-febrero-2013
admin

Evitar reinicio automático de la activity

Cuando por ejemplo se gira la pantalla del dispositivo android se reinicia la actividad. Esto pasa porque el método onCreate es llamado por defecto, según el ciclo de la vida de una aplicación Android. Podemos evitar que ello ocurra, colocando la siguiente etiqueta dentro del fichero Android Manifest.xml de nuestra aplicación (en la etiqueta activity de nuestra actividad):

Para verisones anteriores al API 13
android:configChanges=»orientation|keyboard|keyboardHidden»

Para versiones posteriores al API 13
android:configChanges=»orientation|keyboard|keyboardHidden|screenSize»

23-febrero-2013
admin

Comprobar conexión a internet en un dispositivo Android

En primer lugar se deben dar permisos para conectarse a internet y para consultar el estado de la conexión en el Manifest.



A continuación se puede realizar la comprobación tal que así:

ConnectivityManager cm = (ConnectivityManager) 
                       this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
     //Hay conexión.
}else{
     //No hay conexión.
}

Esto es bastante útil cuando se usa por ejemplo el componente WebView para cargar alguna página web.

Páginas:«1234»

Categorias

Linkedin