我定义了一个sturts标签,用于显示select下拉列表初始化的内容,下面还有两个文本框和提交按钮,可是在执行时,页面上只显示了select的内容,文本框和提交按钮都没有显示出来,而且select中的内容也显示得不完全,因为select的内容是从数据库读出的,可是页面上select中的记录数少于数据库中的记录数,这是为什么?以下是我的自定义标签:
package tag;import java.util.Iterator;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;import com.Hibernate.SessionFactory;
import com.jingpin.Courseinfo;
import com.jingpin.Kindinfo;public class InitListTag extends TagSupport {
        private Log log = LogFactory.getLog(this.getClass().getName());
        public int doEndTag() throws JspException{
                JspWriter out=pageContext.getOut();
                try{
                out.println("<select size=\"8\" name=\"select1\" id=\"select1\" style=\"width:200\" ondblclick=\"add();\" multiple=\"multiple\">");
                Session session=SessionFactory.currentSession();
                Transaction tx=session.beginTransaction();
                Query query=session.createQuery("from Courseinfo c,Kindinfo k where c.kindType=k.kindType and c.kindSecond=k.kindSecond order by c.kindSecond");
                for(Iterator it=query.iterate();it.hasNext();){
                        Object[] objs=(Object[])it.next();
                        Courseinfo cinfo=(Courseinfo)objs[0];
                        Kindinfo kinfo=(Kindinfo)objs[1];
                        String str1=cinfo.getCourseId().toString();
                        String str2=cinfo.getCourseName();
                        String str3=cinfo.getSchoolName();
                        String str4=cinfo.getCourseDutyName();
                        String str5=cinfo.getKindFirst();
                        String str6=kinfo.getKindFirstName();
                        String str7=cinfo.getKindSecond();
                        String str8=kinfo.getKindSecondName();
                        out.println("<option value =\""+str1+"\">"+str2+","+str3+","+str4+","+str5+","+str6+","+str7+","+str8+"</option>");
                }
                out.println("</select>");
                tx.commit();
                SessionFactory.closeSession();
                }catch(Exception e){
                        throw new JspTagException("IOException:" + e.toString());
                }
                return EVAL_PAGE;
        }
}
注:我曾经以为是返回值有问题,但是将返回值改为return super.doEndTag();之后还是不对。
急死我了

解决方案 »

  1.   

    你的页面上生成的html结果是什么,用浏览器的view source看一下,是不是所有的<option>以及结尾的</select>都被正确生成了。
    另外,在你的taglib的source中
    catch(Exception e){
      e.printStackTrace();
      //throw new JspTag....
    }
    不知道你的web server是什么,如果是tomcat,stacktrace应该会被打在tomcat的console上。
    希望对你有帮助。一个建议:commit()和closeSession()应该写在finally子句里,否则如果try中出了错,没法结束活动的DB对话。
      

  2.   

    页面上没有报错,控制台也没有错误信息,在Internet的源文件中,有的option没有显示完全,也没有</select>。我后来又将自定义标签换成了struts的options标签,还是同样的问题,会不会是因为select中的数据量太大?
      

  3.   

    如果是这样的话,应该JSP处理时发生了Exception,server处理被中断,页面只显示一部分,也就是在出错前被写到response的buffer中的部分。
    要找到问题的话,你要用一个try catch把你的jsp的代码全都包起来,应该能抓到exception,然后把exception打出来。<%
    try{
    %>...你的JSP的内容<%
    }catch(Exception e){
    e.printStackTrace();
    }
    %>
      

  4.   

    hibernate 用法有问题  查询不需要 commit