改成<logic:iterate id="bean" name="list" type="java.util.Map">
     <tr>
        <td height="30" align="center" width="100" class="fr"><bean:write    name="bean" property="spName"/> </td> 
     </tr>
</logic:iterate>

解决方案 »

  1.   

    to sandyen:
         我按照你说的改了。但是提示了另外的错误信息:
    java.lang.ClassCastException
    at jsp_servlet._jsp.__splist._jspService(__splist.java:153)
    at weblogic.servlet.jsp.JspBase.service(JspBase.java:33)
    at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run     (ServletStubImpl.java:1053)
    at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:387)
    at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:305)
    at weblogic.servlet.internal.RequestDispatcherImpl$ForwardAction.run(RequestDispatcherImpl.java:382)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
    at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:286)
    at org.apache.struts.action.ActionServlet.processActionForward(ActionServlet.java:1759)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1596)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:492)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1053)
    at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:387)
    at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:305)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6310)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
    at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3622)
    at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2569)
    at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)
    at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)
      

  2.   

    httpServletRequest.setAttribute("list",list);  
    改成session.setAttribute("list",list);
      

  3.   

    这个异常是runtimeException,就是在运行的时候你的类出了问题,你可打个断点跟踪一下
    如果没有debug环境的话,就多写几个system.out来跟踪
      

  4.   

    如果不是必要的
    在处理结果集的时候把你的DataMap换成HashMap试试
      

  5.   

    DataMap dm = null;你这里怎么用的是DataMap,那我给出来的肯定不对了
    如果按照我说的改的话,你在这里必须用Map或者HashMap了
      

  6.   

    其实我的DataMap类 就是调用了一下HashMap类方法。
    to:zcjl和sandyen
        你们说得意思是不是,在我取得结果集的时候直接把记录放到HashMap中啊。也就是这样的
       HashMap dm = null;
              while(rs.next())
               {
                     //System.out.println(" 循环**************");
                     dm = new HashMap();
                     dm.put("spName",turnStr(rs.getString("SPNAME")));
                     dm.put("spCount",turnStr(rs.getString("SPCOUNT")));
                     dm.put("spPrice",turnStr(rs.getString("SPPRICE")));
                     dm.put("spMs",turnStr(rs.getString("SPMS")));
                     list.add(dm);
               }
                rs.close();
                return list;
    我去试一试。
      

  7.   

    <logic:iterate id="bean" name="list" type="java.util.Map">这个好像有问题吧,type应该改成java.util.List
    iterate的标签是list类型的
      

  8.   

    改成type="java.util.Map"  也出现上述异常。 
      我对我的程序做了跟踪,我自己的类在没有出现异常的地方。请大家帮我。
      

  9.   

    现在出现了什么错误
    我给你的那个肯定没有问题,那个type是list里面放的formBean的类型
      

  10.   

    注意你的错示信息,它说你CastException,你是否存入了非String值,即使你turnstr()了,因此value = (String)map.get(key);
    不能正常操作?
      

  11.   

    to 楼上:我在控制台输出了我得到的list里存的值,没有错误了。
    to sandyen:
         你说的list里面放的formbean是什么意思。我现在放的好像是自己new的HashMap类。我怎么把formbean放到list里,这里我不太明白。
      

  12.   

    我的意思是一般是定义自己的formBean,你现在用的是Map,其实也一样的
    你的程序还是那个错误吗?
      

  13.   

    还是啊,具体错误信息如下:
         Error 500--Internal Server Error 
    java.lang.ClassCastException
    at jsp_servlet._jsp.__splist._jspService(__splist.java:175)
    at weblogic.servlet.jsp.JspBase.service(JspBase.java:33)
    at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1053)
    at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:387)
    at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:305)
    at weblogic.servlet.internal.RequestDispatcherImpl$ForwardAction.run(RequestDispatcherImpl.java:382)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
    at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:286)
    at org.apache.struts.action.ActionServlet.processActionForward(ActionServlet.java:1759)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1596)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:492)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1053)
    at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:387)
    at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:305)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6310)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
    at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3622)
    at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2569)
    at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)
    at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170) 
      

  14.   

    如果我在jsp端这样写<logic:iterate id="bean" name="list" type="java.util.List">
    就出现上述错误。
    如果我在jsp端这样写<logic:iterate id="bean" name="list" type="java.util.HashMap">
    就出现如下错误:
            javax.servlet.jsp.JspException: No getter method for property spName of bean bean
    at org.apache.struts.util.RequestUtils.lookup(RequestUtils.java:517)
    at org.apache.struts.taglib.bean.WriteTag.doStartTag(WriteTag.java:179)
    at jsp_servlet._jsp.__splist._jspService(__splist.java:185)
    at weblogic.servlet.jsp.JspBase.service(JspBase.java:33)
    at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1053)
    at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:387)
    at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:431)
    at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:305)
      

  15.   

    哦,我知道了改成<logic:iterate id="bean" name="list" type="java.util.Map">
         <tr>
            <td height="30" align="center" width="100" class="fr"><bean:write    name="spName"/> </td> 
         </tr>
    </logic:iterate>
      

  16.   

    <logic:iterate id="bean" name="list" >
    </logic:iterate>
    循环的是你的自己定义的类DataMap,即bean是DataMap型的,而
    <bean:write    name="bean" property="spName"/> 
    则调用DataMap的方法getSpName(),即bean.getSpName(),而你定义的类没有这个方法。你应该这样定义你的DataMap
    public class DataMap {
     private String spName = null;
     
     public void setSpName(String spName) {
        this.spName = spName;
     }
     public String getSpName() {
          return spName;
     } ......} 
      

  17.   

    把dataMap换成一个具体的valueObject,里面定义所有的域的get,set方法,就行了,没见过这样用返回结果的
      

  18.   

    楼上两位大虾
    bean write是可以用HashMap做valueObject的
    我这样用都可以
    只是不知道楼主使用时到底有什么古怪
    导致报错
      

  19.   

    我看了一下楼上各位的分析,但都存在一些误解,首先是对HashMap的误解,由于HashMap是“哈希表”聚合类,所以不能直接用<bean:write>直接显示出来,想深入弄清楚可看一下<bean:write>的源代码。第二个误解是以为Bean类中只要用set()、get()函数就可以在使用时不加属性名直接用。
    解决办法是:
    1、在DataMap.java文件中加入getMap()函数:
    package  emptyprj;
    import java.util.*;
    public class DataMap {
     private HashMap map = null;
     public DataMap() {
         this.map = new HashMap();
     }
      public void set(String Key,String value)
     {
        map.put(Key,value);
     }
     public String get(Object key)
     {
          String value = "";
          value = (String)map.get(key);
          return value;
     }
      public HashMap getMap()  //加在这里
     {     
          return map;
     }
     } 
    2、在输出JSP文件<logic:iterate>中定义一个中间Bean:
    <%@ page contentType="text/html;charset=GB2312" language="java" %>
    <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
    <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
    <%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %><html:html >
    <head>
    <title>
    </title>
    <META http-equiv=Content-Type content="text/html; charset=gb2312"></head>
    <body bgColor=white>
    <html:base/>  <html:base/>   <logic:iterate id="list" name="list">
    <p>
    <bean:define property='map' name='list'  id='list' />   /*加在这里*/
    <bean:write name="list" property="spName" />
    </p>
    </logic:iterate>
    </body>
    </html:html >
    如果想实验一个,可用我下面的Action文件试试:
    package  emptyprj;
    import java.lang.reflect.InvocationTargetException;
    import java.util.Locale;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.commons.beanutils.PropertyUtils;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionError;
    import org.apache.struts.action.ActionErrors;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import org.apache.struts.action.ActionServlet;
    import org.apache.struts.util.ModuleException;
    import org.apache.struts.util.MessageResources;
    import emptyprj.DataMap;
    import java.util.*;
    public final class hasAction extends Action 
    {
        private Log log = LogFactory.getLog("org.apache.struts.webapp.Example");
        public ActionForward execute(ActionMapping mapping,
     ActionForm form,
     HttpServletRequest request,
     HttpServletResponse response)
    throws Exception 
        {
    // Extract attributes and parameters we will need
    Locale locale = getLocale(request);
    MessageResources messages = getResources(request);
    HttpSession session = request.getSession();
    hasForm myform = (hasForm) form;
    String variable1= myform.getMybeanvariable1();
            try 
            {           ArrayList list = new ArrayList();
              DataMap dm = null;
              for(int i=0;i<4;i++)
              {
                    dm = new DataMap();
                    dm.set("spName","SPNAME"+String.valueOf(i));
                    dm.set("spCount","SPCOUNT");
                    dm.set("spPrice","SPPRICE");
                    dm.set("spMs","SPMS");
                    list.add(dm);
              }
              request.setAttribute("list",list);             return (mapping.findForward("success"));
            } 
            catch (Exception e) 
            { throw new RuntimeException(e.getMessage());
            }
        }

    上述代码在JSPStudio中调试通过,输入是:
    SPNAME0 
    SPNAME1 
    SPNAME2 
    SPNAME3 
      

  20.   

    to sandyen:
          我按照你说的改了一下,同样提示我类型转化错误。实在jsp运行期出现的。
    to kui:
          非常感谢的你的讲解。我把你的代码,拷贝了一下,放到我的工程里,只是action中我是调用另一个类的方法,来获得ArrayList。具体做法如下
      类方法:
          DataMap dm = null;
               while(rs.next())
               {
                     //System.out.println(" 循环**************");
                     dm = new DataMap();
                     dm.set("spName",turnStr(rs.getString("SPNAME")));
                     dm.set("spCount",turnStr(rs.getString("SPCOUNT")));
                     dm.set("spPrice",turnStr(rs.getString("SPPRICE")));
                     dm.set("spMs",turnStr(rs.getString("SPMS")));
                     list.add(dm);
               }
               
               rs.close();
               return list;
    在action中得到这个list。存入request中。
    我的DataMap类是按照你说的改的。
    jsp端我是这样写的:
       <logic:iterate id="list" name="list" >
                <bean:define property="map" id="list" name="list"/>
                <bean:write name="list" property="spName"/>
    </logic:iterate>
     提示我的错误是这样的:
      javax.servlet.jsp.JspException: No getter method for property spName of bean list
    at org.apache.struts.util.RequestUtils.lookup(RequestUtils.java:517)
    at org.apache.struts.taglib.bean.WriteTag.doStartTag(WriteTag.java:179)
      

  21.   

    感谢各位大侠:
    我觉得我的问题主要是由于一下几点我不太明白造成的:
    1。<logic:iterate>标签里面的id属性,name属性。
       在这个例子里面 id=“bean” name=“list”,id=“bean”中的“bean”是  根据什么写的,随便等于任何一个名字可以么。
    2。<bean:write>标签中的 name="bean"  是什么意思。property="spName" 中的spName在什么里定义的。我是在一个actionform里定义的。
       在我单独的bean里没有这个变量,只是在bean里把结果集存入链表时的一个对象索引名。
    3。还有<logic:define>标签中id和name属性都是根据什么写的。 请讲解,谢谢!!!! 
      

  22.   

    多谢各位,问题已经搞定:
       具体做法如下:
          在我的DataMap类中增加set和get方法,像kui所说的增加getMap()方法。
     其他的做法都按照kui所说的做。
    特别感谢kui(kui),sendyen的热心帮助