2014-10-16 17 views
5

Ho un'app Web che visualizza i dettagli della pianificazione film (recuperati da un database MySQL) quando l'utente fa clic sul poster del film.Valori non visualizzati per la lingua di espressione

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 N O:
enter image description here
Aggiunge il numero desiderato di righe alla tabella di pianificazione (in base agli orari di programmazione disponibili nel database), ma i valori nell'EL non vengono visualizzati.

Test printnn() nel Servlet sta ottenendo in modo appropriato i valori dell'array e gli indici di array hardcoded per dati di tabella (schedule.malls[0] anziché ctr) funziona come dovrebbe essere.

Perché i valori non vengono visualizzati se inseriti in un ciclo?

risposta

2

Il problema è che ctr non è un oggetto implicito e non è in alcuno degli ambiti (richiesta, sessione, ecc.), Quindi non è nell'ambito delle espressioni EL.

Per risolvere il problema si deve fondamentalmente due opzioni:

OPZIONE # 1 (obsoleto)

Utilizzare scriptlet (non dimenticate di importare la classe Schedule all'inizio del vostro 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> 
<% } %> 

OPZIONE # 2 (politicamente corretto)

Avrai bisogno di refactorize che Schedulle classe e utilizzare i tag JSLT, qualcosa di simile:

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

Non dimenticare di dichiarare la taglib al beggining del vostro JSP:

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

Mi rifugio Ho provato questo perché non ho modo di eseguire il debug di JSP in questo momento, questo è per te per avere un'idea delle tue opzioni.

+0

Ciao, per quanto mi farebbe voglio andare con la moderna Opzione # 2, non l'abbiamo ancora toccata nelle nostre lezioni, ma grazie infinite per aver fornito un'alternativa. Votato e accettato come risposta corretta. – silver

1

Questo è fondamentalmente l'OPZIONE di morgano n. 1. Ha correttamente sottolineato che EL non è in grado di leggere lo ctr che ho dichiarato nello scriptlet, quindi la sua risposta è la mia risposta accettata.

Questo è solo di mostrare come sono andato circa l'approccio Opzione # 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

Per ogni valore voce di fila da visualizzare aggiungere il <c:out> tag.Checkout il seguente esempio qui sotto:

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

felice Coding