Friday, 5 October 2012

Hibernate doesn't see external changes made to the database either directly or through another software/application

hello Guys,

I've been looking into this issue since past one week.
I've got information about hibernate cache types and using different cache types.
I tried using ehcache for my database and decreasing the cache time for one of my entities, but it didn't worked. Even waiting for about 10 times more than the refresh period set in ehcache.xml.
I even tried using StatelessSessions. I've tried many other things also, but none of them seemed to be working.

I suffered for a week without any result.

Yesterday I was surfing the internet about the same and soon I had the idea of using a transaction since hibernate must validate the database before inserting (just come up as a thought, nothing to do with how actually hibernate works).

So I myself invented a new technique, although it'll slow up your application, but for now atleast I can go with it, instead of having a buggy feature of not showing database update by hibernate. Below is what I used:

RESULT 

Use Transaction in every select query you make along with all insert, update & delete queries.
So the main idea is to use a Transaction every time one has to query the database, no matter what type of query.

E.g.

Earlier Code :


Session sess = NewHibernateUtil.getSessionFactory().openSession();
        SQLQuery q = sess.createSQLQuery("select * from user where iduser=(select iduser from account where idaccount"
                + "=:idaccount)");
        q.setInteger("idaccount", idaccount);
        q.addEntity(User.class);
        User u = (User) q.uniqueResult();
        sess.close();



New Code :


Session sess = NewHibernateUtil.getSessionFactory().openSession();
        Transaction tx = sess.beginTransaction();
        SQLQuery q = sess.createSQLQuery("select * from user where iduser=(select iduser from account where idaccount"
                + "=:idaccount)");
        q.setInteger("idaccount", idaccount);
        q.addEntity(User.class);
        User u = (User) q.uniqueResult();
        tx.commit();
        sess.close();

Monday, 9 July 2012

Skype blocks 80 & 443 and hence prevents XAMPP & WAMP

hey! friends,

From a couple of days, I was trying and installing XAMPP but was unable to start it. I was unable to figure out what is going wrong.

I thought may I had old XAMPP version installed, so I downloaded the latest version.
But installing the latest version doesn't help. Still I was unable to start.

Then I tried a bit googling and came up with the following command :
netstat -a -b

And I came to know that skype was using those two ports, I was shocked to see that and then I searched for how to prevent skype from using those ports and the result was found in just a couple of seconds (Google is great).

I'm attaching the screenshot, so that it may help others having the same problem.


Comments are always welcome, let me know your suggestions and problems.

Monday, 12 March 2012

SCJP - Sun Certified Java Programmer




Sun Certified Java Programmer for Java Platform 1.6

How to become an SCJP within a week ?

STEPS :

LongCut (the way of knowledge) : 
1. If good in Java Core, read SCJP 6 by Kathie Sierra
2. When done read the summary of this book Summary of SCJP 6 book (my words)
3. Revise the SCJP 6 by Kathie Sierra atleast once again.
4. Now give some dummy exams.
    Dummy/Practice Exams :
         4.1 Test Lab
         4.2 Test Lab Files
         4.3 Exam Lab I
         4.4 Exam Lab II
         4.5 SCJP Trail I
         4.6 SCJP Trail II
         4.6 E-PAD
         4.6 Practice PDF
5. Again revise SCJP 6 by Kathie Sierra once again to make sure, you haven't forgotten anything.
6. Go and buy a exam voucher from a PROMETRIC CENTRE and give the exam.
7. Congrats!!! Now you are a Sun Certified Java Programmer

ShortCut(hardly 1 week)
1. Directly start with practice exams. (Download links available above)
2. Practice 2-3 times.
3. Go and buy a exam voucher from a PROMETRIC CENTRE and give the exam, you will definitely qualify, trust me.
4. Congrats!!! Now you are a Sun Certified Java Programmer




Comments are always WELCOME.

Saturday, 3 March 2012

hey, now you know what technical analysis is.
lets have a taste of   "What fundamental analysis means in Forex Trading. "

Fundamental analysis is a way of looking at the market by analyzing economic, social, and political forces that affects the supply and demand of an asset. If you think about it, this makes a whole lot of sense! 




Just like in your Economics  class, it is supply and demand that determines price.




You can relate this economic term supply and demand in forex as  if:








In essence:::


 Higher currency value    =>   Good economy => means price of currency will increase in future
 Lower currency value    =>   Bad economy  =>  means value of currency will decrease in future


Hope this will help you in figure out what is fundamental analysis means.

How to analyse Technically :::   

The key point in technical analysis is to study charts, trends,  patterns and history of market trends.


have you ever heard the old adage,     "History tends to repeat itself"












The heart of forex trading is study of chart.
You can look at past data to help you spot trends and patterns which could help you find some great trading opportunities.

we will see more detail on technical analysis in up coming post.











Learn ForEx:::
How to analyse market  ?

Well, Here is your solution  :

Three Types of Market Analysis

To begin, let's look at three ways on how you would analyze and develop ideas to trade the market. There are three basic types of market analysis:

  1. Technical Analysis
  2. Fundamental Analysis
  3. Sentiment Analysis
Three-legged stool

Saturday, 11 February 2012

how to load css files in struts2


I was facing a problem since a very long time. Many a times when a request is made to my website, it doesn't gets properly rendered as if the CSS is not functioning and 3 weeks later I found the bug.
For adding CSS I was doing this :
<link rel="stylesheet" href="<s:url value="/"/>css/style.css" type="text/css">

due to which in case of the first request to my site it was rendered as
<link rel="stylesheet" href="/onlinexamples;jessionid=13241342154797/css/style.css" type="text/css">

As you can see above, due to the presence of jessionid the whole href url goes wrong. And with further subsequent requests, tomcat figured out that the cookies were enabled so it started rendering as
<link rel="stylesheet" href="/onlinexamples/css/style.css" type="text/css">
and hence from second request onwards everything worked fine.

The solution I applied is instead of using <s:url> I used EL's pageContext.request.contextPath as
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css">


Struts2 Jquery SubGrid


Hello,
Are you amazed by the Struts2 Jquery Grid Showcase and trying to implement a Struts2 Jquery SubGrid but unable to figure out whats going wrong. Already spent hours figuring out the solution? Then you are at the right place.
This is a complete working example project in Netbeans 6.9 showcasing Struts2 Jquery SubGrid functionality, simply resolve the references and get going.

Description:

This is the structure of the Netbeans Project


Models- 1. Student (idstudent,name,address,email,phoneno)
               2. StuTrans (idstudent,amount,desc)
As specified Student.java and StuTrans.java depicts the above mentioned structure as a POJO with getters/setters of attributes.

StudentDAO.java

package dao;

import java.util.ArrayList;
import java.util.List;
import model.Student;

public class StudentDAO {

    private static List<Student> stuLst = new ArrayList<Student>();
    static {
        for (int i = 1; i < 30; i++) {
            stuLst.add(new Student(i*10, " name " + i, "address " + i, "email " + i, 999999999 + i));
        }
    }
    public static List<Student> buildList() {
        return stuLst;
    }

    public static int count() {
        return stuLst.size();
    }

    public static List<Student> find(int o, int q) {
        return stuLst.subList(o, q);
    }

    public static void save(Student c) {
        stuLst.add(c);
    }

    public static Student findById(Integer id) {
        for (Student c : stuLst) {
            if (c.getIdstudent() == id) {
                return c;
            }
        }
        return null;
    }

    public static void update(Student c) {
        for (Student x : stuLst) {
            if (x.getIdstudent() == c.getIdstudent()) {
                x.setName(c.getName());
            }
        }
    }

    public static void delete(Student c) {
        for (Student x : stuLst) {
            if (x.getIdstudent() == c.getIdstudent()) {
                stuLst.remove(x);
            }
        }
    }
}

StuTransDAO.java
package dao;

import java.util.ArrayList;
import java.util.List;
import model.StuTrans;

public class StuTransDAO {

    private static List<StuTrans> stuLst = new ArrayList<StuTrans>();

    static {
        for (int i = 1; i < 30; i++) {
            for (int j = 1; j < 5; j++) {
                stuLst.add(new StuTrans(i*10, i * Math.PI + 100, "desc " + i));
            }
        }
    }

    public static List<StuTrans> buildList() {
        return stuLst;
    }

    public static int count() {
        return stuLst.size();
    }

    public static List<StuTrans> find(int o, int q) {
        return stuLst.subList(o, q);
    }

    public static void save(StuTrans c) {
        stuLst.add(c);
    }

    public static List<StuTrans> findById(Integer id) {
        List<StuTrans> temp=new ArrayList<StuTrans>();
        for (StuTrans c : stuLst) {
            if (c.getIdstudent() == id) {
                temp.add(c);
            }
        }
        return temp;
    }

    public static void update(StuTrans c) {
        for (StuTrans x : stuLst) {
            if (x.getIdstudent() == c.getIdstudent()) {
//                x.setName(c.getName());
            }
        }
    }

    public static void delete(StuTrans c) {
        for (StuTrans x : stuLst) {
            if (x.getIdstudent() == c.getIdstudent()) {
                stuLst.remove(x);
            }
        }
    }
}

actTransaction.java & actStudent.java are almost similar in the fashion that their task is to supply JSON to be displayed in the JQGrid. Both of them returns the fore-mentioned POJOs as JSONs.

actStudent.java
package actions;

import com.opensymphony.xwork2.ActionSupport;
import dao.StudentDAO;
import java.util.ArrayList;
import java.util.List;
import model.Student;

public class actStudent extends ActionSupport {// get index row - i.e. user click to sort.

    private String sidx;
    // Search Field
    private String searchField;
    // The Search String
    private String searchString;
    // he Search Operation ['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc']
    private String searchOper;
    // Your Total Pages
    private Integer total = 0;
    //Your result List
    private List<Student> gridModel;
    private List<Student> myList;
    //get how many rows we want to have into the grid - rowNum attribute in the grid
    private Integer rows = 0;
    //Get the requested page. By default grid sets this to 1.
    private Integer page = 0;
    // sorting order - asc or desc
    private String sord;
    private boolean loadonce = false;

    public boolean getLoadonce() {
        return loadonce;
    }

    public void setLoadonce(boolean loadonce) {
        this.loadonce = loadonce;
    }

    public String getSearchField() {
        return searchField;
    }

    public void setSearchField(String searchField) {
        this.searchField = searchField;
    }

    public String getSearchOper() {
        return searchOper;
    }

    public void setSearchOper(String searchOper) {
        this.searchOper = searchOper;
    }

    public String getSearchString() {
        return searchString;
    }

    public void setSearchString(String searchString) {
        this.searchString = searchString;
    }

    public List<Student> getGridModel() {
        return gridModel;
    }

    public void setGridModel(List<Student> gridModel) {
        this.gridModel = gridModel;
    }

    public Integer getPage() {
        return page;
    }

    public String getSidx() {
        return sidx;
    }

    public void setSidx(String sidx) {
        this.sidx = sidx;
    }

    public String getSord() {
        return sord;
    }

    public void setSord(String sord) {
        this.sord = sord;
    }

    public void setPage(Integer page) {
        this.page = page;
    }

    public Integer getRecords() {
        return records;
    }

    public void setRecords(Integer records) {
        this.records = records;
        if (this.records > 0 && this.rows > 0) {
            this.total = (int) Math.ceil((double) this.records / (double) this.rows);
        } else {
            this.total = 0;
        }
    }

    public Integer getTotal() {
        return total;
    }

    public void setTotal(Integer total) {
        this.total = total;
    }
    // All Record
    private Integer records = 0;

    public String execute() {
        System.out.println("grid action execute called");
        myList = StudentDAO.buildList();
        setRecords(myList.size());

        int to = (getRows() * getPage());
        int from = to - getRows();
        if (to > getRecords()) {
            to = getRecords();
        }

        System.out.println("loadonce : " + loadonce);
        if (loadonce) {
            System.out.println("returned from loadonce");
            setGridModel(myList);
        } else {
            if (searchString != null && searchOper != null) {
                //All searches here....
            } else {
                setGridModel(StudentDAO.find(from, to));
            }
        }
        total = (int) Math.ceil((double) getRecords() / (double) getRows());
        return SUCCESS;
    }

    public Integer getRows() {
        return rows;
    }

    public void setRows(Integer rows) {
        this.rows = rows;
    }

    public String getJSON() {
        return execute();
    }
}

actTransaction.java
package actions;

import com.opensymphony.xwork2.ActionSupport;
import dao.StuTransDAO;
import java.util.List;
import model.StuTrans;

public class actTransaction extends ActionSupport {

    private Integer records = 0;
    private Integer id;
    private String sidx;
    // Search Field
    private String searchField;
    // The Search String
    private String searchString;
    // he Search Operation ['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc']
    private String searchOper;
    // Your Total Pages
    private Integer total = 0;
    //Your result List
    private List<StuTrans> gridModel;
    private List<StuTrans> myList;
    //get how many rows we want to have into the grid - rowNum attribute in the grid
    private Integer rows = 0;
    //Get the requested page. By default grid sets this to 1.
    private Integer page = 0;
    // sorting order - asc or desc
    private String sord;
    private boolean loadonce = false;

    public Integer getId() {
        return id;
    }

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

//    public boolean getLoadonce() {
//        return loadonce;
//    }
    public void setLoadonce(boolean loadonce) {
        this.loadonce = loadonce;
    }

    public String getSearchField() {
        return searchField;
    }

    public void setSearchField(String searchField) {
        this.searchField = searchField;
    }

    public String getSearchOper() {
        return searchOper;
    }

    public void setSearchOper(String searchOper) {
        this.searchOper = searchOper;
    }

    public String getSearchString() {
        return searchString;
    }

    public void setSearchString(String searchString) {
        this.searchString = searchString;
    }

    public List<StuTrans> getGridModel() {
        return gridModel;
    }

    public void setGridModel(List<StuTrans> gridModel) {
        this.gridModel = gridModel;
    }

    public Integer getPage() {
        return page;
    }

    public String getSidx() {
        return sidx;
    }

    public void setSidx(String sidx) {
        this.sidx = sidx;
    }

    public String getSord() {
        return sord;
    }

    public void setSord(String sord) {
        this.sord = sord;
    }

    public void setPage(Integer page) {
        this.page = page;
    }

    public Integer getRecords() {
        return records;
    }

    public void setRecords(Integer records) {
        this.records = records;
        if (this.records > 0 && this.rows > 0) {
            this.total = (int) Math.ceil((double) this.records / (double) this.rows);
        } else {
            this.total = 0;
        }
    }

    public Integer getTotal() {
        return total;
    }

    public void setTotal(Integer total) {
        this.total = total;
    }
    // All Record

    public String execute() {
        System.out.println("gridaction actTransaction called");
        int to = rows * page;

        if (id != null) {
            gridModel = StuTransDAO.findById(id);
        }
        records = gridModel.size();
        // Set to = max rows
        if (to > records) {
            to = records;
        }

        // Calculate total Pages
        total = (int) Math.ceil((double) records / (double) rows);

        return SUCCESS;
    }

    public Integer getRows() {
        return rows;
    }

    public void setRows(Integer rows) {
        this.rows = rows;
    }

    public String getJSON() {
        return execute();
    }
}

Now comes the very important struts.xml.
struts.xml
<!Doctype.... tag (as usual)

<struts>
    <!-- Configuration for the default package. -->
    <package name="default" extends="struts-default,json-default">
       
        <action name="ntable" class="actions.actStudent">
            <result name="success" type="json"/>
        </action>

        <action name="nstutrans" class="actions.actTransaction">
            <result name="success" type="json"/>
        </action>

    </package>
</struts>

and following is the code for index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib  prefix="s" uri="/struts-tags" %>
<%@taglib  prefix="sj" uri="/struts-jquery-tags" %>
<%@taglib  prefix="sjg" uri="/struts-jquery-grid-tags" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <sj:head jqueryui="true" jquerytheme="start"/>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Struts2-Jquery SubGrid</title>
    </head>
    <body>
        <s:url  id="remoteurl" action="ntable"/>
        <s:url  id="nremoteurl" action="nstutrans"/>
        <sjg:grid
            id="gridtable"
            caption="Student Entry"
            dataType="json"
            href="%{remoteurl}"
            pager="true"
            gridModel="gridModel"
            rowList="5,10,15,20"
            rowNum="5"
            rownumbers="true"
            >

            <sjg:grid id="nsubgrid"
                      subGridUrl="%{nremoteurl}"
                      gridModel="gridModel"
                      rowNum="-1"
                      footerrow="false"
                      userDataOnFooter="false"
                      >
                <sjg:gridColumn name="idstudent" title="StudentId" sortable="false"/>
                <sjg:gridColumn name="amount" title="Amount" width="100" sortable="false"formatter="number"/>
                <sjg:gridColumn name="desc" title="Description" width="100" sortable="false"/>
            </sjg:grid>

            <sjg:gridColumn name="idstudent" index="idstudent" title="ID" formatter="integer" sortable="false" key="true"/>
            <sjg:gridColumn name="name" index="name" title="Name" sortable="true" editable="false"/>
            <sjg:gridColumn name="address" index="address" title="Address" sortable="true" editable="false"/>
            <sjg:gridColumn name="email" index="email" title="Email" sortable="true" editable="false"/>
            <sjg:gridColumn name="phoneno" index="phoneno" title="Phoneno" sortable="true" editable="false"/>
        </sjg:grid>
    </body>
</html>

Above two lines have been mentioned in bold, first one:         <sj:head jqueryui="true" jquerytheme="start"/> corresponds to the use of Jquery UI
and the second one: <sjg:gridColumn name="idstudent" index="idstudent" title="ID" formatter="integer" sortable="false" key="true"/> specifies that when an element of the outer grid is expanded then the key value(idstudent) is passed as id to the subGridUrl action of the inner action, according to which data is being fetched and returned as JSON in the inner grid. If key is set to false then the usual serial number of the record being selected for expansion(clicking on plus sign) is passed as id. Therefore, in both cases the action which populates the inner grid must have an attribute named id with its corresponding getter and setter.

Download the project.
Hope so this will we be useful to you. Comments are always welcome in case of any kind of problem/issue in the given example.

Struts2 - Nested Iterators


Hey Googler,
Unable to find out a more versatile solution of having a nested iterator in Struts2. Want to know the naming convention to be used in JSP, in case of nested iterator so that it can be submitted through a form ?Here comes the solution.

This is how the JSP code will look like:

        <s:form action="saveaction" >
            <s:iterator value="lstBean" id="lstBean" status="outerStat">
                <s:textfield value="%{name}" name="lstBean[%{#outerStat.index}].name"/>
                <s:textfield value="%{amt}" name="lstBean[%{#outerStat.index}].amt"/>
                <s:textfield value="%{id}" name="lstBean[%{#outerStat.index}].id"/>
                <s:iterator value="%{lstString}" status="myStat">
                    <s:textfield name="lstBean[%{#outerStat.index}].lstString[%{#myStat.index}]"/>
                </s:iterator>
            </s:iterator>
            <s:submit value="Click me to submit lstBean"/>
        </s:form>

Following is the bean(XBean) whose List is used in the JSP:

public class XBean
{
    private ArrayList<String> lstString=new ArrayList<String>();
    private String name;
    private Double amt;
    private Integer id;
      //Getters and setters of fields
}

Now you can simply have a field lstBean with setters in your submitting action (saveaction) and hey you are done!!!!

Download an example project. (Netbeans 6.9 project)


Want to have a very basic JTree example, then you are at the right place.

Example 1
Code:

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;

public class SimpleJTree
{
    public static void main(String[] args) {
      
        JFrame frame = new JFrame();

        DefaultMutableTreeNode parent = new DefaultMutableTreeNode("Color", true);
        DefaultMutableTreeNode black = new DefaultMutableTreeNode("Black");
        DefaultMutableTreeNode blue = new DefaultMutableTreeNode("Blue");
        DefaultMutableTreeNode nBlue = new DefaultMutableTreeNode("Navy Blue");
        DefaultMutableTreeNode dBlue = new DefaultMutableTreeNode("Dark Blue");
        DefaultMutableTreeNode green = new DefaultMutableTreeNode("Green");
        DefaultMutableTreeNode white = new DefaultMutableTreeNode("White");

        DefaultMutableTreeNode adsf=new DefaultMutableTreeNode();

        parent.add(black);
        parent.add(blue);

        blue.add(nBlue);
        blue.add(dBlue);

        parent.add(green);
        parent.add(white);

        JTree tree = new JTree(parent);
        frame.add(tree);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setVisible(true);
    }
}


Download : SimpleJTree.java

Description: 
The program is self explanatory in itself. One can use a IDE say Netbeans to explore the full feature of various methods and constructors used in the program. Here the Tree is hard-coded, required to make up the basics.




Example 2
Code:

import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;


public class AdvancedJTree
{
    public static void main(String[] args)
    {
        JFileChooser fchoose=new JFileChooser();
        fchoose.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        fchoose.showOpenDialog(fchoose);

        File f=fchoose.getSelectedFile();
        //File f=new File(".");
//        System.out.println(f.getParentFile());
      
//        JTree tr=new JTree(createTree(f.getParentFile()));
        JTree tr=new JTree(createTree(f));
        JScrollPane scp=new JScrollPane(tr);

        JFrame frame=new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400,400);
        frame.add(scp);
        frame.setVisible(true);

    }
  
    public static DefaultMutableTreeNode createTree(File fil)
    {
        DefaultMutableTreeNode root=new DefaultMutableTreeNode(fil.getName(), true);

        String []list;
        DefaultMutableTreeNode temp;

        if(fil.isDirectory())
        {
            list=fil.list();
            if(list==null){ return root;    }
          
//            System.out.println("Files in Directory");
            for(String s:list){
                System.out.println(s);
            }

//            System.out.println("Files in Directory End");
          
            int index=0;

            while(index<list.length)
            {
                File tempFile=new File(fil.getPath()+fil.separatorChar+list[index]);

                if(tempFile.isFile()){
                    temp=new DefaultMutableTreeNode(tempFile.getName());
                    root.add(temp);
                }
                else {
                    temp=createTree(tempFile);
                    root.add(temp);
                }
                index++;
            }
        }
        return root;
    }
}


Download : AdvancedJTree.java

Description:
This is an advanced version of the previous program. Here the Tree is built dynamically by selecting any folder of your choice at the time of startup of this program. Since at the startup an Open Dialog is shown, to select a particular folder whose Tree will be built dynamically. The Tree is built recursively. The technique used is such that, traverse every file in a folder and add it to Tree, but if the file is itself a folder, call the function recursively.

Swing - LAN Chat Application


Hi friends,

Are you looking for a simple GUI based LAN chat application ?
Here's the solution :



Description:
This rar comprises of two .java files which are namely ClientOne.java and ClientTwo.java. These .java files can be run simultaneously on the same machine. Both the files are similar in coding excepting listening and sending ports. In order to understand the basics of JavaSockets for chatting, this application is must. It forms the basics of GUI and Java UDP Socket Programming. Hope you will like this program.
In case of any query, comments are welcome.



Description:
This rar comprises of a single .java file which is namely NChat.java. Simply copy this program to the machines in your LAN. Now run the program on different machines, you will find a better GUI and better chatting functionality with little automation. This forms the basics of Advanced Chat Application and better Java UDP Socket use. Hope you will like this.
In case of any query, comments are welcome.

Struts2 Jquery Grid


Working on Struts2 Jquery grid plugin ?
Unable to find out what's going wrong?
Have u spend more than 72 hours, but still unable to find a solution ?
Then u found the right place.

Following is the list of working Netbeans 6.9 projects, taking you from novoice to professional using Struts2 Jquery Grid.
All you need to do is to resolve the references and get going.