我正在尝试使用JSP和tomcat创建一个web界面。我有一个学生和他们的信息表,我希望用户能够搜索一个学生,然后我想显示该学生的所有信息(在一个表中)。到目前为止,我已经显示了整个student表并创建了一个搜索框,但是现在当用户单击“search”时,我不知所措。我正在考虑创建一个搜索数据库的函数,但我不确定如何做到这一点,因为我是JSP新手。如何调用函数?这是我到目前为止的代码:

<%@ page import="java.sql.*" %>

<%
String connectionURL =
"jdbc:postgresql://cop4715-postgresql.ucf.edu:8472/******?user=*******&password=******";

Connection connection = null;
Statement statement = null;
ResultSet rs = null;
%>
<html><body>
<h1>Student Table</h1>
<table border = "2">
    <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Birthday</th>
            <th>Address</th>
            <th>Email</th>
            <th>Level</th>
        </tr>
    </thead>
<%
Class.forName("org.postgresql.Driver").newInstance();
connection = DriverManager.getConnection(connectionURL);
statement = connection.createStatement();
rs = statement.executeQuery("SELECT * FROM students");
ResultSetMetaData metadata = rs.getMetaData();

 while (rs.next()) { %>
    <tr>
    <%
    for(int i = 1; i <= metadata.getColumnCount(); i++){ %>
        <td>
        <%=rs.getString(i)%>
        </td>
    <%
       }
    %>
    </tr>
<%
 }
%>
</table>
<%
rs.close();
%>
<br>

<form action = test()>
Search By Name: <input type="text" name="Name">
<input type ="submit" value="Search">
</form>



</body></html>

最佳答案

你调用函数的思路不正确。为什么?因为,一个函数将调用在客户端执行的JavaScript,而您希望从服务器端的数据库中检索数据,就像您已经在使用<% scriptlets %>*一样,如下所示

<form action = test()>

实现这一点的最简单方法是自提交JSP,即HTML表单将数据发送到在中定义的同一JSP。您只需完全删除action属性即可完成此操作。
现在,为了区分JSP是应该检索所有学生的数据还是一个特定的学生的数据,您将更改代码以检查Name请求属性,如下所示。
String name = request.getParameter("Name");
if (name != null && name.length() > 0) {
    rs = statement.executeQuery("SELECT * FROM students WHERE Name = '" + name + "'");
} else {
    rs = statement.executeQuery("SELECT * FROM students");
}

因为上面的查询现在已经参数化了,所以强烈建议现在使用PreparedStatement
if (name != null && name.length() > 0) {
    PreparedStatement ps = connection.prepareStatement(
                           "SELECT * FROM students WHERE Name = ?"); // ? = placeholder
    ps.setString(1, name); // Bind the value to the placeholder
    rs = ps.executeQuery(); // Execute the prepared statement and fetch results
}

PreparedStatement有助于避免SQL注入攻击,并消除笨拙且容易出错的字符串连接。
*scrptlet早就被弃用了。一种更好的方法是将一个Servlet放在处理所有JDBC代码的中间,用结果填充request对象,然后转发到一个JSP,该JSP只处理结果如何呈现给用户。

09-11 19:43
查看更多