如何使用struts和hibernate在jsp页面上从数据库中获取显示数据

时间:2012-05-28 09:09:13

标签: hibernate struts struts-1

我正在尝试使用带有struts 2的Hibernate将数据从我的数据库显示到Jsp页面。虽然没有错误但没有显示任何内容。我试图从其他帖子中找到解决方案但不能。 这是动作类。

 public class ListeActeurAction  extends Action{

public ActionForward execute(ActionMapping mapping, ActionForm form,
        HttpServletRequest req, HttpServletResponse res) throws Exception {
    System.out.println("Action");

    ListeActeur ListeActeur= (ListeActeur) form;
            String query = "select nomActeur from Acteur " ;
            ListeActeur.setLis( HibernateUtil.ListeActeur(query, req)); 
    req.setAttribute("ListeActeur", ListeActeur.getLis()) ;
                    return mapping.findForward("s");

methode:HibernateUtil.ListeActeur(query,req)

 public   static List <Acteur> ListeActeur(String query,HttpServletRequest req){

System.out.print("hutil");
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
 Iterator results = session.createSQLQuery(query).list().iterator();
 List <Acteur> list = new ArrayList<Acteur>();


 while((results.hasNext()))
 {
     Acteur gg =new Acteur();
    //Object[] row = (Object[]) results.next();
    //gg.setActeurId((Integer)row[0]);
    gg.setNomActeur(( java.lang.String)results.next());

list.add(gg);
 }


req.getSession(true).setAttribute("ListeActeur", list);
 session.getTransaction().commit();
 HibernateUtil.getSessionFactory().close(); 
 return list;

}

<html:form action="Liste" >
  <table>
    <tr>  
      <logic:iterate  name="ListeActeur" property= "lis"  id="Acteur" >
        <td><b>Nom Acteur:<bean:write name="Acteur" property="nomActeur"/></b> <br></td>
        <td><b>Adresse IP :<bean:write name="Acteur" property="adresseIp"/></b> <br>  </td>
      </tr>
    </logic:iterate>
  </table>
</html:form>

的struts-config     

    <!DOCTYPE struts-config 
    PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" 
     "http://jakarta.apache.org/struts/dtds/struts-config_1_3.dtd">
    <struts-config>

<form-beans type="org.apache.struts.action.ActionFormBean">
  <form-bean name="ListeActeur" type="mesForms.strust.ListeActeur"/>
</form-beans>
    <action-mappings >
   <action path="/Liste" 
    parameter="/vue/Invitation.jsp"
    name="ListeActeur"
    scope="session"
    validate="false"
    type="mesAction.struts.ListeActeurAction">  
    <forward name="s" path="/vue/Invitation.jsp" redirect="false" />
    </action>
   </action-mappings>

 </struts-config>

我不明白我做错了什么,请帮忙。谢谢!

1 个答案:

答案 0 :(得分:2)

你使用相同的属性名称三次:

<form-bean name="ListeActeur" type="mesForms.strust.ListeActeur"/>
<action path="/Liste" name="ListeActeur" scope="session" ...

表示在调用操作mesForms.strust.ListeActeur时,Struts将在会话属性ListeActeur中存储类型为/Liste的bean。

在这个动作中,你正在做

req.setAttribute("ListeActeur", ListeActeur.getLis());

所以在这里,您在请求属性java.util.List中存储ListeActeur。这个请求属性是完全没必要的,因为已经存储在会话中的bean ListeActeur中已经有相同的列表。

但是等等,在这之前,从Hibernate获取一些数据的代码决定

req.getSession(true).setAttribute("ListeActeur", list)

并使用相同的java.util.List覆盖Struts中存储的内容。

因此,要恢复,在此操作方法调用结束时,您有

  • 请求
  • 中类型为ListeActeur的属性java.util.List
  • 会话中ListeActeur类型的属性java.util.List,与请求中存储的属性相同。

现在执行JSP:

<html:form action="Liste" >

这一行告诉Struts从会话中获取与Liste操作相关联的类型的表单bean,或者创建它并存储它。它通常应该已经存在,但是你用java.util.List替换它,因此Struts会从会话中删除你的List并用全新的mesForms.strust.ListeActeur替换它。

<logic:iterate name="ListeActeur" property= "lis"  id="Acteur" >

现在,您尝试遍历存储在bean lis的属性ListeActeur中的集合。我不确切知道Struts在这里做了什么,但是它在请求中找到了你的java.util.List,它没有lis属性,或者它找到了ListeActeur bean会话,但因为它是全新的,它的lis属性是空列表或空列表。

解决这个烂摊子的步骤:

  • 尊重namng约定:变量和属性以小写字母开头。表单bean类应命名为SomethingForm,操作类应命名为SomethingAction。 struts-config中的表单bean名称应命名为somethingForm。
  • 表单bean几乎永远不会存储在struts-config.xml的会话作用域中。将它们存储在请求范围内。
  • 您不应该自己在任何范围内存储表单bean。 Struts为你做到了。
  • 负责从数据库获取数据的代码不必处理请求和会话属性。它接受参数中的参数,并返回对象。让您的行动处理请求和会话。
  • 由于您选择将查询结果存储在表单bean中,因此无需将其存储在其他位置。 Struts将您的表单bean存储在请求中。您将查询结果存储在表单bean中。不需要任何其他东西。
  • 为您的媒体选择有意义的名称。 lis并不意味着什么。如果您有一个Acteur列表,请将其命名为acteurs

以下是您的操作方法应该是什么样子(并查看它是如何正确缩进的):

public ActionForward execute(ActionMapping mapping, 
                             ActionForm actionForm,
                             HttpServletRequest request, 
                             HttpServletResponse response) throws Exception {
    ListeActeurForm form = (ListeActeurForm) actionForm;
    List<Acteur> acteurs = acteurService.findAll();
    form.setActeurs(acteurs); 
    return mapping.findForward("success");
}

这就是你的JSP应该是这样的(使用JSTL,因为逻辑标签已被弃用多年):

<table>
    <thead>
        <tr>
            <th>Name of the acteur</th>
            <th>IP address of the acteur</th>
        <tr>
    </thead>
    <tbody>
        <%-- one row per acteur --%>
        <c:forEach var="acteur" items="${listeActeurForm.acteurs}">
            <tr>
                <td><c:out value="${acteur.name}"/></td>
                <td><c:out value="${acteur.ipAddress}"/></td>
            </tr>
        </c:forEach>
    </tbody>
</table>