我有一个网络应用程序,当用户点击电影海报时显示电影时间表详细信息(从MySQL数据库中检索)。
豆:
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:
它将所需的行数添加到计划表中(基于数据库中可用的放映时间),但EL中的值未显示。
在Servlet中测试println()是否适当地获取每个表数据(schedule.malls[0]
而不是ctr
)的数组值和硬编码数组索引。它应该正常工作。
为什么在置于for循环中时值不显示?
答案 0 :(得分:2)
问题是ctr
不是隐式对象,并且不在任何范围(请求,会话等)中,因此它不在EL表达式的范围内。
要修复它,你基本上有两个选择:
选项#1(已弃用)
使用scriptlet(不要忘记在JSP的开头导入类Schedule
):
<%
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(政治上正确的)
您需要重构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>
不要忘记在JSP的开头声明taglib:
<% taglib prefix="c" uri="http://java.sun.com/jsp/jslt/core" %>
我还没有对此进行测试,因为我现在无法调试JSP,这是为了让您了解自己的选择。
答案 1 :(得分:1)
这基本上是摩根的选项#1 。他正确地指出EL无法读取我在scriptlet中声明的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");
}
%>
答案 2 :(得分:-1)
对于要显示的每个行项目值,添加<c:out>
标记。请查看以下示例:
<td><c:out value="${rowItem.mall}" /></td>
快乐编码