因此,我正在尝试基于数据库访问的搜索结果构建一个表。
我正在搜索课程,所以我有一个名为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’),然后创建一行,每个单元格包含课程的不同属性,例如
<tr>
<td> ${course.id} </td>
<td> ${course.section} </td>
:
:
</tr>希望这将用大量的值填充一个表。CourseJBean的字段都是String类型的。我在带有Apache7本地服务器的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的形式检索'course‘,这就是为什么它找不到属性'id’的原因。我不确定为什么会发生这种情况,所以在谷歌了一堆之后,我选择了添加标签:
在页面的页眉中(在head标签之间):
<jsp:useBean id="searchResults" scope="request" class="searchJBean"/>在循环开始时,即在标签之后:
<jsp:useBean id="course" scope="page" class="CourseJBean"/>CourseJBean.java和searchJBean.java都位于默认包中(目前--我正在学习)。我不完全确定如何使用"class“属性,所以这就是我所说的。但是现在当我运行它时,我得到了这个错误:
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}它也会重复三次,然后是一个堆栈跟踪
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)并继续进行另外10或15行。
所以我的问题是:
这是什么意思?
什么是“类型”?
即使在JSP2.0中也需要使用标记吗?难道它不应该能够找到它们吗?
最初的错误--为什么我要得到一个字符串?
最重要的是,我该如何解决这个问题?
编辑: servlet很无聊,所以下面(部分) DB访问来创建CourseJBean:
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的引用数组。当我请求${searchResults3}时,它会打印
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个CourseJBeans,但是它却一直告诉我我有一个字符串?
抱歉,如果这是更多的噪音--我已经了解到,拥有太多的信息比太少的信息更好。
编辑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获得)。我不确定为什么这会是个问题。
发布于 2011-05-06 11:16:09
,所以我正在尝试根据数据库访问的搜索结果构建一个表。
你用的是servlet,对吧?
...所以我有一个名为CourseJBean的javabean ...我还有一个名为searchJBean的javabean ...
为什么不只是一个List<Course>
我在带有Apache7本地服务器的NetBeans7.0上使用JSP2.0、JDK1.6和JavaSE6。
为什么不使用JSP2.2?Tomcat 7支持Servlet 3.0 / JSP 2.2。
servlet严重:用于
cirr_search.do的Servlet.service()
你在使用Struts吗?
处理JSP page /HTML-JSP/searchResults.jsp时在第55行出现异常
55:${course.id}
根本原因javax.el.PropertyNotFoundException:属性'id‘在类型java.lang.String上不可读我认为这意味着它将'course’作为字符串检索,而不是CourseJBean
是这样的。也可以是${requestScope.searchResults.courses}返回了一个String。
我添加了
<jsp:useBean>标签:
哦,不,不。
CourseJBean.java和searchJBean.java都位于默认包中(目前--我正在学习)。
如果您想做的不仅仅是拥有一个带有main()方法的类,就不要使用缺省包。默认包中的类对于包中的类是不可修改的。包中的类不能访问默认包中的import类。JSP/Servlet容器本身存在于包中的类中,生成的JSP文件也在包中。
在jsp文件的第: 14行出现错误: /HTML-JSP/searchResults.jsp
无法将searchJBean解析为类型
14:
这是什么意思?
类路径中缺少该类(或者它只是不可见,因为它在缺省包中)。
什么是“类型”?
类、接口或枚举。在你的例子中,是一个类。
即使在JSP2.0中也需要使用
<jsp:useBean>标记吗?难道它不应该能够找到它们吗?
不你不需要它们。
原始错误--为什么我要得到一个字符串?
因为你提供了一个字符串。
,最重要的是,我如何解决这个问题?
不确定。问题中有很多杂音,真正感兴趣的代码缺失了。然而,这应该不会那么难。您可以在this answer中找到有关如何在JSP和Servlet的帮助下创建搜索表单的示例。
https://stackoverflow.com/questions/5905133
复制相似问题