Wednesday, March 9, 2011

File Upload with Servlet 3.0

Servlet 3.0 has come with bunch of exciting features. File upload is one among the new feature available in servlet 3.0.

In earlier versions of servlet, file upload required commons api. In version 3.0 this feature is embedded in servlet api itself.

Here is a example to brief on file upload in servlet 3.0

FileUploadServlet is a servlet which extends HttpServlet and overrides doPost() method. To use file upload feature of servlet 3.0,
• MultipartConfig annotation has to specified on servlet, indicating that instance of the servlet expect request that conform to the multipart/form-data MIME type.

• Request object is provided with an API request.part(fileName), to get part or form item that was received within a multipart/form-data post request.


package com.jb;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@MultipartConfig
@WebServlet(name="FileUploadServlet", urlPatterns={"/FileUploadServlet"})
public class FileUploadServlet extends HttpServlet {
   
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        doPost(request, response);
    } 
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

        System.out.println("do post of file upload...");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        Part part = request.getPart("fileName");
        InputStream is = part.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        FileWriter fw = new FileWriter("c:/temp/tmp.txt");
        BufferedWriter bw = new BufferedWriter(fw);
        String line = null;
        while((line = br.readLine())!=null){
        bw.write(line);
        bw.newLine();
        }
        bw.close();
        br.close();
        out.write("File Uploaded successfully...");
        out.close();
    }
}

A jsp form to upload file to servlet is here.

Monday, March 7, 2011

Hibernate Annotation Many-to-Many

Realizing the relations between entity is a tedious part in hibernate. Here i will explain a Many-to-Many relationship using hibernate annotations with an example.

Lets consider a relation between Product and Category. A product can belong to any number of categories and category can have many products. Hence relation between Product and Category is Many-to-Many.

In the database, Many-to-Many is realized by using an intersection table holding product_id and category_id as foreign keys to corresponding tables.







In hibernate, product and category are considered as entities and product_category_ix is used as joining table to realize Many-to-Many.

Product.java
package com.jb.data;

import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="product")
public class Product {

    private long id;
    private String name;
    private Set categories;

    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="product_id")
    public long getId() {
        return id;
    }

    @Column(name="name")
    public String getName() {
        return name;
    }

    public void setId(long id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name="product_category_ix", joinColumns={@JoinColumn(name="product_id")},
        inverseJoinColumns={@JoinColumn(name="category_id")})
    public Set getCategories() {
        return categories;
    }

    public void setCategories(Set categories) {
        this.categories = categories;
    }
    
}



Category.java
package com.jb.data;

import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="category")
public class Category {

    private long id;
    private String name;
    private Set products;

    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="category_id")
    public long getId() {
        return id;
    }

    @Column(name="name")
    public String getName() {
        return name;
    }

    public void setId(long id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name="product_category_ix",
        joinColumns={@JoinColumn(name="category_id")},
        inverseJoinColumns={@JoinColumn(name="product_id")})
    public Set getProducts() {
        return products;
    }

    public void setProducts(Set products) {
        this.products = products;
    }
    
}


HibernateUtil.java
package com.jb.util;

import com.jb.data.Category;
import com.jb.data.Lead;
import com.jb.data.Product;
import com.jb.data.contactList;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {

    private static final SessionFactory sessionFactory;
    private static Session session;
    static {
        try {

                AnnotationConfiguration configuration = new AnnotationConfiguration();
                configuration.addAnnotatedClass(contactList.class);
                configuration.addAnnotatedClass(Lead.class);
                configuration.addAnnotatedClass(Product.class);
                configuration.addAnnotatedClass(Category.class);
                configuration.configure();
                                        
                sessionFactory = configuration.buildSessionFactory();

        } catch (Throwable ex) {
                System.err.println("Initial SessionFactory creation failed." + ex);
                throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
            return sessionFactory;
    }

    public static Session getSession() {
        session = getSessionFactory().openSession();
        
        return session;
    }


ProductService.java
package com.jb.service;

import com.jb.dao.CategoryDao;
import com.jb.dao.ProductDao;
import com.jb.data.Category;
import com.jb.data.Product;
import java.util.LinkedHashSet;
import java.util.Set;

public class ProductService {

    public List getCategories(){

        List categories = new ArrayList();
        
        Set products = new LinkedHashSet();

        Product epson = new Product();
        epson.setName("EPSON");
        products.add(epson);

        Product hp = new Product();
        hp.setName("HP");
        products.add(hp);

        Category category = new Category();
        category.setName("Laser Printer");
        category.setProducts(products);
        categories.add(category);

        category = new Category();
        category.setName("Ink Jet Printer");
        category.setProducts(products);
        categories.add(category);
        
        return categories;
    }
    
    public static void main(String[] arg){
        System.out.println("processing main...");

        ProductService productService = new ProductService();
        List categories = productService.getCategories();
        CategoryDao categoryDao = new CategoryDao();
        categoryDao.saveCategories(categories);

        System.out.println("Done..!");
    }
} 


CategoryDao.java
package com.jb.dao;

import com.jb.data.Category;
import com.jb.util.HibernateUtil;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class CategoryDao {

    public void saveCategory(Category category) {
       System.out.println("save...");
       Session session = HibernateUtil.getSession();
       Transaction transaction = session.beginTransaction();
       session.save(category);
       transaction.commit();
    }

    public void saveCategories(List categories) {

       System.out.println("save...");
       Session session = HibernateUtil.getSession();
       Transaction transaction = session.beginTransaction();
        for (Category category : categories) {
            session.save(category);
        }
       transaction.commit();
    }
}
After running main program, db tables (category, product and product_category_ix) will be updated with new entries.

category:







product:







product_category_ix:


Tuesday, March 1, 2011

Servlet 3.0 (part-2)

This article is continued from Servlet 3.0 (part-1). Here i will try to brief on programmatic adding of Servlet, Filters and Listeners to ServletContext object.

As per Servlet 3.0 Specs, any of these components (servlet, filter or listener) should be added during initialization of servletContext object, contextInitialized(ServletContextEvent sce) method of ServletContextListener API is a better place to add servlet and other components to context object.

A simple example to add a Servlet to ServletContext:

UserHomeServlet is a servlet which has to be registered to context programmatically.

public class UserHomeServlet extends HttpServlet {
   
    /** 
     * Handles the HTTP GET method.
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            RequestDispatcher rd = request.getRequestDispatcher("userHome.jsp");
            rd.forward(request, response);
        } finally {
            out.close();
        }
    } 

    /** 
     * Handles the HTTP POST method.
      */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        doGet(request, response);
    }
    
}


Implement ServletContextListener to provide realization for contextInitialized() method

@WebListener
public class CustServletContextListener implements ServletContextListener{

    public void contextInitialized(ServletContextEvent sce) {

        System.out.println("init context method");

        try{
            //add UserHomeServlet to context.
            ServletRegistration userHome = sce.getServletContext().addServlet("userHome", UserHomeServlet.class);
            //provide url pattern for UserHomeServlet.
            userHome.addMapping("/userHome");
        }catch(Exception e){
            e.printStackTrace();
        }
        
    }

    public void contextDestroyed(ServletContextEvent sce) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}


Similarly a Filter and Listener can be registered to context as below:

* Filter
public void contextInitialized(ServletContextEvent sce) {

        try{

            //add UserFilter to Context.
            FilterRegistration userFilter = sce.getServletContext().addFilter("userFilter", UserrequestFilter.class);
            //provide servlet name to filter.
            userFilter.addMappingForServletNames(null, true, "com.jb.UserHomeServlet");

        }catch(Exception e){
            e.printStackTrace();
        }
   }

* Listener

public void contextInitialized(ServletContextEvent sce) {

   try{

            //register UserRequestListener to context.
            sce.getServletContext().addListener(UserRequestListener.class);
            
        }catch(Exception e){
            e.printStackTrace();
        }
        
    }