2014-10-16 3 views
5

У меня есть веб-приложение, которое отображает детали расписания фильма (извлеченные из базы данных MySQL), когда пользователь нажимает на плакат фильма.Значения, не отображаемые для языка выражений

Bean:

import java.sql.Date; 
import java.sql.Time; 

public class Schedule { 

private String[] malls; 
private Integer[] cinemas; 
private Double[] prices; 
private Date[] dates; 
private Time[] times; 

// getters and setters 
} 

Servlet:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
int movieId = request.getParameter("movieid") != null ? Integer.parseInt(request.getParameter("movieid")) : 0; 

if(movieId != 0) { 
    DatabaseManipulator dm = new DatabaseManipulator();  
    ... 

    // get schedule details from database 
    String[] malls = dm.getMallNames(movieId); 
    Integer[] cinemas = dm.getCinemaNumbers(movieId); 
    Double[] prices = dm.getMoviePrices(movieId); 
    Date[] dates = dm.getShowDates(movieId); 
    Time[] times = dm.getShowTimes(movieId); 

    // assemble bean objects 
    Schedule schedule = ScheduleAssembler.getInstance(malls, cinemas, prices, dates, times); 

    // returns new session if it does not exist 
    HttpSession session = request.getSession(true); 

    // bind objects to session 
    session.setAttribute("schedule", schedule); 
    session.setAttribute("times", times); // for schedule row count 

    // redirect to view schedule page 
    response.sendRedirect("view-schedule.jsp"); 

} else { 
    // redirect when servlet is illegally accessed 
    response.sendRedirect("index.jsp"); 
} 
} 

JSP:

<%@ page import="java.sql.*" %> 
... 
<body> 
... 
<strong>VIEW MOVIE SCHEDULE</strong> 
... 
<table id="schedule"> 
<tr><td class="titlebg" colspan="5">MOVIE SCHEDULE</td></tr> 
<tr> 
    <td class="catbg">Mall</td> 
    <td class="catbg">Cinema</td> 
    <td class="catbg">Price</td> 
    <td class="catbg">Date</td> 
    <td class="catbg">Time</td> 
</tr> 

<% 
Time[] times = (Time[]) session.getAttribute("times"); 

int rowCount = times.length; 

for(int ctr = 0; ctr < rowCount; ctr++) { %>   
<tr> 
    <td>${schedule.malls[ctr]}</td> 
    <td class="cinema">${schedule.cinemas[ctr]}</td> 
    <td>PHP ${schedule.prices[ctr]}</td> 
    <td>${schedule.dates[ctr]}</td> 
    <td>${schedule.times[ctr]}</td> 
</tr> 
<% } %> 
</table> 
</body> 

Q U E S T I O N:
enter image description here
Он добавляет нужное количество строк в таблицу расписания (на основе доступных сеансов в базе данных), но значения в EL не отображаются.

Тест println() в сервлетах соответственно получает значения массива и индексы массивов жестких дисков для данных таблицы (schedule.malls[0] вместо ctr) работает так, как должно быть.

Почему значения, не отображаемые при размещении в цикле?

ответ

2

Проблема заключается в том, что ctr не является неявным объектом и не находится ни в одной из областей (запрос, сеанс и т. Д.), Поэтому он не входит в объем выражений EL.

Чтобы исправить это есть в основном два варианта:

ВАРИАНТ # 1 (устаревшее)

Используйте скриптлеты (не забудьте импортировать класс Schedule в начале вашей JSP):

<% 
Time[] times = (Time[]) session.getAttribute("times"); 

int rowCount = times.length; 

for(int ctr = 0; ctr < rowCount; ctr++) { %>   
<tr> 
    <td><%= ((Schedule)session.getAttribute("schedule")).malls[ctr] %></td> 
    <td class="cinema"><%= ((Schedule)session.getAttribute("schedule")).cinemas[ctr] %></td> 
    <td>PHP <%= ((Schedule)session.getAttribute("schedule"))..prices[ctr] %></td> 
    <td><%= ((Schedule)session.getAttribute("schedule")).dates[ctr] %></td> 
    <td><%= ((Schedule)session.getAttribute("schedule")).times[ctr] %></td> 
</tr> 
<% } %> 

ВАРИАНТ # 2 (политически правильный)

Вам нужно refactorize что Schedulle класс и использовать JSLT теги, что-то вроде:

<c:forEach var="rowItem" items="${rowList}" > 
<tr> 
    <td>${rowItem.mall}</td> 
    <td class="cinema">${rowItem.cinema}</td> 
    <td>PHP ${rowItem.price}</td> 
    <td>${rowItem.date}</td> 
    <td>${rowItem.time}</td> 
</tr> 
</c:forEach> 

Не забудьте объявить TagLib на самого начало вашей JSP: гаванью

<% taglib prefix="c" uri="http://java.sun.com/jsp/jslt/core" %> 

I 't проверял это, поскольку у меня нет возможности отлаживать JSP прямо сейчас, это для вас, чтобы получить представление о ваших вариантах.

+0

Привет, столько, сколько я бы хочу пойти с современным вариантом № 2, мы еще не коснулись этого на наших уроках, но большое спасибо за предоставление альтернативы. Утвержден и принят как правильный ответ. – silver

1

Это, в основном, morgano's ВАРИАНТ # 1. Он правильно указал, что EL не в состоянии прочитать ctr, который я объявил в сценарии, так что его ответ - мой принятый ответ.

Это просто, чтобы показать, как я ходил по Вариант № 1 подход:

<%@ page import="com.mypackage.model.Schedule" %> 
... 
<% 
Schedule schedule = session.getAttribute("schedule") != null ? (Schedule) session.getAttribute("schedule") : null; 

if(schedule != null) { 
    int rowCount = schedule.getTimes().length; 

    for(int ctr = 0; ctr < rowCount; ctr++) { 
%> 
<tr> 
    <td><%=schedule.getMalls()[ctr] %></td> 
    <td class="cinema"><%=schedule.getCinemas()[ctr] %></td> 
    <td>PHP <%=schedule.getPrices()[ctr] %></td> 
    <td><%=schedule.getDates()[ctr] %></td> 
    <td><%=schedule.getTimes()[ctr] %></td> 
</tr> 
<% } 

} else { 
    // redirect on illegal access 
    response.sendRedirect("index.jsp");  
} 
%> 
-1

Для каждого значения элемента строки, который будет отображаться добавить <c:out> tag.Checkout следующий пример ниже:

<td><c:out value="${rowItem.mall}" /></td> 

Счастливый Coding

 Смежные вопросы

  • Нет связанных вопросов^_^