如何在 Struts 2 中将数据库记录列表(通过 Hibernate 检索)显示到 JSP 页面?
Posted
技术标签:
【中文标题】如何在 Struts 2 中将数据库记录列表(通过 Hibernate 检索)显示到 JSP 页面?【英文标题】:How to display a list of database records (retrieved via Hibernate) to a JSP page in Struts 2? 【发布时间】:2013-09-11 19:10:24 【问题描述】:我正在尝试使用 Hibernate 在 Struts 2 中的 JSP 页面中显示数据库记录。
我已经成功完成了检索部分。
但是无论我做什么,我似乎都无法在 JSP 页面中显示数据。
我尝试了在互联网上找到的各种解决方案。但无法理解似乎是什么问题。
我可以看到表格的列名,但里面没有数据。
我的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
:
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]
【问题讨论】:
没有仔细查看您的代码,但您使用的是 ModelDriven... 并不是它的忠实粉丝。当您想使用表单添加用户时,它会稍微方便一些,因为它将用户推送到值堆栈的顶部,但这也发生在视图的角度。总而言之,最好避免使用 ModelDriven,除非您只想在设置和检索状态时使用该模型。有好几次我希望有 ModelFacing 和 ModelBacking 接口,所以这种“便利”可以在设置或渲染视图期间暴露出来。 哦,这里有进一步的讨论(还有更多我的抱怨!):***.com/questions/4508895/… 如果你想解决 ModelDriven 这里是如何访问操作的方法:***.com/questions/11407686/…跨度> @Quaternion :我删除了模型驱动..我实际上不知道什么是模型驱动..我只是根据我从互联网上获得的样本来实施样本..我参考你的问题和答案未来的查询.. 感谢您为我的愚蠢查询节省时间..:) 我无法显示数据,因为我没有包含标签库.. Roman C 指出了这一点.. 【参考方案1】:也许你明白,但不知道你为什么没有尝试解决它。如果要显示数据,首先应该将其放入数据库中。检查数据是否可用,通过客户端应用程序连接到它。有很多方法可以连接到数据库,包括 IDE 提供的 JDBC 客户端应用程序。它还直接从您的hibernate.cfg.xml
获取连接属性,并具有测试连接的能力。此外,确保用于连接数据库的凭据具有对可能应该手动创建的模式的 DML/DDL 访问权限。
此文件用于hibernate配置,请注意,由于正确与hibernate版本对应的DTD而有效。
那么,您使用的是基于注解的映射,它也应该在配置文件中进行配置。
接下来,DAO 不应该扩展 HibernateUtil
并且为 session
放置 static
属性是一场灾难。 DAO 不应具有 static
属性。如果您想获得会话,请使用HibernateUtil.getSession()
,并且不要忘记在事务结束时关闭会话。我猜你还没有实现我在the previous answer 中提出的建议,所以你不知道如何从线程中获取会话。无论如何,在构造函数中打开会话仅在您第一次使用会话时有效,并且在您关闭它后不再可用。在开始事务之前在方法中打开会话。
接下来,@Quaternion 更好地描述了ModelDriven
,关于您的模型的几句话:您的模型仅用于查看user
,不包含显示users
的属性。
最后,execute
方法是操作配置使用的默认方法,您不应该映射此方法,除非您知道自己在做什么。
【讨论】:
sorry..i ahve 您在我之前的帖子中提到的更改..我再次更新了这个问题..我在 HibernateUtil、RegisterAction、UserDao 中进行了更改。我能够将数据保存到数据库(mysql)中。但我能够检索数据(请参阅服务器日志)但不知道如何将其显示到表单中..) 你把struts taglib定义放到JSP里了吗? 是的先生..这是问题..我得到了显示的数据..谢谢你 4 你的时间..:)【参考方案2】:我发现你的jsp列表的属性名和动作类的变量名应该匹配。据我了解,这应该可以解决您的问题.....!
【讨论】:
【参考方案3】:覆盖 User.java 中的 toString()
方法
【讨论】:
以上是关于如何在 Struts 2 中将数据库记录列表(通过 Hibernate 检索)显示到 JSP 页面?的主要内容,如果未能解决你的问题,请参考以下文章