【问题标题】:Javabeans and JSP 2.0Javabeans 和 JSP 2.0
【发布时间】:2011-05-05 23:15:34
【问题描述】:

所以我正在尝试根据数据库访问的搜索结果构建一个表。

我正在搜索课程,所以我有一个名为 CourseJBean 的 javabean,它有许多字段以及适当的 getter 和 setter(例如,对于字段 'id',使用 getId() 和 setId(newId)) .我还有一个名为 searchJBean 的 javabean,它包含 CourseJBeans 的 ArrayList(ArrayList 是参数化的)。这是我处理从搜索中返回的未知数量的课程。然后我想用每行一个课程填充一个表格,每个单元格都有课程的一个属性。

我对searchJBean的填充如下:

searchJBean results = new searchJBean();

while (resultSet.next())    {
    CourseJBean course = new CourseJBean();
    course.setId(resultSet.getString(1));
    course.setSection(resultSet.getString(2));
              :
              :
    course.setExam(resultSet.getString(14));
    course.setCredits(resultSet.getString(15));
    results.addCourse(course);
}

在我的 JSP 中,我有一个 JSTL for-each 循环正在进行

 <c:forEach var="course" items="${requestScope.searchResults.courses}">

我想要做的是循环遍历 searchJBean(称为“searchResults”)中的 ArrayList(保存它的字段称为“courses”),然后创建一行,每个单元格包含 course 的不同属性,例如

<tr> 
    <td> ${course.id} </td>
    <td> ${course.section} </td>
            :
            :
</tr>

希望这将填充一个包含大量值的表。 CourseJBean 的字段都是字符串类型,如果这很重要的话。我在带有 Apache 7 本地服务器的 Netbeans 7.0 上使用 JSP 2.0、JDK 1.6 和 Java SE 6。

但是,当我这样运行时,我得到了一个错误:

May 5, 2011 6:39:23 PM org.apache.catalina.core.StandardWrapperValveinvoke  
SEVERE: Servlet.service() for servlet [cirr_search.do] in context with path [/Registrar] threw exception [An exception occurred processing JSP page /HTML-JSP/searchResults.jsp at line 55

52:                      
53:  <tr> 
54:      <td> 
55:          ${course.id} 
56:      </td> 
57:      <td> 
58:          ${course.section}


Stacktrace:] with root cause javax.el.PropertyNotFoundException: 
        Property 'id' not readable on type java.lang.String     
at javax.el.BeanELResolver$BeanProperty.read(BeanELResolver.java:291)   
at javax.el.BeanELResolver$BeanProperty.access$000(BeanELResolver.java:239) 
at ....

(等等。如果你想要完整的日志,我可以稍后粘贴。)

我认为这意味着它将“课程”作为字符串而不是 CourseJBean 检索,这就是它找不到属性“id”的原因。我不知道为什么会这样,所以在谷歌搜索之后,我添加了标签:

在页面头部(head标签之间):

<jsp:useBean id="searchResults" scope="request" class="searchJBean"/>

在循环的开始,即标签之后:

<jsp:useBean id="course" scope="page" class="CourseJBean"/>

CourseJBean.java 和 searchJBean.java 都驻留在默认包中(现在——我正在学习)。我不完全确定如何使用“类”属性,所以这就是我所说的。但是现在当我运行它时,我得到了这个错误:

org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 14 in the jsp file: /HTML-JSP/searchResults.jsp
searchJBean cannot be resolved to a type
11:         <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
12:         <script type="text/javascript" src="JavaScript/searchResults.js"></script>
13:         <title>cirr_search results</title> 
14:         <jsp:useBean id="searchResults" scope="request" class="searchJBean"/>
15:     </head> 
16:  

重复三遍,然后:

An error occurred at line: 52 in the jsp file: /HTML-JSP/searchResults.jsp
CourseJBean cannot be resolved to a type
49:                 <!-- Build the rows. -->
50: 
51:                 <c:forEach var="course" items="${requestScope.searchResults.courses}">
52:                     <jsp:useBean id="course" type="CourseJBean" scope="page" class="CourseJBean"/>
53:                     <tr>
54:                         <td>
55:                             ${course.id}

这也重复了 3 次,然后是一个以

开头的堆栈跟踪
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:95)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:457)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:374)

然后再继续十或十五行。

所以我的问题是:

这是什么意思?
什么是“类型”?
我是否需要在 JSP 2.0 中使用标签?不是应该能找到吗?
最初的错误——为什么我会得到一个字符串?

最重要的是,我该如何解决这个问题?

编辑: servlet 很无聊,所以这里(部分)是创建 CourseJBean 的 DB 访问:

List<CourseJBean> results = new ArrayList<CourseJBean>();

while (resultSet.next())    {
    CourseJBean course = new CourseJBean();
    course.setId(resultSet.getString(1));
    course.setSection(resultSet.getString(2));
    course.setTitle(resultSet.getString(3));
    course.setProf(resultSet.getString(4));
    course.setProfID(resultSet.getString(5));
    course.setDept(resultSet.getString(6));
    course.setDays(resultSet.getString(7));
    course.setTime(resultSet.getString(8));
    course.setArea(resultSet.getString(9));
    course.setDiv(resultSet.getString(10));
    course.setRoom(resultSet.getString(11));
    course.setReg(resultSet.getString(12));
    course.setMax(resultSet.getString(13));
    course.setExam(resultSet.getString(14));
    course.setCredits(resultSet.getString(15));
    results.add(course);
}

return results;

CourseJBean 具有以下字段:

private String id;          
private String section;
private String title;
private String prof;
private String profID;
private String dept;
private String days;
private String time;
private String area;
private String div;
private String room;
private String reg;
private String max;
private String exam;
private String credits;

它们都是字符串,因为我(现在)这样更容易将它们扔到桌子上。

这是打印表格的代码:

<table id="results_table" border="1" cellpadding="5">

    <!--Row headings-->
    <tr>
        <td>ID</td><td>Section</td><td>Title</td><td>Professor (email)</td>
        <td>Department</td><td>Days</td><td>Times</td><td>Area/Div</td>
        <td>Room</td><td>Reg/Max</td><td>Exam</td><td>Credits</td><td></td>
    </tr>

    <!-- Build the rows. -->

    <c:forEach var="course" items="${requestScope.searchResults}">
        <tr>
            <td>${course.id}</td>
            <td>${course.section}</td>
            <td>${course.title}</td>
            <td>${course.prof} (${course.profID})</td>
            <td>${course.dept}</td>
            <td>${course.days}</td>
            <td>${course.time}</td>
            <td>${course.area}</td>
            <td>${course.room}</td> 
            <td>${course.reg}/${course.max}</td>
            <td>${course.exam}</td>
            <td>${course.credits}</td>
            <td><buttonid="dropButton"type="button"value="${course.id}">Drop</button></td>
        </tr>
    </c:forEach>    
</table>

当我这样运行它时,我得到相同的'PropertyNotFoundException':

javax.el.PropertyNotFoundException: Property 'id' not readable on type java.lang.String

我不确定它从哪里得到一个字符串。如果我完全注释掉 forEach 循环,并且只有 ${searchResults},我会得到这个数组:

[CourseJBean@554210, CourseJBean@16433e4, CourseJBean@18ada25, CourseJBean@f7bd29, CourseJBean@a3cf3e, CourseJBean@7af3e0, CourseJBean@21151e, CourseJBean@1f194d9, CourseJBean@1635a89, CourseJBean@1ccf0ad]

如果我理解正确的话,它是对我的 CourseJBeans 的引用数组。当我要求 ${searchResults[3]} 时,它会打印出来

CourseJBean@1482aa9

我认为这是一个参考。所以它有一个数组,但是因为它是引用,所以它把它们作为字符串读取,而不是引用?

另外,如果在我的 servlet 中(使用下面的第一个代码),我将每个课程变成一个数组,循环它并打印出每个条目,我会得到以下(下面的第二个代码集):

response.setContentType("text/html");
PrintWriter out = response.getWriter();
for (CourseJBean course : searchResults)   {
    String[] props = course.toArray();
    out.write("<br/>");
    for (String prop : props)   {
        out.write(prop + ",");
    }
} 
out.close();

生产

EC,EC134,E,4,MW, 1:00pm- 2:15pm,Principles of Macroeconomics,S, ,DIAM 141,21,35,15,Aguilar, laguilar,
EC,EC134,E,4,T, 3:00pm- 3:50pm,Principles of Macroeconomics,S, ,DIAM 141,21,35,15,Aguilar, laguilar,
EC,EC134,A,4,TR, 9:30am-10:45am,Principles of Macroeconomics,S, ,DIAM 141,35,35,15,Long, Jason.Long,
....... etc. (all 10 are here, with the correct data)

所以属性被正确地放入 CourseJBean,并且数组“searchResults”正确地引用了所有 10 个 CourseJBean,但它一直告诉我我有一个字符串?

很抱歉,如果那是更多的噪音 - 我已经知道信息太多总比太少好。

编辑2:

所以我在清理完东西并将东西放入包后遇到的错误:

javax.el.PropertyNotFoundException: Property 'id' not readable on type java.lang.String
    javax.el.BeanELResolver$BeanProperty.read(BeanELResolver.java:291)
    javax.el.BeanELResolver$BeanProperty.access$000(BeanELResolver.java:239)
    javax.el.BeanELResolver.getValue(BeanELResolver.java:85)
    javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
    org.apache.el.parser.AstValue.getValue(AstValue.java:169)
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
    org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:985)
    org.apache.jsp.HTML_002dJSP.searchResults_jsp._jspx_meth_c_005fforEach_005f0(searchResults_jsp.java:211)
    org.apache.jsp.HTML_002dJSP.searchResults_jsp._jspService(searchResults_jsp.java:125)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    website.cirr_search.processRequest(cirr_search.java:113)
    website.cirr_search.doGet(cirr_search.java:128)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

我认识的只有两行,带有 website.cirr_search 的行(同样是小项目),在 cirr_search 的第 113 行是

search.forward(请求,响应);

“搜索”是我的结果页面(通过 RequestDispatcher 获得)。不知道为什么这会是一个问题。

【问题讨论】:

    标签: java jsp netbeans javabeans


    【解决方案1】:

    所以我正在尝试根据数据库访问的搜索结果构建一个表。

    你使用的是servlet,对吧?


    ...所以我有一个名为 CourseJBean 的 javabean ...我还有一个名为 searchJBean 的 javabean...

    为什么不只是一个List&lt;Course&gt;


    我在带有 Apache 7 本地服务器的 Netbeans 7.0 上使用 JSP 2.0、JDK 1.6 和 Java SE 6。

    为什么不用 JSP 2.2? Tomcat 7 支持 Servlet 3.0 / JSP 2.2。


    严重:Servlet.service() 用于 servlet [cirr_search.do]

    你在使用 Struts 吗?


    在第 55 行处理 JSP 页面 /HTML-JSP/searchResults.jsp 时发生异常

    55:          ${course.id} 
    

    根本原因 javax.el.PropertyNotFoundException:属性“id”在 java.lang.String 类型上不可读

    我认为这意味着它将“课程”作为字符串检索,而不是 CourseJBean

    没错。也可能是${requestScope.searchResults.courses} 返回了String


    我添加了&lt;jsp:useBean&gt; 标签:

    哦,请不要。


    CourseJBean.java 和 searchJBean.java 都驻留在默认包中(目前——我正在学习)。

    当你想要做的不仅仅是拥有一个带有main() 方法的类时,千万不要使用默认包。默认包中的类对包内的类是不可见的。包内的类无法访问或import 默认包中的类。 JSP/Servlet 容器本身存在于一个包中的类,生成的 JSP 文件也在一个包中。


    在 jsp 文件中的第 14 行发生错误:/HTML-JSP/searchResults.jsp
    searchJBean 无法解析为类型

    14:         <jsp:useBean id="searchResults" scope="request" class="searchJBean"/>
    

    这是什么意思?

    类路径中缺少该类(或者因为它在默认包中而根本不可见)。


    什么是“类型”?

    类、接口或枚举。在你的情况下,一个类。


    即使在 JSP 2.0 中我也需要使用&lt;jsp:useBean&gt; 标签吗?不应该能找到吗?

    不,你不需要它们。


    原来的错误——为什么我会得到一个字符串?

    因为你提供了一个字符串。


    最重要的是,我该如何解决这个问题?

    不确定。问题中有很多噪音,缺少真正感兴趣的代码。然而,它不应该那么难。您可以在this answer 中找到如何借助 JSP 和 Servlet 创建搜索表单的示例。

    【讨论】:

    • 我试图在下面发表评论,但是字符太多了。
    • SearchJBeanCourseJBean 类是否放在一个真正的包中(因此不是默认包),它们是public class吗? (注public
    • 好吧,我从 SearchJBean 切换到只是一个 ArrayList,这是您推荐的,也是我最初的计划,但是是的,CourseJBean 位于“真实”包中并且是公开的。
    • 哦,是的,我使用的是 servlet,没有使用 Struts,而且据我所知,我使用的是 JSP 2.2;我只知道它是 2.x。
    • 已解决——显然我没有保存我对 CourseJBean 所做的编辑,对于字段“id”,我有 getID(),而不是 getId()。浪费了很多时间。
    猜你喜欢
    • 2013-04-10
    • 2011-01-23
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多