我目前正在开发一个包含JSP,servlet和一些CRUD数据库服务的网站。我被困在 CRUD 的读取部分,因为我无法获得所需的效果。
我连接到数据库,能够毫无困难地从网站插入数据。 我现在要做的是在 JSP 调用中对数据库中的行有一个选择/选项框,并在下一页上翻译该行的相应列。 但是,我无法从选项框中显示多行。 下面列出了代码。
豆类:
public class ReadBean {
protected String title;
protected String author;
protected String text;
public String getTitle() {
return title;
}
public void setTitle(String newTitle) {
title = newTitle;
}
public String getAuthor() {
return author;
}
public void setAuthor(String newAuthor) {
author = newAuthor;
}
public String getText() {
return text;
}
public void setText(String newText) {
text = newText;
}
}
控制器:
@WebServlet(urlPatterns = { "/com/defaultValidate/ReadController" })
public class ReadController extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
ReadBean reader = new ReadBean();
String address;
if (request.getParameter("ReadConfirm") != null) {
try {
Connection connect = ConnectionManager.getConnection();
String SQL = "SELECT * FROM prayers ORDER BY prayerTitle DESC";
PreparedStatement ps = connect.prepareStatement(SQL);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
request.getSession().setAttribute("ref", reader);
reader.setTitle(rs.getString("prayerTitle"));
}
} catch (Exception e) {
}
address = "ReadConfirm.jsp";
} else if (request.getParameter("ReadView") != null) {
address = "ReadView.jsp";
} else {
address = null;
}
RequestDispatcher dispatcher = request.getRequestDispatcher(address);
dispatcher.forward(request, response);
}
}
然后是控制器响应的相应 jsp 页面:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@include file="MenuHeader.jsp"%>
</div>
<div id="mainBorder"> </div>
<div id="mainBody">
<table id="mainTable">
<tr>
<td id="sidebar">
<h2>Options</h2>
<ul>
</ul>
</td>
<td id="mainContent">
<h2 id="contentHeader">Select a prayer</h2>
<form action="ReadController">
<table border="1" width="1" cellspacing="5" cellpadding="5">
<thead>
<tr>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><select name="prayer_id">
<c:forEach var="ReadController" items="${ref.title}">
<option value="">${ref.title}</option>
</c:forEach>
</select>
</td>
</tr>
<tr>
<td><input type="submit" name="ReadView" value="View"> </td>
</tr>
</tbody>
</table>
</form>
<td id="imageBar">
</td>
</table>
<%@ include file="../menuHeaderAndFooter/MenuFooter.jsp" %>
我绝对不是专家,但我认为在从控制器到 JSP 中 for-each 元素的连接之间我错过了一些东西,我只是卡住了。 出于好奇,本节的 WEB-XML 部分是可操作的,ConnectionManager 是设置与数据库连接的简单调用。 Glassfish软件包是使用的服务器。
如果您对代码的任何其他部分有任何疑问,请告诉我,因为我对尽快有效地完成并运行此特定项目非常感兴趣。 我很乐意提供所要求的任何其他编码和参考。
在这个特定地点的任何帮助都是非常值得赞赏的,非常有帮助。 谢谢你看这个。
问题出在你代码的这一部分
while(rs.next()){
request.getSession().setAttribute("ref", reader);
reader.setTitle(rs.getString("prayerTitle"));
}
每次读取新值,然后将该"ref"放入会话中时,您都会覆盖"ref"属性。因此,您在会话中放置了一个值,因此您将获得一行。
因此,请将所有这些值放在集合(如列表)中,然后在会话中设置该列表:
List<ReadBean> myList = new Arraylist<ReadBean>();
while(rs.next()){
ReadBean reader = new ReadBean();
reader.setTitle(rs.getString("prayerTitle"));
myList.add(reader);
}
request.getSession().setAttribute("ref", myList);
现在你可以将 jsp 中的for each
用作:
<c:forEach var="myReader" items="${ref}">
<option value="">${myReader.title}</option>
</c:forEach>
请注意我在上面的for-each
循环中所做的更改。
首先items
属性中,您需要一个集合,因此我们在会话中设置了一个名为 ref
的集合,以便我们可以使用它。
现在在 var
属性中,我们定义了一个局部变量,
for(Reader myReader : ref)
//myReader 将进入var
,ref
列表(集合)将进入items
现在,您可以使用for-each
中的 myReader
var 访问属性,例如 ${myReader.title}
或 ${myReader['title']}
修改代码
List<ReadBean> readerList = new Arraylist<ReadBean>();
while(rs.next()){
// blah blah
reader.setTitle(rs.getString("prayerTitle"));
readerList.add(reader); // add this reader instance to list
}
// after while loop
request.getSession().setAttribute("ref", readerList);
如有必要,相应地修改您的 JSP 以迭代 readerList,我认为它应该无需修改 jsp 即可工作。