【问题标题】:How display data fetched from database on a jsp page using struts and hibernate如何使用struts和hibernate在jsp页面上显示从数据库中获取的数据
【发布时间】:2012-05-28 09:09:12
【问题描述】:

我正在尝试使用带有 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(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 配置

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

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

【问题讨论】:

  • 我缩进了你的代码,但你用自己的编辑覆盖了我的更改。缩进你的代码,尊重 Java 命名约定,对包括你在内的每个人来说,一切都会变得更加清晰。并发布您的真实代码。您甚至没有起始 logic:iterate 标记。如果你的代码是缩进的,你就不会错过。
  • 对不起,但是当我发布我的代码时,它们没有出现。这是我的页面 jsp:
  • 编辑您的代码。缩进 ID。在您的问题中添加 JSP 代码。代码块应该缩进四个空格,甚至还有一个按钮可以为您制作:选择您的代码,单击它(它有花括号作为图标)。
  • 我的问题中有我的代码 jsp,对不起,我是该网站的新手,我无法提交代码,我不知道为什么
  • 我已经缩进了你的 JSP 代码。开头的
  • 匹配。其他每一对开始和结束标签都是一样的。您的代码完全错误。缩进它,修复它,然后把它发回来。并对您的 Java 代码执行相同的操作。如果你不缩进你的代码,那将是一个难以理解的混乱。为您和您的同事。缩进有助于发现错误。
    Nom Acteur:
    地址IP: 应该与结尾的

标签: hibernate struts struts-1


【解决方案1】:

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

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

意味着当调用动作/Liste时,Struts将在会话属性ListeActeur中存储一个mesForms.strust.ListeActeur类型的bean。

在这个动作中,你正在做

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

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

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

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

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

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

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

现在 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 ListeActeur 的属性 lis 中的集合。我不知道 Struts 到底是怎么做的,但是它要么在请求中找到您的 java.util.List,它没有 lis 属性,要么在会话中找到 ListeActeur bean,但因为它是品牌新的,它的lis 属性是一个空列表。

解决这个问题的步骤:

  • 遵守命名约定:变量和属性以小写字母开头。表单 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>

【讨论】:

  • 感谢您的回答,但我如何将 jstl 与 strust1 一起使用?
  • 就像在没有 struts1 的情况下使用 JSTL。您将 JSTL jar 放在 WEB-INF/lib 中,在 JSP 的顶部声明 taglib,并使用 JSP 中的标签。但是,如果您愿意,可以继续使用 struts 标签。只需将 c:forEach 替换为 logic:iterate,将 c:out 替换为 bean:write,等等。
  • 我更改了您提供给我的集体诉讼,我保留了相同的 jsp,但仍然是空列表
  • scopr "session" 和 scope "request" 有什么区别?
  • 天啊,你真的需要学习一些关于 web 开发的教程,特别是 servlet API。请求代表用户向服务器发出的简单请求:链接点击、表单提交。会话代表与特定用户的一种连接。它从会话打开的那一刻开始(通常,当用户向应用程序发出第一个请求时),并在超时后结束,例如,一旦用户半小时没有向应用程序发送任何请求(或当会话在服务器端被明确删除时)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 2013-09-27
  • 2014-09-09
相关资源
最近更新 更多