servlet和jsp在MVC框架之后发送查询结果

时间:2010-06-01 15:51:38

标签: hibernate jsp servlets

为了分离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>

在这种情况下,我应该准确地获取我的结果。一个表格中包含来自请求的正确值

1 个答案:

答案 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