我正在尝试使用带有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>
我不明白我做错了什么,请帮忙。谢谢!
答案 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
属性是空列表或空列表。
解决这个烂摊子的步骤:
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>