0

我目前正在开发一个包含 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 包是使用的服务器。

如果您对代码的任何其他部分有任何疑问,请告诉我,因为我非常有兴趣尽快完成并高效地完成这个特定项目并运行。我很乐意提供所需的任何其他编码和参考。

在这个特定地点的任何帮助都非常感谢并且非常有帮助。感谢您查看此内容。

4

2 回答 2

2

问题出在这部分代码

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

现在您可以for each将 jsp 内部用作:

<c:forEach var="myReader" items="${ref}">
       <option value="">${myReader.title}</option>
</c:forEach>

请注意我在for-each上面的循环中所做的更改。

首先在items属性中你需要一个集合,所以我们ref在会话中设置了一个名为的集合,这样我们就可以使用它了。

现在在var属性中,我们定义一个局部变量 whihc 类似于

for(Reader myReader : ref)//myReader会进去,varlist ref(collection)也会进去items

现在您可以使用类似的myReadervar访问属性或for-each${myReader.title}${myReader['title']}

于 2013-01-30T06:43:37.660 回答
1

修改你的代码

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 修改的情况下工作。

于 2013-01-30T06:34:31.920 回答