我正在尝试使用Hibernate在Struts 2中将数据库记录显示到我的JSP页面中。我已经成功完成了检索部分。
但是无论我做什么,似乎都无法在JSP页面中显示数据。
我尝试了各种在Internet中找到的解决方案。但是无法理解什么似乎是问题所在。我可以看到表的列名,但其中没有数据。我的User 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 :
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 //实体类:
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 :
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 :
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 :
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]
也许您理解了,但是不知道为什么您没有尝试解决它。如果要显示数据,首先应将其放入数据库中。检查数据是否可用,并通过客户端应用程序连接到该数据。有多种连接数据库的方法,包括IDE随附的JDBC客户端应用程序。它还从您那里获取连接属性,hibernate.cfg.xml并具有测试连接的能力。另外,请确保用于连接数据库的凭据具有对模式的DML / DDL访问特权,该特权可能应该手动创建。
hibernate.cfg.xml
该文件用于hibernate配置,由于与hibernate版本相对应的 正确的 DTD ,您应该注意该文件有效。
然后,您正在使用基于注释的映射,并且还应该在配置文件中对其进行配置。
接下来,DAO不应扩展,HibernateUtil并为放置static属性session是一场灾难。DAO不应具有static属性。如果您想使用会话HibernateUtil.getSession(),请不要忘记在交易结束时关闭会话。我猜您仍然没有实现我在上一个答案中提出的内容,因此您不知道如何从线程获取会话。无论如何,在构造函数中打开会话仅在您第一次使用会话时有效,并且在关闭会话后不再可用。开始事务之前,请在方法中打开一个会话。
static
session
HibernateUtil.getSession()
接下来,ModelDriven用@Quaternion更好地描述,关于模型的几句话:您的模型仅用于查看user,并且不包含display属性users。
ModelDriven
user
users
最后,方法execute是动作配置使用的默认方法,除非您知道自己在做什么,否则不应该映射此方法。
execute