代码如下:
1.action的部分代码:
        ConnectionBean cb = new ConnectionBean();
        ResultSet rs = null, rs1 = null;
        List arr = new ArrayList();
        List array = new ArrayList();
        HttpSession session = request.getSession(true);
        String state = request.getParameter("state");        if (state == "add" || state.equals("add")) {
            int id = Integer.parseInt(request.getParameter("id"));
            if (id == 0) {                rs = cb.dbSelect(
                        "select cy_Id,cy_Name,cy_Level from cy_articleclass order by cy_Order ");                try {
                    while (rs.next()) {
                        TypeForm tf = new TypeForm();
                        tf.setTypeId(rs.getInt(1));
                        String nbsp = "";
                        for (int i = 0; i < rs.getInt(3); i++) {
                            nbsp += "&nbsp;&nbsp;";
                        }                        tf.setTypeName(nbsp + rs.getString(2));                        arr.add(tf);                    }
                    rs.close();
                    cb.close();
                    session.setAttribute("type", arr);                    return mapping.findForward("showParentType");                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                rs = cb.dbSelect(
                        "select cy_Id,cy_Name,cy_Level from cy_articleclass order by cy_Order ");                try {
                    while (rs.next()) {
                        TypeForm tf = new TypeForm();
                        tf.setTypeId(rs.getInt(1));
                        String nbsp = "";
                        for (int i = 0; i < rs.getInt(3); i++) {
                            nbsp += "&nbsp;&nbsp;";
                        }                        tf.setTypeName(nbsp + rs.getString(2));                        arr.add(tf);                    }                    session.setAttribute("type", arr);                    rs = cb.dbSelect(
                            "select cy_Id,cy_Name,cy_Level from cy_articleclass where cy_Id=" +
                            id + "");
                    TypeForm tff = new TypeForm();
                    while (rs.next()) {                        tff.setTypeId(rs.getInt(1));
                        String nbsp = "";
                        for (int i = 0; i < rs.getInt(3); i++) {
                            nbsp += "&nbsp;&nbsp;";
                        }                        tff.setTypeName(nbsp + rs.getString(2));                    }
                    request.setAttribute("default", tff);
                    rs.close();
                    cb.close();                    return mapping.findForward("showParentType");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }        }
2.jsp页面的部分代码:
<TD><logic:notPresent name="default">
         <html:select property="typeId" size="1" name="">
          <option value="0">无(作为一级分类)</option> 
          <html:optionsCollection name="type" label="typeName" value="typeId" filter="false"/>
         </html:select>
        </logic:notPresent>
        <logic:present name="default">
         <html:select property="typeId" name="default" size="1">
          <option value="0">无(作为一级分类)</option>
          <html:optionsCollection name="type" label="typeName" value="typeId" filter="false"/>
         </html:select>
        </logic:present>
    </TD>
3.问题症状:
首先在jsp页面点击不同的链接,给一个action传state和id两个参数,通过这两个参数,判断要执行的操作也就是:添加一级分类,还是在某个分类下添加子类,如果id等于0,怎是添加一级分类,不为零则添加为某个已存在类的子类。添加为子类的时候运行正常,问题出在添加为一级分类的时候,以下是错误提示代码:
type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception javax.servlet.ServletException: Cannot find bean under name 
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
org.apache.jsp.typeAdd_jsp._jspService(typeAdd_jsp.java:166)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069)
org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:455)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause javax.servlet.jsp.JspException: Cannot find bean under name 
org.apache.struts.taglib.html.SelectTag.calculateMatchValues(SelectTag.java:301)
org.apache.struts.taglib.html.SelectTag.doStartTag(SelectTag.java:244)
org.apache.jsp.typeAdd_jsp._jspx_meth_html_select_0(typeAdd_jsp.java:213)
org.apache.jsp.typeAdd_jsp._jspx_meth_logic_notPresent_0(typeAdd_jsp.java:187)
org.apache.jsp.typeAdd_jsp._jspService(typeAdd_jsp.java:104)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069)
org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:455)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
note The full stack trace of the root cause is available in the Apache Tomcat/5.0.27 logs.

解决方案 »

  1.   


    保证"default"参数有值,换用logic:equal和logic:notequal标签试试
      

  2.   

    保证default bean有值了,用了logic:equal和logic:notEqual,还是有错误
    type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception javax.servlet.ServletException: Cannot find bean under name org.apache.struts.taglib.html.BEAN
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
    org.apache.jsp.typeAdd_jsp._jspService(typeAdd_jsp.java:213)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069)
    org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:455)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    root cause javax.servlet.jsp.JspException: Cannot find bean under name org.apache.struts.taglib.html.BEAN
    org.apache.struts.taglib.html.SelectTag.calculateMatchValues(SelectTag.java:301)
    org.apache.struts.taglib.html.SelectTag.doStartTag(SelectTag.java:244)
    org.apache.jsp.typeAdd_jsp._jspx_meth_html_select_1(typeAdd_jsp.java:350)
    org.apache.jsp.typeAdd_jsp._jspx_meth_logic_equal_0(typeAdd_jsp.java:325)
    org.apache.jsp.typeAdd_jsp._jspService(typeAdd_jsp.java:115)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069)
    org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:455)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    note The full stack trace of the root cause is available in the Apache Tomcat/5.0.27 logs.
      

  3.   

    html.SelectTag是这个标签的错误
      

  4.   

    <html:select property="typeId" size="1" name="">
    这个标签是针对Bean的,假如你有个bean明叫form,其中的数组属性是typeId,你就可以这样写
    <html:select property="typeId" size="1" name="form">
      

  5.   

    <html:select property="typeId" size="1" name="XXX">
    我如上写的目的是为了匹配XXX 这个bean的typeId的这个属性的值,这个值就是我想默认选中的值,其他的值是循环输出的。如果XXX不存在,则就是循环输出数组里所有的bean对象,如果XXXbean存在,就默认选中与此bean里的typeId属性值相等的选项
      

  6.   

    奇怪的是,当XXXbean存在时,能够运行成功,也能默认选中某个选项,但是当XXX不存在的时候,就会报出如上的错误。
    后来用logic:equal标签,还是出错
      

  7.   

    请问harston,你说的“数组属性”是什么意思啊?
      

  8.   

    if (this.value != null) {
                this.match = new String[1];
                this.match[0] = this.value;
                
            } else {
                Object bean = TagUtils.getInstance().lookup(pageContext, name, null);
                if (bean == null) {
                    JspException e =
                        new JspException(messages.getMessage("getter.bean", name));
                        
                    TagUtils.getInstance().saveException(pageContext, e);
                    throw e;
                }            try {
                    this.match = BeanUtils.getArrayProperty(bean, property);
                    if (this.match == null) {
                        this.match = new String[0];
                    }            } catch (IllegalAccessException e) {
                    TagUtils.getInstance().saveException(pageContext, e);
                    throw new JspException(
                        messages.getMessage("getter.access", property, name));            } catch (InvocationTargetException e) {
                    Throwable t = e.getTargetException();
                    TagUtils.getInstance().saveException(pageContext, t);
                    throw new JspException(
                        messages.getMessage("getter.result", property, t.toString()));            } catch (NoSuchMethodException e) {
                    TagUtils.getInstance().saveException(pageContext, e);
                    throw new JspException(
                        messages.getMessage("getter.method", property, name));
                }
            }上面这段是Struts之SelectTag标签的关键源码,也就是说你的bean不能为空,我这两天也正读源码,了解到了很多以前不能明白的问题,这些东西是写好了的,所以它不能按照你的意愿行事,很多时候看看源码你就知道为什么了
      

  9.   

    现在,我把思路变了一下,就是,不会让bean为空,只是让他去匹配相应的项,如果有相等的项,自然会匹配成功, 没有也就不会匹配成功,也就不能默认选中了
    可是仍然不行,不知道是不是select标签如果存在name属性,是否那个bean一定要匹配成功才行呢?