0

我正在尝试使用带有 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");

方法:HibernateUtil.ListeActeur(查询,请求)

 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-配置

    <!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>

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

4

1 回答 1

2

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

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

意味着 Struts在调用 action 时mesForms.strust.ListeActeur会在 session 属性中存储一个 bean 类型。ListeActeur/Liste

在这个动作中,你正在做

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

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

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

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

并用相同的java.util.List.

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

  • 请求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" >

现在您尝试遍历存储在lisbean 属性中的集合ListeActeur。我不知道 Struts 到底是怎么做的,但是它要么java.util.List在请求中找到你的,它没有lis属性,要么ListeActeur在会话中找到 bean,但由于它是全新的,它的lis属性为空或 null列表。

解决此问题的步骤:

  • 尊重命名约定:变量和属性以小写字母开头。表单 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>
于 2012-05-28T11:03:49.207 回答