L’applet invisible en un jar

Com comentava al darrer apunt, una opció és servir l’Applet empaquetat en un fitxer.jar.

Per a crear el fitxer .jar n’hi ha prou amb utilitzar el compressor jar que ve amb el JDK. Una altre opció és automatitzar la creació del jar amb un build.xml per a l’ant.

Anem a suposar que l’applet ProvaApplet del darrer apunt es crea dins el package cat.albertbaranguer.applets que és dins la carpeta ‘src’. El .class es genera a una carpeta ‘bin’ i vull obtenir el jar a la carpeta ‘jar’. Aleshores faig servir el següent build.xml dins l’eclipse.

<project name="prova-applet" default="all" basedir=".">

  <!– Properties –>

  <!–  jar directory –>  
  <property name="jar" value="./jar"/>

  <!–  bin directory –>
  <property name="bin" value="./bin"/>

  <!–  source directory for java files –>
  <property name="src" value="./src"/>
   
  <!– Targets –>
  <target name="all" depends="compile, jar"/>

  <target name="compile" depends="clean">
    <javac debug="true" srcdir="${src}" destdir="${bin}">
    </javac>
  </target>

  <target name="jar" depends="compile">
    <jar jarfile="${jar}/prova-applet.jar"
      basedir="${bin}">
    </jar>
  </target>
   
  <target name="clean">
    <delete dir="${bin}"/>
      <mkdir dir="${bin}"/>
  </target>
</project>

En executar el build.xml amb ant, obtindrem el fitxer prova-applet.jar a la carpeta ‘jar’.

Aleshores, cal modificar l’etiqueta applet de l’HTML. La deixaré així:

<applet
    code="cat/albertbaranguer/applets/ProvaApplet.class"
    archive="jar/prova-applet.jar"
    name="TestApplet"
    width="0"
    height="0"
    hspace="0"
    vspace="0"
    align="middle"></applet>

On estic deixant el fitxer prova-applet.jar a la carpeta .jar que es troba al mateix nivell de directori que l’HTML.

Un applet invisible

Un applet java invisible pot ser quelcom útil. En aquest apunt poso un exemple molt senzill d’applet invisible amb l’HTML que l’utilitza.

import java.applet.*;

public class AppletGeneric extends Applet {
  String sNom;
  String sCognom1;
  String sCognom2;
  String sNumTelefon;

  //Construct the applet

  public AppletGeneric() {
  }

  //Initialize the applet
  public void init() {
  }
  //Start the applet

  public void start() {
  }
  //Stop the applet

  public void stop() {
  }
  //Destroy the applet

  public void destroy() {
  }

  //Get Applet information
  public String getAppletInfo()
  {
    return "Applet Information";
  }

  public void setNom(String sNom) {this.sNom = sNom;}
  public void setCognom1(String s
Cognom1) {this.sCognom1 = sCognom1;}
  public void set
Cognom2(String sCognom2) {this.sCognom2 = sCognom2;}
  public void set
NumTelefon(String sNumTelefon) {this.sNumTelefon = sNumTelefon;}
  public String get
Nom() {return sNom;}
  public String get
Cognom1() {return sCognom1;}
  public String get
Cognom2() {return sCognom2;}
  public String get
NumTelefon() {return sNumTelefon;}
}

I la pàgina HTML que l’invoca:

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>
HTML Test Page
</TITLE>
<script language="javascript">
function Canviar() {
  document.TestApplet.setNom(document.ProvaApplet.sNom_1.value);
  document.TestApplet.setCognom1(document.ProvaApplet.sCognom1_1.value);
  document.TestApplet.setCognom2(document.ProvaApplet.sCognom2_1.value);
  document.TestApplet.setNumTelefon(document.ProvaApplet.sNumTelefon_1.value);

  ProvaApplet.sNom_2.value=document.TestApplet.getNom();
  ProvaApplet.sCognom1_2.value=document.TestApplet.getCognom1();
  ProvaApplet.sCognom2_2.value=document.TestApplet.getCognom2();
  ProvaApplet.sNumTelefon_2.value=document.TestApplet.getNumTelefon();

}
</script>

</HEAD>
<BODY>
Applet invisible.<BR>
<APPLET
  CODEBASE = "."
  CODE     = "AppletGeneric.class"
  NAME     = "TestApplet"
  WIDTH    = 0
  HEIGHT   = 0
  HSPACE   = 0
  VSPACE   = 0
  ALIGN    = middle
>
</APPLET>

<applet code="" width="" height="">
</applet>

<FORM NAME="ProvaApplet" METHOD="" ACTION="">
  Nom  <input type="text" name="sNom_1"><br>
  Cognom1 <input type="text" name="sCognom1_1"><br>
  Cognom2 <input type="text" name="sCognom2_1"><br>
  Número telefono <input type="text" name="sNumTelefon_1"><br>
<hr>
  Nom  <input type="text" name="sNom_2"><br>
  Cognom1 <input type="text" name="sCognom1_2"><br>
  Cognom2 <input type="text" name="sCognom2_2"><br>
  Número telefon <input type="text" name="sNumTelefon_2"><br>
<hr>
<input type="button" value="Canviar" onclick="Canviar()">
</FORM>
</BODY>
</HTML>

A l’Internet Explorer, depenent del nivell de seguretat, demanarà permís per a executar el codi de l’applet.

L’applet java és descarrega com un .class. Una alternativa seria comprimir-lo i descarregar-lo com un .jar.

Una plantilla mínima per als servlets

Una plantilla mínima per als servlets:

package cat.albertbaranguer.proves;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



public class ServletBase extends HttpServlet {
    public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        process (request, response);
    }

    public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {       
        process (request, response);
    }

    protected void process (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletOutputStream os = response.getOutputStream();       
        os.println( "<html><head><title>Servlet base</title></head><body>" +
                    "Servlet base" +
                    "</body></html>");
    }
}

Escapar ‘&’en scripts SQL-PLUS

Una situació típica: un script on apareixen cadenes amb el caràcter &. A l’executar-les amb l’SQL-PLUS l’execució s’atura i se’ns demana un valor de paràmetre.
El que està passant és que SQL-PLUS identifica amb & els paràmetres de línia de comandes que es passen a l’script.

Si no es van a passar paràmetres de línia de comandes, aleshores la forma fàcil d’evitar l’error d’interpretació és encapçalar l’script amb

set define off

(també funciona amb set scan off,  exactament el mateix que set define off, però és obsolet. Es recomana usar set define.)


Si, pel contrari, sí que cal passar paràmetres, aleshores cal "escapar" els & que no ha d’interpretar l’SQL-PLUS prefixant-los am un caràcter d’escapament.
Depenent de  les versions pot ser ‘\’ (backslash). O bé es po especificar el caràcter que es vulgui amb

set escape caràcter

Com inicialitzar Dates amb Javascript

Exemple de com inicialitzar una data amb Javascript, o sigui, com obtenir un objecte Date que es refereixi a la data que vulguem.

// La data que vull obtenir dd/mm/aaaa
var vStrAvui = "02/09/2008";    

// Separo dia, mes i any
var vTokenAvui = vStrAvui.split("/");
var vAvuiDia = vTokenAvui[0];
var vAvuiMes = vTokenAvui[1];
var vAvuiAny = vTokenAvui[2];

// Obtinc un objecte Date
var vAvui = new Date();  

// I l’inicialitzo
vAvui.setFullYear(parseFloat(vAvuiAny), parseFloat(vAvuiMes) – 1, parseFloat(vAvuiDia));

Comentaris:
Per què millor així que no pas inicialitzant amb vAvui = new Date(
"02/09/2008"); ?
perquè amb new Date(string_data)  i depenent de la versió de navegador, la data es converteix segons el format "dd/mm/aaaa" o segons el format "mm/dd/aaaa". Per entendre’ns, de l’IE6 a l’IE7 no funciona igual.

Més coses: per què convertir amb parseFloat en comptes de fer-ho amb parseInt? perquè parseInt te un bug que fa que la conversió falli. Increïble però cert.

L’última: per què li resto 1 al mes? perquè els mesos en Javascript són un array indexat que comença amb zero.