Articoli Manifesto Tools Links Canali Libri Contatti ?
Tip / AJAX

Ajax ... before Ajax (4)

Abstract
Ultimo Tip pre-Ajax per attuare il retrieving dei dati Server-Side e un interscambio Java/JavaScript
Data di stesura: 12/03/2006
Data di pubblicazione: 14/03/2006
Ultima modifica: 04/04/2006
di Stefano Fago Discuti sul forum   Stampa

Verrà utilizzata nuovamente la tecnica di injection di un nodo Script tramite DOM e non utilizzeremo un IFRAME. Un interfaccia semplificata ci permetterà di scegliere un Impiegato e esaminarne gli estremi; sarà anche possibile modificare il nome e cognome!

Il ruolo di loader è affidato ad un nodo SCRIPT costruito a runtime grazie a DOM. Viene imposto l'attributo SRC del nuovo nodo in modo da invocare la servlet che produce la risposta.
Il nodo script necessita di un javascript valido nel riferimento all'attributo SRC: la servlet quindi non produce del semplice HTML ma un vero e proprio script per la gestione dei contenuti!
Il formato di interscambio è molto semplice:

  1. viene trasmesso un oggetto javascript nella forma:
    { 
      id: XXX,
      nome: "?",
      cognome: "?"
    }
  2. lo stesso formalismo viene parsato nella servlet per ottenere un oggetto Java
Questo semplice Tip vi introduce ad uno dei meccanismi di base per la serializzazione di java in js e viceversa? Il nome di questo protocollo e JSON: http://www.json.org.

Testato con Netscape 8, FireFox 1.x, IE 5.5+, Opera 8

Buon Divertimento!

I nostri ingredienti

La pagina HTML

<body bgcolor="#ffffff">
 <form name="search" action="#" onsubmit="return searchEmployee();" >
  <p><label for="emplId">EMPLOYEE TO FIND: <input name="emplId" type="text" value=""></label></p>
  <p><input type="submit" name="Submit" value="submit" ></p>
 </form>
 <p>EMPLOYEE: <div id="emplView"></div></p>
 <p><a href="javascript:alert(emp!=null)" >TEST THAT OBJECT IS PRESENT!</a></p>
</body>

Gli Script

  1. var emp = null; 
  2.  
  3. function searchEmployee(){ 
  4.   var idToSearch = document.search.emplId.value; 
  5.   loader('/j2js?id='+idToSearch+'&ts='+(new Date()).getTime()); 
  6.   return false; 
  7. } 
  8.  
  9.  
  10. function update(){ 
  11.   var toSubmit = "{id:"+document.getElementById('field0').value+",name:'"+document.getElementById('field1').value+"',lastName:'"+document.getElementById('field2').value+"'}"; 
  12.   loader('/j2js?edit='+toSubmit+'&ts='+(new Date()).getTime()); 
  13.   return false; 
  14. } 
  15.  
  16.  
  17. function makeEditable(target){ 
  18.   if(target.innerHTML=='EDIT'){ 
  19.     var table = document.getElementById('actual'); 
  20.     var row = table.rows[1]; 
  21.     row.cells[0].innerHTML='<input type="text" id="field0" name="field0" value="'+emp.id+'" />'; 
  22.     row.cells[1].innerHTML='<input type="text" id="field1" name="field1" value="'+emp.name+'" />'; 
  23.     row.cells[2].innerHTML='<input type="text" id="field2" name="field2" value="'+emp.lastName+'" />'; 
  24.     target.innerHTML = 'SAVE'; 
  25.     return; 
  26.   } 
  27.   if(target.innerHTML=='SAVE'){ 
  28.     update(); 
  29.     refreshView(null); 
  30.     emp = null; 
  31.   } 
  32. } 
  33.  
  34.  
  35. function refreshView(target){ 
  36.   if(target==null){ 
  37.     document.getElementById('emplView').innerHTML = ''; 
  38.     return; 
  39.   } 
  40.   emp = target; 
  41.   var buffer = '<table id="actual" border="1" width="60%">'; 
  42.   buffer +=' <tr><th>ID</th><th>NAME</th><th>LAST NAME</th></tr> '; 
  43.   buffer +=' <tr><td>'+target.id+'</td><td>'+target.name+'</td><td>'+target.lastName+'</td></tr> '; 
  44.   buffer +=' <tr><td></td><td><button onclick="emp=null;refreshView(null);return false;">OK</button></td><td><button onclick="makeEditable(this);return false;">EDIT</button></td></tr> '; 
  45.   buffer += '</table>'; 
  46.   document.getElementById('emplView').innerHTML = buffer; 
  47. } 
  48.  
  49.  
  50. function loader(url){ 
  51.   var body = document.getElementsByTagName('BODY')[0]; 
  52.   var node = document.createElement('SCRIPT'); 
  53.   node.setAttribute('id','loader'); 
  54.   node.setAttribute('language','JavaScript'); 
  55.   node.setAttribute('src',''+url); 
  56.   body.appendChild(node); 
  57.   setTimeout('reset()',200); 
  58. } 
  59.  
  60.  
  61. function reset(){ 
  62.   var body = document.getElementsByTagName('BODY')[0]; 
  63.   var node = document.getElementById('loader'); 
  64.   if(node){ 
  65.     body.removeChild(node); 
  66.   } 
  67. } 

La Servlet

  1. public class Java2JsAndBackServlet extends HttpServlet { 
  2.   // 
  3.   private static final String CONTENT_TYPE = "text/html"; 
  4.   // 
  5.   private static Employee[] emps; 
  6.  
  7.   public void init() throws ServletException { 
  8.     emps = new Employee[] { 
  9.         new Employee(1, "STEFANO", "ROSSI"), 
  10.         new Employee(2, "GIOVANNI", "VERDI"), 
  11.         new Employee(3, "IVAN", "BIANCHI") 
  12.     }; 
  13.   } 
  14.  
  15.   public void doGet(HttpServletRequest request, HttpServletResponse response) throws 
  16.       ServletException, IOException { 
  17.     String editData = request.getParameter("edit"); 
  18.     if (editData != null) { 
  19.       Employee emp = js2Java(editData); 
  20.       for (int i = 0; i < emps.length; i++) { 
  21.         if (emps[i].getId() == emp.getId()) { 
  22.           emps[i] = emp; 
  23.         } 
  24.       } 
  25.      return; 
  26.     } 
  27.     String id = (id = request.getParameter("id")) == null ? "-1" : 
  28.         "".equals(id) ? 
  29.         "-1" : id; 
  30.     Employee tmp = searchById(Integer.parseInt(id)); 
  31.     response.setContentType(CONTENT_TYPE); 
  32.     PrintWriter out = response.getWriter(); 
  33.     if (tmp != null) { 
  34.       out.print(buildResponse(tmp)); 
  35.     } 
  36.   } 
  37.  
  38.   public void doPost(HttpServletRequest request, HttpServletResponse response) throws 
  39.       ServletException, IOException { 
  40.     doGet(request, response); 
  41.   } 
  42.  
  43.   private String buildResponse(Employee e) { 
  44.     StringBuffer sb = new StringBuffer(); 
  45.     sb.append("\n var e = ").append(java2Js(e)) 
  46.         .append("\n refreshView(e);"); 
  47.     return sb.toString(); 
  48.   } 
  49.  
  50.   private Employee searchById(int id) { 
  51.     if (id == -1) { 
  52.       return null; 
  53.     } 
  54.     for (int i = 0; i < emps.length; i++) { 
  55.       if (emps[i].getId() == id) { 
  56.         return emps[i]; 
  57.       } 
  58.     } 
  59.     return null; 
  60.   } 
  61.  
  62.   private String java2Js(Employee e) { 
  63.     StringBuffer sb = new StringBuffer(); 
  64.     sb.append("{ ").append("id:").append(e.getId()).append(',') 
  65.         .append("name:'").append(e.getName()).append("',") 
  66.         .append("lastName:'").append(e.getLastName()).append("'};"); 
  67.     return sb.toString(); 
  68.   } 
  69.  
  70.   private Employee js2Java(String data) { 
  71.     Employee emp = new Employee(); 
  72.     String toParse = data.replace('{', ' ').replace('}', ' ').replaceAll("'", 
  73.         ""). 
  74.         trim(); 
  75.     String[] entries = toParse.split(","); 
  76.     for (int i = 0; i < entries.length; i++) { 
  77.       String[] vals = entries[i].split(":"); 
  78.       if (vals[0].equals("id")) { 
  79.         emp.id = Integer.parseInt(vals[1]); 
  80.       } 
  81.       if (vals[0].equals("name")) { 
  82.         emp.name = vals[1]; 
  83.       } 
  84.       if (vals[0].equals("lastName")) { 
  85.         emp.lastName = vals[1]; 
  86.       } 
  87.     } 
  88.     return emp; 
  89.   } 
  90.  
  91.   /** 
  92.    * <p>Title: Classe Impiegato </p> 
  93.    */ 
  94.   public class Employee { 
  95.     // 
  96.     private int id; 
  97.     // 
  98.     private String name; 
  99.     // 
  100.     private String lastName; 
  101.  
  102.     public Employee() { 
  103.     } 
  104.  
  105.     public Employee(int id, String name, String lastName) { 
  106.       this.id = id; 
  107.       this.name = name; 
  108.       this.lastName = lastName; 
  109.     } 
  110.  
  111.     public long getId() { 
  112.       return id; 
  113.     } 
  114.  
  115.     public String getName() { 
  116.       return name; 
  117.     } 
  118.  
  119.     public String getLastName() { 
  120.       return lastName; 
  121.     } 
  122.  
  123.     public String toString() { 
  124.       return "EMPLOYEE - ID: " + getId() + " NAME: " + getName() + " LAST: " + 
  125.           getLastName(); 
  126.     } 
  127.   } 
  128.  
  129. } //END 

Informazioni sull'autore

Stefano Fago, classe 1973. Diplomato in ragioneria, ha conseguito il Diploma di Laurea in Informatica con un progetto legato alle interfacce grafiche soft-realtime in Java. Dopo esperienze in Alcatel ed Elea, ha svolto attività di consulenza come Software Developer e Trainer alla ObjectWay S.p.A. sede di Milano. Attualmente Software Designer presso la sezione Innovazione e Attività Progettuali di BPU Banca. Appassionato del linguaggio Java e di tutte le tecnolgie Object Oriented. Polistrumentista dilettante.

È possibile consultare l'elenco degli articoli scritti da Stefano Fago.

Altri articoli sul tema Tip / AJAX.

Discuti sul forum   Stampa

Cosa ne pensi di questo articolo?

Discussioni

Questo articolo o l'argomento ti ha interessato? Parliamone.