mercoledì 25 gennaio 2012

Java Web App caricamento combo da Xml

Riprendendo il post di ieri con l'introduzione della taglib personalizzata per caricare le combo aggiungiamo il caricamento delle stesse da file xml invece che direttamente da codice.

Per fare questo nella nostra WebApp inseriamo un file xml dentro una directory conf con questa struttura:

<lista>
<elemento>
<codice>01</codice>
<descrizione>Roma</descrizione>
</elemento>
<elemento>
<codice>02</codice>
<descrizione>Frosinone</descrizione>
</elemento>
<elemento>
<codice>03</codice>
<descrizione>Latina</descrizione>
</elemento>
<elemento>
<codice>04</codice>
<descrizione>Viterbo</descrizione>
</elemento>
<elemento>
<codice>05</codice>
<descrizione>Rieti</descrizione>
</elemento>
</lista>

e denominiamolo province.xml.

La classe per il caricamento è la seguente, si noti in particolare che si utilizza l'approccio DOM, essendo un file di piccole dimensioni, e che per recuperare il percorso del file contenuto nella web app si utilizza il metodo request.getSession().getServletContext().getRealPath("").
Il file xml è interno alla web-app, ma poteva anche essere esternalizzato evidentemente.

package it.xmlLoader;
import java.io.File;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DomParser {


private String file;

public DomParser(String nomeFile){
    this.file=nomeFile;
}
public  DomParser (HttpServletRequest request,String nomeFile){
   
    file=getPath(request)+File.separator+"conf"+File.separator+nomeFile;
   
   
}
private String getPath(HttpServletRequest request){
   
    return request.getSession().getServletContext().getRealPath("");
}


public Map<String,String> getValoriCombo(){
    Map<String,String> myMap=null;
    try
    {
        myMap=new LinkedHashMap<String, String>();
        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
        DocumentBuilder db=dbf.newDocumentBuilder();
       
        Document doc = db.parse(new File(file));
        doc.normalize();
        NodeList nd=doc.getElementsByTagName("elemento");
      
        for(int i=0;i<nd.getLength();i++){
            Node nodo=nd.item(i);
             if (nodo.getNodeType() == Node.ELEMENT_NODE) {
                 
                  Element eElement = (Element) nodo;
                  String chiave=getTagValue("codice", eElement);
                  String valore=getTagValue("descrizione", eElement);
                  myMap.put(chiave, valore);
     
               }
        }
    }
    catch(Exception ex){
        ex.printStackTrace();
    }
   
    return myMap;
}
private  String getTagValue(String sTag, Element eElement) {
 NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
 
  Node nValue = (Node) nlList.item(0);
 
    return nValue.getNodeValue();
  }
}


Nella jsp avremo invece:

<%@page import="it.xmlLoader.DomParser"%>
<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib prefix="com" uri="http://gbresci.blogspot.com/taglib"%> 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Combo Test</title>
</head>
<body>
<% DomParser dm=new DomParser(request,"province.xml");
  
   
    request.setAttribute("COMBOLIST", dm.getValoriCombo());
%>
Lista: <com:combo lista="${COMBOLIST}" name="cmbList" primoVuoto="true"/><br>
<br><br>
Lista 2: <com:combo lista="${COMBOLIST}" name="cmbList" style="color:red;" primoVuoto="false" concatenaDescrizione="true"/>
</body>
</html>

Nessun commento:

Posta un commento