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

domingo, 15 de abril de 2012

Mover un proyecto dentro de Eclipse

Un pequeño how-to para los que uséis Eclipse: ¿Cómo se mueve un proyecto de una ubicación a otra y que todo permanezca igual?


  • En la vista de "Package explorer", 
  • botón derecho sobre el proyecto que queremos mover, 
  • "Refactor" 
  • y "Move".
  • Elegimos la nueva ubicación 

Y listo!

Fuente: Stackoverflow 



viernes, 4 de noviembre de 2011

WicketSession fuera de Wicket

Wicket tiene su propio objeto de sesión que se puede utilizar dentro de una aplicación para guardar elementos entre distintas llamadas de un mismo cliente. Este objeto será una org.apache.wicket.Session o algún otro objeto que la extienda como WebSession o un objeto propio.

Mientras no nos salgamos de la aplicación de Wicket todo va bien y tendremos la sesión disponible... pero ¿y si tenemos que enviar al usuario a otra parte de nuestro servidor que se sale de nuestra aplicación? A un servlet distinto o un formulario de otra parte, por ejemplo. En ese caso perderemos la sesión y no podremos saber que se trata del mismo que viene de la aplicación Wicket.

Hay una solución para este problema y que nos dejará la sesión disponible en cualquier otro lugar (servlets, jsps...) y es a través de un filtro especial llamado WicketSessionFilter que hará justo lo que deseamos, transportar la sesión a otros lugares.
Para usarlo, debemos configurarlo primero en el archivo web.xml del servidor de aplicaciones:

<!-- The WicketSesionFilter can be used to provide thread local access to servlets/ JSPs/ etc -->
  <filter>
    <filter-name>WicketSessionFilter</filter-name>
    <filter-class>org.apache.wicket.protocol.http.servlet.WicketSessionFilter</filter-class>
    <init-param>
      <param-name>filterName</param-name>
      <!-- expose the session of the input example app -->
      <param-value>FormInputApplication</param-value>
    </init-param>
  </filter>
 
  <!-- couple the session filter to the helloworld servlet -->
  <filter-mapping>
    <filter-name>WicketSessionFilter</filter-name>
    <url-pattern>/helloworldservlet/*</url-pattern>
  </filter-mapping>

En el parámetr filterName, debemos poner el valor de otro filtro que ya tengamos en nuestra aplicación (la verdad que esto no lo se muy bien por qué, pero es como me ha funcionado) y el resto de campos se puede ver bastante bien en el ejemplo: el mapping al servlet en el que queremos tener disponible nuestra sesión de Wicket.

Ahora ya se puede acceder a la sesión desde el servlet de la siguiente manera:

Session wicketSession = Session.get();

Que dentro de un servlet quedaría algo así:

public class HelloWorldServlet extends HttpServlet
 {
        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException,
                IOException
        {
                res.setContentType("text/html");
                PrintWriter out = res.getWriter();
                String message = "Hi. " +
                        (Session.exists() ? " Veo la sesion de Wicket " + Session.get() + "."
                                : " No encuentro la sesion de Wicket.");
                out.println(message);
                out.close();
        }
 }


Fuente: http://wicket.apache.org/apidocs/1.4/org/apache/wicket/protocol/http/servlet/WicketSessionFilter.html

martes, 13 de septiembre de 2011

Cambiar el título de una página con Wicket

Si has utilizado Wicket, te habrás dado cuenta de que el título de la página no se puede modificar de la misma forma que se hace con otros componentes. Un componente normal, por ejemplo el contenido de un <span>, lo pondríamos de la siguiente manera para que fuera configurable e internacionalizable i18n:
<span><wicket:message key="content">Default Content</wicket:message></span>
Poniendo la propiedad "content" dentro del archivo de propiedades, tendremos nuestro <span> internacionalizado sin ningún problema.

Pero esta fórmula no aplica al título de la cabecera de la página, de manera que si ponemos:
<!DOCTYPE html>
<html>
 <head>
   <title><wicket:message key="page.title"></wicket:message></title>
 </head>
 ...
</html>
lo único que conseguiremos es que el título de la página diga "<wicket:message key="page.title"></wicket:message>"

La solución es ponerlo como un componente de wicket e inicializarlo desde Java. El archivo html de markup quedaría así:
<!DOCTYPE html>
<html>
 <head>
   <title wicket:id="window.title">Default title</title></title>
 </head>
 ...
</html>

Y desde el archivo java correspondiente lo inicializaremos de la siguiente manera:
add(new Label("window.title", new StringResourceModel("window.title", null))); 
de manera que el título de la página se cogerá del archivo de propiedades de la key "window.title"

miércoles, 27 de julio de 2011

Iniciar eclipse en diferentes workspaces

Si trabajas con diferentes workspaces y no quieres andar cambiando entre uno y otro, o eligiendo al comenzar, puedes añadir al acceso directo el siguiente comando:

-data "D:\ix\workspace"

viernes, 28 de enero de 2011

Insertar varias filas en MySQL con Java

Ayer me preguntaban como se podían meter varias filas directamente en una base de datos MySQL a través de Java. A mi, lo único que se me ocurrió es preparar un string con tantos valores como filas queramos meter:

String s = "INSERT INTO table (aa, bb ,cc) values (?,?,?), (?,?,?) , (?,?,?) , (?,?,?)...."

y así tantas veces como filas queramos meter. Todo esto se podría automatizar con un método que devolviera ese string automáticamente pasándole el número de filas que quisiéramos (escrito rápido y sin mucha comprobación):

public String createInsert(int rows){
   String s = "INSERT INTO table (aa, bb, cc) values ";
   for(int i = 0; i < rows; i++){
      s += "(?,?,?),"
   }
   //Aquí habría que quitar la última coma
}

Pero hoy, la misma persona que me preguntó me informa que todo esto ya está preparado en Java y que se puede hacer de manera mucho más sencilla... así que aquí dejo una mejor solución (lo de antes no eran más que indagaciones):

String s = "INSERT INTO table (aa, bb ,cc) values (?,?,?)"
PreparedStatement st = connection.prepareStatement(s);
int rows = 20;
for(int i = 0; i < rows; i++){
   st.setString("a string")  //or whatever value: int, date, null
   st.setString("a string")  //or whatever value: int, date, null
   st.setString("a string")  //or whatever value: int, date, null
   st.addBatch();      //añadir una fila
}
st.executeBatch();

lunes, 20 de diciembre de 2010

Métodos para el Drag and Drop en Java

Una de las cosas que se ha cambiado en la implementación de Java 6 es la manera en que se realizan los drag and drops (DnD) entre los componentes. No tengo ni idea de como funcionaba antes, pero por lo que he leído y me han contado, era bastante más complicado que como se puede hacer ahora.

Lo primero que se debe saber es que todo gira en torno a la clase TransferHandler. Muchos de los componentes de Swing ya vienen con un "Transfer Handler" por defecto, que en muchos casos será suficiente para nuestros propósitos.

Para comenzar a utilizar un TransferHandler en nuestro componente, existen tres métodos que deberemos emplear:

A continuación, existen dos tipos de métodos: los métodos para exportar datos y los métodos para importar datos.

Los primeros se utilizan para exportar los datos desde un componente cuando se comienza un gesto de arrastrar (drag) o cuando se copia o corta desde el componente con el que estamos trabajando. Estos métodos son:
  • getSourceActions(JComponent) - indicará qué acciones se permiten con los elementos del componente: copiar, mover o ambos. Este método se llamará automáticamente al comienzo del drag o arrastre.
  • createTransferable(JComponent) - este es el método más importante de todos ya que es el encargado de preparar los datos que se desean exportar: todo un objeto propio, sólo un String con el nombre, el id... Devuelve un objeto de tipo Transferable
  • exportDone(JComponent, Transferable, int) - este método se llama una vez que se ha terminado el drag and drop y en él se deben implementar las acciones necesarias después de la exportación (por ejemplo, después de mover un elemento, se debe eliminar de su ubicación original).

A continuación, los métodos empleados para importar datos cuando se suelta un objeto sobre un componente o cuando se pega desde el portapapeles:
  • canImport(TransferHandler.TransferSupport) - este método se llama de manera constante mientras se está haciendo un drag and drop y nos indica si el componente que se encuentra debajo del cursor del ratón aceptará los datos (return true) o si de lo contrario los rechazará (return false).
  • importData(TransferHandler.TransferSupport) - este método se invoca en el momento que se suelta sobre un componente terminando el drag and drop. Realiza las acciones necesarias para insertar los datos desde el origen hasta este punto y devuelve true en caso de una importación satisfactoria y false en caso contrario.

Por último, es necesario indicar la función de la clase TransferSupport, una clase interna de TransferHandler y que permite que se realice la transferencia de los datos entre el origen y el destino.Esta clase nos ofrece información acerca de la transferencia como el componente destino, la acción que se va a realizar (copiar o mover), los datos que se están transfiriendo, si se soporta ciertos tipos de datos, la localización exacta del componente destino...

Con estos métodos se puede realizar drag and drop en java, la lógica a aplicar en cada uno de ellos depende de nuestra aplicación en cuestión.

Tutorial completo

jueves, 9 de diciembre de 2010

Instalar Java de Sun en Ubuntu 10.04

Siguiendo con el tema del servidor, al que tengo un poco abandonado, hoy me ha tocado instalar el JRE de java para poder ejecutar aplicaciones en él. Cómo otras veces ya había tenido problemas con los paquetes open que vienen en los repositorios por defecto de Ubuntu, he decidido no jugarmela e instalar directamente los paquetes de Sun.

Para ello, desde la consola ejecutamos:
sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"

Para a continuación, actualizar e instalar java:
sudo apt-get update
sudo apt-get install sun-java6-jre

y LISTO!

Visualmente también lo podemos hacer abriendo Synaptic: System-> Administration-> Synaptic Package Manager
Una vez dentro, en Settings-> Repositories-> Other Software, activamos el repositorio arriba indicado (http://archive.canonical.com/ lucid partner) y si no está, lo añadimos. Salimos de esta ventana y hacemos un "Reload" del Synaptic y buscamos el paquete que queremos instalar. Igual de sencillo: el JRE de java instalado en nuestro servidor para poder ejecutar otras aplicaciones.

Espero sea útil.

miércoles, 10 de noviembre de 2010

Drag and Drop con JTree en Swing

ACTUALIZACIÓN: en este otro artículo explico los  métodos necesarios para el drag and drop

Tres enlaces interesantes para poder hacer Drag and Drop con un jTree de Swing en JAVA:

http://weblogs.java.net/blog/shan_man/archive/2006/01/first_class_dra.html
http://weblogs.java.net/blog/shan_man/archive/2006/01/location_sensit.html

http://psecheresse.spaces.live.com/blog/cns!492816F77B21DC3D!278.entry

Actualización: si necesitas empezar desde un nivel más básico, aquí se explica desde 0 como se realiza Drag And Drop (DnD)

Y aquí dejo otro artículo con los métodos necesarios para el drag and drop