Javabeans и JSP 2.0 - PullRequest
       14

Javabeans и JSP 2.0

0 голосов
/ 06 мая 2011

Итак, я пытаюсь построить таблицу на основе результатов поиска из доступа к базе данных.

Я ищу курсы, поэтому у меня есть javabean с именем CourseJBean, который имеет несколько полей исоответствующие методы получения и установки (например, для поля 'id', используются getId () и setId (newId)).У меня также есть javabean с именем searchJBean, который содержит ArrayList для CourseJBeans (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}">

Я хочу, чтобы это было выполнено в цикле через ArrayList (поле, содержащее его, называется 'courses') в searchJBean (называемом 'searchResults')и затем создайте строку, в которой каждая ячейка будет содержать свое свойство курса, например,

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

. Надеемся, это заполнит таблицу множеством значений.Все поля CourseJBean имеют тип String, если это имеет значение.Я использую JSP 2.0, JDK 1.6 и Java SE 6 на Netbeans 7.0 с локальным сервером Apache 7.

Однако, когда я запускал его так, я получал ошибку:

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 ....

(и т. Д. Если вам нужен полный журнал, я могу вставить его позже.)

Я думаю, это означало, что он извлекает «курс» в виде String, а не CourseJBean, поэтомуне могу найти свойство 'id'.Я не был уверен, почему это происходит, поэтому после нескольких поисков Google я добавил теги:

В заголовке страницы (между тегами заголовков):

<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}

, которая также повторяется три раза и сопровождаетсятрассировка стека, которая начинается с

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?Разве он не сможет их найти?
Первоначальная ошибка - зачем мне получать строку?

И самое главное, как мне это исправить?

РЕДАКТИРОВАТЬ: сервлет скучно, так что вот (часть) доступа к БД для создания 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.Когда я запрашиваю $ {searchResults [3]}, он печатает

CourseJBean@1482aa9

, который я считаю справочным.Итак, у него есть массив, но поскольку он ссылается, он читает их как строки, а не ссылки?

Кроме того, если в моем сервлете (используя первый код ниже) я превращаю каждый курс в массив,Зацикливая его и распечатывая каждую запись, я получаю следующее (второй код установлен ниже):

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 (опять же, небольшой проект)и в строке 113 в cirr_search просто

search.forward (запрос, ответ);

где search - страница моих результатов (полученная через RequestDispatcher).Не уверен, почему это может быть проблемой.

1 Ответ

4 голосов
/ 06 мая 2011

Поэтому я пытаюсь создать таблицу на основе результатов поиска из доступа к базе данных.

Вы используете сервлет , верно?.


... поэтому у меня есть javabean с именем CourseJBean ... У меня также есть javabean с именем searchJBean ...

Почему бы не просто List<Course>?


Я использую JSP 2.0, JDK 1.6 и Java SE 6 на Netbeans 7.0 с Apache 7локальный сервер.

Почему не JSP 2.2?Tomcat 7 поддерживает Servlet 3.0 / JSP 2.2.


SEVERE: Servlet.service () для сервлета [cirr_search.do]

Используете ли вы Struts?


Возникла исключительная ситуация при обработке страницы JSP /HTML-JSP/searchResults.jsp в строке 55

55:          ${course.id} 

первопричина javax.el.PropertyNotFoundException: свойство 'id' notдля чтения по типу java.lang.String

Я думаю, это означало, что он извлекает «курс» в виде строки, а не CourseJBean

Это правильно.Также может быть, что ${requestScope.searchResults.courses} вернул String.


Я пошел с добавлением <jsp:useBean> тегов:

О, пожалуйста, нет.


И CourseJBean.java, и searchJBean.java находятся в пакете по умолчанию (сейчас - я учусь).

Никогда не используйте пакет по умолчанию, если вы хотите сделать немного больше, чем иметь класс с методом main().Классы в пакете по умолчанию невидимы для классов внутри пакета.Классы внутри пакета не могут получить доступ к import классам в пакете по умолчанию.Сам контейнер JSP / Servlet существует из классов в пакете, и сгенерированные файлы JSP также находятся внутри пакета.


Произошла ошибка в строке: 14 в файле jsp: / HTML-JSP / searchResults.jsp
searchJBean не может быть преобразован в тип

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

Что это значит?

Класс отсутствует вclasspath (или он просто невидим, потому что находится в пакете по умолчанию).


Что такое «тип»?

Aкласс, интерфейс или перечисление.В вашем случае класс.


Нужно ли использовать теги <jsp:useBean> даже в JSP 2.0?Разве он не сможет их найти?

Нет, они вам не нужны.


Первоначальная ошибка -Зачем мне получать строку?

Поскольку вы предоставили строку.


И самое главное, как это исправить?

Не уверен.В этом вопросе много шума, реальный код интереса отсутствует.Однако не должно быть , что трудно.Пример того, как создать форму поиска с помощью JSP и сервлета, можно найти в этом ответе .

...