为了分离java代码和html代码并且更忠实于MVC框架,我正在编码;
在servlet中我提出以下内容:
net.sf.hibernate.Session s = null;
net.sf.hibernate.Transaction tx;
try {
s= HibernateUtil.currentSession();
tx=s.beginTransaction();
Query query = s.createQuery("select opcemployees.Nom,opcemployees.Prenom,dailytimesheet.TrackingDate,dailytimesheet.Activity," +
"dailytimesheet.ProjectCode,dailytimesheet.WAName,dailytimesheet.TaskCode," +
"dailytimesheet.TimeSpent,dailytimesheet.PercentTaskComplete from Opcemployees opcemployees,Dailytimesheet dailytimesheet " +
"where opcemployees.Matricule=dailytimesheet.Matricule and dailytimesheet.Etat=3 " +
"group by opcemployees.Nom,opcemployees.Prenom" );
for(Iterator it=query.iterate();it.hasNext();)
{
if(it.hasNext()){
Object[] row = (Object[]) it.next();
request.setAttribute("items", row);
}}
} catch (HibernateException e){
e.printStackTrace();
}
request.getRequestDispatcher(“EspaceValidation.jsp”)。forward(request,response);
在jsp中,我就这样开始:
<table>
<c:forEach items="${items}" var="item">
<tr>
<td>? </td>
<td>?</td>
</tr>
</c:forEach>
在这种情况下,我应该准确地获取我的结果。一个表格中包含来自请求的正确值
答案 0 :(得分:1)
由于您正在使用Hibernate但没有充分利用其所有功能,我建议您首先了解一下基本的Hibernate教程。 Hibernate Reference中描述的教程很适合入门。
无论如何,你需要创建一个模型对象,它代表Opcemployees
表的一个实体(我宁愿将其重命名为Opcemployee
,但这是另一个故事),另一个代表一个实体Dailytimesheet
表格。
public class Opcemployee {
private String nom;
private String prenom;
private Dailytimesheet dailytimesheet;
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
// Add/generate remnant of constructors, getters and setters.
}
public class Dailytimesheet {
private Date trackingDate;
private String activity; // Not sure if this is supposed to be String.
private String projectCode;
// ...
// Add/generate constructors, getters and setters.
}
这些对象应具有private
属性和public
getter和setter。大多数IDE都像Netbeans,Eclipse和IntelliJ一样可以为你自动生成它们。甚至还存在HibernateTools插件,它可以基于现有的数据库模型几乎自动完成所有这些操作。
如果一切都已正确完成并配置完毕,您应该最终查询Servlet中的数据,如下所示:
List<Opcemployee> opcemployees = session.createQuery("from Opcemployees").list();
现在你有一个List
模型对象可以在JSP中使用。您需要让Servlet将此列表存储在请求范围中,并将请求转发给JSP。
request.setAttribute("opcemployees", opcemployees);
request.getRequestDispatcher("page.jsp").forward(request, response);
这样${opcemployees}
中的page.jsp
即可访问。
<p>All employees: ${opcemployees}</p>
但这格式不是很好。这是List#toString()
的结果。就像你在Servlet中做System.out.println(opcemployees)
一样。您需要使用JSTL c:forEach
标记对其进行迭代(只需在/WEB-INF/lib
中删除jstl-1.2.jar即可安装):
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<c:forEach items="${opcemployees}" var="opcemployee">
<p>${opcemployee}</p>
</c:forEach>
这与普通Java代码中的以下内容相同:
for (Opcemployee opcemployee : opcemployees) {
System.out.println(opcemployee);
}
这会好一些。每个项目都单独打印。但我们希望将项目的每个属性都放在一个单独的表格单元格中。因此,我们需要围绕它编写一个HTML表,并在每次迭代时打印一个新的<tr>
,并在<td>
内单独访问所有属性。
<table>
<c:forEach items="${opcemployees}" var="opcemployee">
<tr>
<td>${opcemployee.nom}</td>
<td>${opcemployee.prenom}</td>
<td>${opcemployee.dailytimesheet.trackingDate}</td>
<td>${opcemployee.dailytimesheet.activity}</td>
<td>${opcemployee.dailytimesheet.projectCode}</td>
</tr>
</c:forEach>
</table>
${opcemployee.nom}
基本上是System.out.println(opcemployee.getNom())
。如您所见,您可以在EL中链接getter方法。 ${opcemployee.dailytimesheet.projectcode}
将打印opcemployee.getDailytimesheet().getProjectCode()
的结果。
希望这会有所帮助。另请参阅此JSP/Servlet tutorial。同一个网站也有很好的启动Hibernate tutorials。