如何在Struts 2中显示数据库记录列表(通过Hibernate检索)到JSP页面?

时间:2013-09-07 23:21:59

标签: java hibernate jsp struts2 xml-configuration

我正在尝试使用Hibernate将数据库记录显示在Struts 2中的JSP页面中。 我成功完成了检索部分。

但无论我做什么,我似乎都无法在JSP页面中显示数据。

我尝试过在互联网上找到的各种解决方案。但是无法理解什么似乎是问题所在。 我可以看到表列名,但其中没有数据。 我在用户POJO课程中拥有所有必需的getter和setter。

我附上了我的代码:

注册操作:

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
@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();
    }
}

服务器日志包含

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

INFO: In Action, [models.User@9c0fad, models.User@1c94f2c, models.User@16d06ef]

3 个答案:

答案 0 :(得分:4)

您可能理解,但不知道为什么您没有尝试解决它。如果要显示数据,首先应将其放在数据库中。检查数据是否可用,通过客户端应用程序连接到该数据。有许多方法可以连接到数据库,包括随IDE提供的JDBC客户端应用程序。它还可以直接从hibernate.cfg.xml获取连接属性,并具有测试连接的能力。此外,请确保用于连接到数据库的凭据具有对应该可能手动创建的架构的DML / DDL访问权限。

此文件用于hibernate配置,你应该注意它,因为与hibernate版本对应的正确的 DTD才有效。

然后,您正在使用基于注释的映射,它也应该在配置文件中配置。

接下来,DAO不应该扩展HibernateUtil,而为static添加session属性是一种灾难。 DAO不应具有static属性。如果您想要使用HibernateUtil.getSession()进行会话,请不要忘记在事务结束时关闭会话。我猜你还没有实现我在the previous answer中提出的建议,所以你不知道如何从线程中获取会话。无论如何在构造函数中打开一个会话只能在你第一次使用会话时工作,并且在关闭它之后它不再可用。在开始交易之前在方法中打开一个会话。

接下来,@ Quaternion更好地描述ModelDriven,关于您的模型的一些说法:您的模型仅用于查看user,并且不包含要显示users的属性。

最后,方法execute是操作配置使用的默认方法,除非您知道自己在做什么,否则不应映射此方法。

答案 1 :(得分:0)

我发现你的jsp列表的属性名称和action类的变量名称应该匹配。根据我的理解,这应该解决你的问题.....!

答案 2 :(得分:0)

覆盖User.java中的toString()方法