6
votes

I am trying to display the database records in my JSP page in Struts 2 using Hibernate.

I have done the retrieval part successfully.

But no matter what I do, I can't seem to display the data in the JSP page.

I have tried various solutions found in internet. But can't understand what seems to be the problem.

I can see the tables column name but there is no data in it.

I have all the required getters and setters in my User POJO class.

I have attached my code:

Register action:

public class RegisterAction extends ActionSupport{
    String name,pwd,email,address;
    int phno;

    public RegisterAction() {}

    List<User> users = new ArrayList<User>();
    UserDao udao = new UserDao();

    //Getters and setters.

    public String execute() throws Exception {
        User u=new User();
        u.setName(name);
        u.setEmail(email);
        u.setAddress(address);
        u.setPhno(phno);
        u.setPwd(pwd);
        udao.addUser(u);
        return "success";
    }

    public String listAllUsers(){
        users = udao.getUsers();
        System.out.println("In Action, "+users);
        return "success";
    }
}

UserDao:

public class UserDao{        

    List<User> allUsers = new ArrayList<User>();

    public UserDao() {}

    //Getter and setter.

    public Session getSession(){
        return HibernateUtil.getSession();
    }

    public void closeSession(){
        HibernateUtil.closeSession();
    }

    public void addUser(User u) {
        Session session= getSession();
        Transaction t = session.beginTransaction();
        int i = (Integer)session.save(u);
        t.commit();
        closeSession();
    }

    public List<User> getUsers() {
        Session session=getSession();
        Transaction t = session.beginTransaction();
        allUsers = (List<User>)session.createQuery("from User").list();
        t.commit();
        closeSession();
        System.out.print(allUsers);
        return allUsers;
    }
}

User.java //Entity Class:

@Entity
@Table(name="tbl_user")
public class User {
    @Id
    @GeneratedValue
    @Column(name="user_id")
    private int id;
    @Column(name="user_phno")
    int phno;
    @Column(name="user_name")
    private String name;
    @Column(name="user_pwd")
    private String pwd;
    @Column(name="user_email")
    private String email;
    @Column(name="user_address")
    private String address;

    public User(){}

    public User(String name,String pwd,String email,String address,int phno){
        this.name = name;
        this.pwd = pwd;
        this.email = email;
        this.address =address;
        this.phno = phno;

    }

    //Getters and setters.
}

home.jsp:

<table>
    <tr>
        <th>Name</th>
        <th>Email</th>
        <th>Address</th>
        <th>Phone No</th>
    </tr>
    <s:iterator value="users">
        <tr>
            <td><s:property value="name"/></td>
            <td><s:property value="email"/></td>
            <td><s:property value="address"/></td>
            <td><s:property value="phno"/></td>
        </tr>
    </s:iterator>

</table>

struts.xml:

<action name="register" class="action.RegisterAction" method="execute">
    <result name="success" type="redirect">listUsers</result>
</action>
<action name="listUsers" class="action.RegisterAction" method="listAllUsers">
    <result name="success">/home.jsp</result>
</action>

HibernateUtil:

public class HibernateUtil {

    static SessionFactory sessionFactory;
    static Session session;

    public static Session getSession() {
        sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        session= sessionFactory.openSession();
        return session;
    }

    public void setSession(Session session) {
        this.session = session;
    }

    public static void closeSession(){
        session.close();
    }
}

The server log contains:

[models.User@9c0fad, models.User@1c94f2c, models.User@16d06ef]

INFO: In Action, [models.User@9c0fad, models.User@1c94f2c, models.User@16d06ef]
3
Didn't look at your code that carefully but you are using ModelDriven... not really a big fan of it. It is slightly convenient when you want to add a user using a form as it pushes the User to the top of the value stack, but this ALSO happens from the views perspective. All in all, ModelDriven is best avoided unless you ONLY want to work with that model while setting and retrieving state. There have been several times I've wished that there was ModelFacing and ModelBacking interfaces so this "convenience" could just be exposed during the setting or during rendering the view.Quaternion
Oh here is further discussion (and more of my complaints!): stackoverflow.com/questions/4508895/… and if you want to work around ModelDriven here is how you can access the methods of the action: stackoverflow.com/questions/11407686/…Quaternion
@Quaternion : i removed the model driven..i actually dont no what modeldriven is.. i just inplemented the sample according to a sample i got from internet..I refer your questions & answers for my future queries.. Thank you for sparing your time for my silly query..:) I couldnt display the data because i didnt include the tag library..it was pointed out by Roman C..Eva

3 Answers

4
votes

May be you understand, but don't know why you didn't any attempt to resolve it. If you want to display data, first you should put it in the database. Check the data is available, connecting to it via the client application. There's many ways to connect to the database, including a JDBC client application supplied with the IDE. It also takes a connection properties right from your hibernate.cfg.xml and has capability to test the connection. Also, make sure the credential used to connect to the database has DML/DDL access privileges to the schema which should be probably created manually.

This file is for hibernate configuration, that you should take attention on it, to be valid due to a correct DTD corresponding to the version of hibernate.

Then, you are using annotation based mapping, and it also should be configured in the configuration file.

Next, DAO is not supposed to extend the HibernateUtil and putting a static property for the session is a disaster. DAOs should not have static properties. If you want to get a session use HibernateUtil.getSession() and don't forget to close session at the end of transaction. I guess you still didn't implement what I have proposed in the previous answer, so you don't know how to get the session from thread. Anyway opening a session in the constructor is only works a first time you use the session, and it's not longer available after you close it. Open a session in the method before you start a transaction.

Next, ModelDriven is better described by @Quaternion, a few words about your model: your model is only used to view a user and doesn't contain properties to display users.

Lastly, method execute is a default method used by the action configuration, you shouldn't map this method, unless you know what are you doing.

0
votes

What I found is that your property name of list of jsp and variable name of action class should match. As per my understanding this should resolve your issue.....!

0
votes

Override toString() method in User.java