DOM and SAX Parser


In this tutorial we will see about DOM and SAX parser along with simple Java code to parse the XML. 

Common XML document which we are going to use for both DOM and SAX parser are 


SAMPLE XML:
<?xml version="1.0" encoding="UTF-8"?>
<organization>
 <employee mode="permanent">
  <name>John</name>
  <empid>1234</empid>
  <designation>SE</designation>
  <technology>Java</technology>
 </employee>
 <employee mode="contract">
  <name>David</name>
  <empid>4545</empid>
  <designation>Manager</designation>
  <technology>.NET</technology>
 </employee>
</organization>


DOM Parser:

Document Object Model (DOM) parser will creates a complete tree structure in memory from the XML provided and reads each node values as and when required. 

The advantage of DOM parser is provided with lot of rich functionality where developers can make use without any additional coding. Also when the document loaded into memory developers can access any part of the DOM tree and can modify.

Disadvantages are need more memory in case of huge document in size. 
it takes a little bit longer to learn how to work with it.



DOM Parser for above XML document:



import java.io.File;
import java.io.IOException;
import org.w3c.dom.*;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;

public class DOMParser {

 public static void main(String[] args) {
  String file = "document.xml";
  
  parseXMLUsingDOM(file);
 }
 
 public static void parseXMLUsingDOM(String file){
  
  try {
   DocumentBuilderFactory builderFac = DocumentBuilderFactory.newInstance();
   DocumentBuilder builder = builderFac.newDocumentBuilder();
      Document doc = builder.parse(new File(file));

      System.out.println ("ROOT: " + doc.getDocumentElement().getNodeName());
            NodeList list = doc.getElementsByTagName("employee");
            System.out.println("No. Of Employees: " + list.getLength());
            
            for(int i= 0; i<list.getLength(); i++){
                    Node node = list.item(i);
                    if(node.getNodeType() == Node.ELEMENT_NODE) {
                        Element element = (Element)node;
                        System.out.println("\nEMP MODE: "+element.getAttribute("mode"));
                        
                        NodeList nList = element.getElementsByTagName("name");
                        Element nElement = (Element)nList.item(0);
                        NodeList tList = nElement.getChildNodes();
                        System.out.println("NAME: " + ((Node)tList.item(0)).getNodeValue().trim());
                        
                        nList = element.getElementsByTagName("empid");
                        nElement = (Element)nList.item(0);
                        tList = nElement.getChildNodes();
                        System.out.println("EMP_ID: " + ((Node)tList.item(0)).getNodeValue().trim());
                        
                        nList = element.getElementsByTagName("designation");
                        nElement = (Element)nList.item(0);
                        tList = nElement.getChildNodes();
                        System.out.println("DESIGNATION: " + ((Node)tList.item(0)).getNodeValue().trim());
                        
                        nList = element.getElementsByTagName("technology");
                        nElement = (Element)nList.item(0);
                        tList = nElement.getChildNodes();
                        System.out.println("TECHNOLOGY: " + ((Node)tList.item(0)).getNodeValue().trim());
                    }
            }            
     } catch (ParserConfigurationException e) {
      e.printStackTrace();  
  } catch (SAXException e) {
      e.printStackTrace();
  } catch (IOException e) {
      e.printStackTrace();
  } 
 }
}


OUTPUT:

ROOT: organization
No. Of Employees: 2

EMP MODE: permanent
NAME: John
EMP_ID: 1234
DESIGNATION: SE
TECHNOLOGY: Java

EMP MODE: contract
NAME: David
EMP_ID: 4545
DESIGNATION: Manager
TECHNOLOGY: .NET



SAX Parser:

Simple API for XML (SAX) parser will not create any internal tree structure as like DOM. It just search for the component occurrences as per input and it will gives the values. Always SAX parser will read only specific document values as requested. 

As advantage SAX parser is much more space efficient in case of a huge document, because its not creating complete tree structure like DOM. Next its faster and easy to implement with basic needs. 
From functionality side it serves less as compared to DOM.


SAX Parser for above XML document:

import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXParserDemo {
 
 public static void main(String[] args) {
  String file = "document.xml";
  
  parseXMLUsingSAX(file);
 }
 
 public static void parseXMLUsingSAX(String file) {
  try{
   DefaultHandler handler = createHandler();
   
   SAXParserFactory factory = SAXParserFactory.newInstance();
   SAXParser parser = factory.newSAXParser();
   
   parser.parse(file, handler);
   
  }catch (ParserConfigurationException  e) {
   e.printStackTrace();
  }catch (SAXException e) {
   e.printStackTrace();
  }catch (IOException e) {
   e.printStackTrace();
  }
 }
 
 public static DefaultHandler createHandler(){
  DefaultHandler handler = null;
  try{
   handler = new DefaultHandler(){
    boolean fName = false;
    boolean fEmpId = false;
    boolean fDesig = false;
    boolean fTech = false;
    public void startElement(String uri, String vName, String tagName, Attributes attri){
     try{
      if(tagName.equalsIgnoreCase("employee")){
       System.out.println("\nMODE: " + attri.getValue("mode"));
      }
      if(tagName.equalsIgnoreCase("name")) fName = true;
      if(tagName.equalsIgnoreCase("empid")) fEmpId = true;
      if(tagName.equalsIgnoreCase("designation")) fDesig = true;
      if(tagName.equalsIgnoreCase("technology")) fTech = true;
     }catch (Exception e) {
      e.printStackTrace();
     }     
    }
    
    public void characters(char chars[], int id, int size) throws SAXException {
     if (fName) {
      System.out.println("NAME: " + new String(chars, id, size));
      fName = false;
     }else if (fEmpId) {
      System.out.println("EMP_ID: " + new String(chars, id, size));
      fEmpId = false;
     }else if (fDesig) {
      System.out.println("DESIGNATION: " + new String(chars, id, size));
      fDesig = false;
     }else if (fTech) {
      System.out.println("TECHNOLOGY: " + new String(chars, id, size));
      fTech = false;
     }    
    }
   };
   
  }catch (Exception e) {
   e.printStackTrace();
  }
  return handler;
 }
}


OUTPUT:

MODE: permanent
NAME: John
EMP_ID: 1234
DESIGNATION: SE
TECHNOLOGY: Java

MODE: contract
NAME: David
EMP_ID: 4545
DESIGNATION: Manager
TECHNOLOGY: .NET









Java Interview Questions - 3



Java Interview Questions



1. Which is the base class for all classes in java?

Object class.


2. What are methods in object class in java?

clone() - Creates and returns a copy of this object.

equals(Object obj) - Indicates whether some other object is "equal to" this one.

finalize() - Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.

getClass() - Returns the run-time class of an object.

hashCode() - Returns a hash code value for the object.

notify() - Wakes up a single thread that is waiting on this object's monitor.

notifyAll() - Wakes up all threads that are waiting on this object's monitor.

toString() - Returns a string representation of the object.

wait() - Causes current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.

wait(long timeout) - Causes current thread to wait until either another thread invokes the notify() method or the notifyAll() method for this object, or a specified amount of time has elapsed.

wait(long timeout, int nanosec) - Causes current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object, or some other thread interrupts the current thread, or a certain amount of real time has elapsed.


3. Program to remove any given character from a String?


public class RemoveChar {
 
 public static void main(String[] args) {
  String line = "A simple implementation of Bindings backed";
  char chr = 'i';
  String finalStr = new RemoveChar().removecharater(line, chr);
  
  System.out.println("INPUT:  "+line);
  System.out.println("CHAR TO REMOVE: "+chr);
  System.out.println("\nOUTPUT: "+finalStr);
 }
 
 public String removecharater(String line, char chr){
  char[] charArr = line.toCharArray();
  StringBuilder strBuilder = new StringBuilder();
  
  for (char c : charArr) {
   if(c != chr){
    strBuilder.append(c);
   }   
  }  
  return strBuilder.toString();
 }
}


OUTPUT:


INPUT:  A simple implementation of Bindings backed
CHAR TO REMOVE: i

OUTPUT: A smple mplementaton of Bndngs backed




4. Find no. of occurances of each character in a given string?


public class CharOccurance {

 public static void main(String[] args) {
  String line = "implementation";
  
  HashMap<Character, Integer> charCounts = getCharCounts(line);
  
  System.out.println("INPUT:  "+line);
  System.out.println("RESULT: "+charCounts);  
 } 
 
 public static HashMap<Character, Integer> getCharCounts(String line){
  HashMap<Character, Integer> charCounts = new HashMap<Character, Integer>();
  char[] chr = line.toCharArray();
  for (char c : chr) {
   if(charCounts.containsKey(c)){
    int cnt = charCounts.get(c);
    charCounts.put(c, cnt+1);
   }else{
    charCounts.put(c, 1);
   }
  }  
  return charCounts;
 } 
}

OUTPUT:


INPUT:  implementation
RESULT: {t=2, e=2, a=1, p=1, n=2, o=1, l=1, m=2, i=2}


5. Find second highest number in an integer array?


public class SecondHighest {

 public static void main(String[] args) {
  int[] values = {8,4,1,3,7,6,5,2,9};
  
  // Sorting array into TreeSet
  Set<Integer> tree = new TreeSet<Integer>();
  for (int i : values) {
   tree.add(i);
  }
  
  // Copy TreeSet values into ArrayList
  List<Integer> list = new ArrayList<Integer>();
  list.addAll(tree);
  
  // Print last 2nd value for 2nd Hignest value
  System.out.println("SECOND HIGHEST : "+list.get( list.size()-2 ));  
 }  
}

OUTPUT:


SECOND HIGHEST : 8


6. How to read/write/append/delete a file?

Please refer to the earlier post for complete all file operations. - http://javadiscover.blogspot.com/2013/03/how-to-create-writeappend-read-delete.html 


7. What are the ways we can create threads in java?

By 2 ways we can create thread 
a. Extending Thread class
b. Implementing Runnable interface 


8. How to create a Thread using extending a Thread class?



public class MyThread extends Thread{
 
 @Override
 public void run() {
  int i=0;
  while(i<5){
   System.out.println(Thread.currentThread().getName());
   i++;
  }
 }
 
 public static void main(String[] args) {
  MyThread t1 = new MyThread();
  MyThread t2 = new MyThread();
  t1.start();
  t2.start();
 }
}


OUTPUT:


Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0




9. How to create a Thread using implemeting Runnable interface ?


public class MyThread implements Runnable{
 
 public void run() {
  int i=0;
  while(i<5){
   System.out.println(Thread.currentThread().getName());
   i++;
  }
 }
 
 public static void main(String[] args) {
  MyThread obj = new MyThread();
  Thread t1 = new Thread(obj);
  Thread t2 = new Thread(obj);
  t1.start();
  t2.start();
 }
}

OUTPUT:


Thread-0
Thread-1
Thread-0
Thread-1
Thread-0
Thread-1
Thread-0
Thread-1
Thread-0
Thread-1


10. What are different types of cloning in Java?

There are 2 types of cloning in Java, Deep and shallow cloning (Copy). By default shallow copy is used in Java. As we seen in 2nd question by Object class clone() will do this operation by default. 







Simple login page using JSP

Today we will see about creating simple login page using JSP. For this tutorial we have used 
  • Eclipse
  • Apache Tomcat (Web Server)
  • Postgres Database

In this example lets start with simple JSP page which will have username and password field with login button. Also wwe have used javascript to validate text fields. In back-end we have created database connection and validating the username and password are valid or not. If its valid then we are returning true else false to the JSP page.

In JSP page if the returned value is true then we are redirecting to success.jsp else displaying error message in same page.

We have done very basic login page which will be understandable for beginners. There are lot and lot of tools and frameworks which we can use and make our web pages more powerful and rich in UI. But we have this taken simple way to start with login page.

To Be Ready with:

i. JDK 1.5 and above should be installed in the machine

ii. Download Eclipse J2EE version according to your machine and OS and install - http://www.eclipse.org/downloads/ 

iii. Download Apache Tomcat web server and install - http://tomcat.apache.org/download-60.cgi

iv. Download and install Postgres database or any other database according to your choice - http://www.postgresql.org/download/

v. Download necessary database driver jar files. In case of Postgres we need to download postgres SQL JDBC driver - http://jdbc.postgresql.org/download.html


Step - 1: Create Dynamic web project in Eclipse

File -> New -> Dynamic Web Project



Step - 2: Add database driver in project Libraries 
Right click Project -> Properties -> Java Build Path -> Libraries -> Add External JARs




Step - 3: Create simple login.jsp 


<%@page import="com.javadiscover.login.LoginValidate"%>
<%@ 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">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Please Login....</title>

<script type="text/javascript">
    function validate_required(field, alerttxt) {
        with (field) {
            if (value == null || value == "") {
                alert(alerttxt);
                return false;
            }
            else {
                return true;
            }
        }
    }

    function validate_Loginform(thisform) {
        with (thisform) {
            if (validate_required(username, "Please enter the username") == false)
            {
                username.focus();
                return false;
            }

            if (validate_required(password, "Please enter the password") == false)
            {
                password.focus();
                return false;
            }
            return true;
        }
    }
</script>
</head>
<body>


<%
 String msg = "";
 String uname = request.getParameter("username");
 String password = request.getParameter("password");
 if(uname != null && password != null && uname.length() > 0 && password.length() > 0){
  LoginValidate obj = new LoginValidate();
  boolean flag = obj.validateUserLogin(uname, password);
  if(flag){
   request.getRequestDispatcher("success.jsp").forward(request, response);
  }else{
   msg = "Invalid username or password";
  }
 }
%>

 <form action="login.jsp" method="post" onsubmit="return validate_Loginform(this)">
  <table width="40%" border="1" align="center">
   <tr>
    <th colspan="2" align="center" valign="top">Please enter login details</th>
   </tr>
   <tr height="50">
    <td valign="middle" align="right">User Name</td>
    <td align="left"><input name="username" size="20" value=""  type="text">
    </td>
   </tr>
   <tr>
    <td valign="middle" align="right">Password</td>
    <td align="left"><input name="password" size="20" value=""  type="password">
    </td>
   </tr>
   <tr height="40">
    <td colspan="2" align="center"><input value="Login" name="B1" type="submit"></td>
   </tr>
  </table>
  
  <br>
  <br>
  <br>
  <br>
  
  <p align="center"> <b><font color="darkred"><%=msg %></font></b></p>

 </form>
</body>
</html>



Step - 4: Create LoginValidate.java page
package com.javadiscover.login;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @author Java Discover
 */
public class LoginValidate {
 
 public boolean validateUserLogin(String uname, String pwd){
  boolean flag = false;
  Connection con = null;
  try{
   con = createConnection();
   if(con != null){
    Statement stat = con.createStatement();
    String qry = "SELECT * FROM tbl_login_master WHERE uname = '"+uname+"' AND password = '"+pwd+"' ";
    ResultSet rs = stat.executeQuery(qry);
    if(rs.next()){
     flag = true;
    }
   }
  }catch (Exception e) {
   e.printStackTrace();
  }finally{
   if(con != null){
    try {
     con.close();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
  }
  return flag;
 }
 
 public Connection createConnection() {
  System.out.println("Createung postgres DataBase Connection");
  Connection connection = null;

  try {
   
   // Provide database Driver according to your database
   Class.forName("org.postgresql.Driver");
   
   // Provide URL, database and credentials according to your database 
   connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydatabase", "javadiscover","postgres");

  } catch (Exception e) {
   e.printStackTrace();
   return null;
  }
  if(connection != null){
   System.out.println("Connection created successfully....");
  }
  return connection;
 }
}




Step - 5: Create success.jsp 

<%@ 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">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<%
 String uname = request.getParameter("username");
%>
 <h1>Hi <%=uname%>, Successfully Logged in.....</h1>
</body>
</html>



Step - 6: Make sure database and table present in your database

As per above code Database : mydatabase
Table : tbl_login_master
Credentials:
Username: javadiscover
Password: postgres



Step - 7: Start server and test your application by login.jsp page



Project Explorer:



Login Page:



Success Login Page:




Failure Login Page: