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

6
我正在尝试使用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]

1
没有仔细查看你的代码,但是你正在使用ModelDriven...我不是很喜欢它。当你想使用表单添加用户时,它略微方便,因为它将用户推到值栈的顶部,但这也会从视图的角度发生。总的来说,除非你只想在设置和检索状态时与该模型一起工作,否则最好避免使用ModelDriven。有几次我希望有ModelFacing和ModelBacking接口,这样“方便”就可以在设置或渲染视图期间公开。 - Quaternion
1
这里有更深入的讨论(以及我更多的抱怨!):https://dev59.com/FVLTa4cB1Zd3GeqPd9rx 如果你想绕过ModelDriven,这是如何访问action方法的:https://dev59.com/bGXWa4cB1Zd3GeqPRuxY - Quaternion
@Quaternion:我删除了模型驱动..实际上我不知道什么是模型驱动..我只是根据从互联网上得到的示例实现了样本..我将参考您的问题和答案以备将来查询..感谢您抽出时间回答我的愚蠢问题..:)我无法显示数据,因为我没有包含标签库..这是Roman C指出的。 - Eves
3个回答

4
也许您理解了问题,但却不知道为什么没有任何尝试来解决它。如果您想展示数据,首先应该将其放入数据库中。检查数据是否可用,通过客户端应用程序连接到它。有很多方法可以连接到数据库,包括IDE提供的JDBC客户端应用程序。它还可以直接从您的hibernate.cfg.xml获取连接属性,并具有测试连接的功能。此外,请确保用于连接到数据库的凭据具有对应手动创建的模式的DML / DDL访问权限。
这个文件是用于配置Hibernate的,您应该注意其中的细节,以使其有效,因为它需要与Hibernate版本相对应的正确DTD。
然后,您正在使用基于注释的映射,它也应该在配置文件中进行配置。
接下来,DAO不应扩展HibernateUtil并添加sessionstatic属性是灾难性的。DAOs不应该有静态属性。如果您想获取会话,请使用HibernateUtil.getSession(),并不要忘记在事务结束时关闭会话。我猜您还没有实现我在之前的答案中提出的建议,因此您不知道如何从线程中获取会话。在构造函数中打开会话只有第一次使用会话时才有效,并且在关闭后将不再可用。在开始事务之前,在方法中打开会话。
接下来,ModelDriven由@Quaternion更好地描述了一些关于您的模型的内容:您的模型仅用于查看一个user,并不包含显示users的属性。
最后,execute方法是操作配置使用的默认方法,除非您知道自己在做什么,否则不应该映射此方法。

抱歉,我已经根据您在之前的帖子中提到的更改进行了修改,并且我已经再次更新了这个问题。我已经对HibernateUtil、RegisterAction和UserDao进行了更改。我能够将数据保存到数据库(mysql)中。但是我能够检索数据(请参见服务器日志),但不知道如何将其显示在表单中。 - Eves
1
你是否在 JSP 中放置了 Struts Taglib 定义? - Roman C
是的先生,那就是问题所在了。我成功显示出数据了。感谢您的时间。:) - Eves

0

在User.java中重写toString()方法


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接