【问题标题】:servlet and jsp sending query result following MVC frameworkservlet 和 jsp 遵循 MVC 框架发送查询结果
【发布时间】:2011-02-26 10:20:20
【问题描述】:

为了将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>

在这种情况下,我应该放什么来获得我的结果。一个表格中填满了请求中的正确值

【问题讨论】:

    标签: hibernate jsp servlets


    【解决方案1】:

    由于您使用的是 Hibernate,但没有充分利用它的所有功能,我建议您先学习基本的 Hibernate 教程。 Hibernate Reference 中描述的教程很好上手。

    无论如何,您需要创建一个模型对象,它代表Opcemployees 表的一个实体(我宁愿将其重命名为Opcemployee,但这是另一回事)以及另一个代表@987654330 的一个实体的模型对象@表。

    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();
    

    现在您有一个可在 JSP 中使用的模型对象 List。您需要让 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 标记对其进行迭代(只需将 jstl-1.2.jar 放入 /WEB-INF/lib 即可安装它):

    <%@ 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 表格,并在每次迭代时打印一个新的&lt;tr&gt;,并在&lt;td&gt; 中分别访问所有属性。

    <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

    【讨论】:

      猜你喜欢
      • 2018-11-03
      • 2012-11-04
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多