0

Hibernate with struts 2 を使用して、データベースから 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(クエリ、要求)

 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>

何が間違っているのかわかりません。助けてください。ありがとう!!

4

1 に答える 1

2

同じ属性名を 3 回使用しています。

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

アクションを呼び出すときに、Struts がmesForms.strust.ListeActeurセッション属性にタイプの Bean を格納することを意味します。ListeActeur/Liste

このアクションでは、あなたがやっている

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

ここでjava.util.Listは、リクエスト属性に a を格納していますListeActeur。セッションにすでに格納されている Bean ListeActeur で同じリストがすでに使用可能であるため、この要求属性は完全に不要です。

しかし、それを行う前に、Hibernate からデータを取得したコードがそうすることに決めました。

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

セッションに保存されている Struts を同じ .xml でオーバーライドしますjava.util.List

したがって、再開するには、このアクション メソッド呼び出しの最後に、

  • リクエストListeActeurの typeの属性java.util.List
  • ListeActeurセッションのタイプの属性java.util.List。これは、リクエストに格納されているものと同じリストです。

そして、JSP が実行されます。

<html:form action="Liste" >

この行は、セッションから Liste アクションに関連付けられたタイプのフォーム Bean を取得するか、それを作成して保存するように Struts に指示します。通常はすでに存在しているはずですが、java.util.List に置き換えたため、Struts はセッションから List を削除し、まったく新しい に置き換えますmesForms.strust.ListeActeur

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

lis次に、Beanのプロパティに格納されているコレクションを反復処理しますListeActeur。ここでStrutsがどのように動作するか正確にはわかりませんが、プロパティjava.util.Listを持たないリクエストであなたを見つけるか、セッションでBeanを見つけますが、それは真新しいので、そのプロパティは空またはnullですリスト。lisListeActeurlis

この混乱を修正する手順:

  • 命名規則を尊重します。変数と属性は小文字で始まります。フォーム 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 に答える