JSP

网页应用程序开发

JSP实验06 查询数据库

实验目的:掌握在JSP页面中查询数据库的方法

本次实验使用Access数据库Book.mdb,表名为bookForm,包含字段如下:

 字段名称 数据类型和长度 说明
 bookISBN  文本(50)  书号,该字段为主键
 bookName  文本(50)  书名
 bookAuthor  文本(50)  作者
 bookPrice  数字  价格,单精度浮点数
 bookPublish  文本(50)  出版社
 bookTime  日期/时间  出版时间
 bookAbstract  文本(255)  摘要

1 查询记录

本例使用自定义标记以JDBC-ODBC桥接方式连接数据库查询图书,用户可以输入查询条件和文本,例如书名包含“JSP”的所有图书。

首先创建图书查询页面inputMess.jsp,首先在页顶添加指令引入自定义标记:

 <%@ taglib tagdir="/WEB-INF/tags" prefix="findBook" %>

在页面中添加表单,在表单中添加文本域findContent、列表框condition(包含书名/作者/出版社/出版时间/内容提要等5个选项)和提交接钮:

继续在页面中添加代码段获取表单提交的查询文本和查询条件,添加自定义标记执行查询操作,添加表达式显示结果:

<%  
String findContent = request.getParameter("findContent");
String condition = request.getParameter("condition");
if (findContent == null) {
    findContent = "";
}
if (condition == null) {
    condition = "";
}
byte b[]=findContent.getBytes("iso-8859-1");
findContent=new String(b, "utf-8");
%>
<findBook:FindBook dataSource="Driver={Microsoft Access Driver (*.mdb)};DBQ=d:/Book.mdb"
    tableName="bookForm"
    findContent="<%= findContent %>"
    condition="<%= condition %>" />
<%= giveResult %>

接下来在在/WEB-INF/tags下创建标记文件FindBook.tag,内容如下:

<%@ tag import="java.sql.*" %>
<%@ tag pageEncoding="utf-8" %>
<%@ attribute name="dataSource" required="true" %>
<%@ attribute name="tableName" required="true" %>
<%@ attribute name="findContent" required="true" %>
<%@ attribute name="condition" required="true" %>
<%@ variable name-given="giveResult" variable-class="java.lang.StringBuffer" scope="AT_END" %>
<%  
try {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e){
    out.print(e);
}
Connection con;
Statement sql;
ResultSet rs;
StringBuffer queryResult = new StringBuffer();
String uri = "jdbc:odbc:" + dataSource;
try {
    con = DriverManager.getConnection(uri,"","");
    sql = con.createStatement();
    String s = "SELECT * FROM " + tableName + " WHERE " + condition + " Like'%" + findContent + "%'";
    rs=sql.executeQuery(s);
    queryResult.append("查询到的图书:");
    queryResult.append("<table border=1>");
    queryResult.append("<tr>");
    queryResult.append("<th>ISBN</td>");
    queryResult.append("<th>图书名称</td>");
    queryResult.append("<th>作者</td>"); 
    queryResult.append("<th>价格</td>");
    queryResult.append("<th>出版社</td>");
    queryResult.append("<th>出版时间</td>");
    queryResult.append("<th>摘要</td>");
    queryResult.append("</tr>");
    int fields = 7;
    while (rs.next()) {
        queryResult.append("<tr>");
        String bookISBN = "";
        for (int k=1; k<=fields; k++) {
            if (k == 7) {
                String bookAbstract = rs.getString(k);
                String abs = "<textarea rows=6 colums=10/>" + bookAbstract + "</textarea>";
                queryResult.append("<td>" + abs + "</td>");
            }
            else {
                queryResult.append("<td>"+rs.getString(k)+"</td>");
            }
        }
    }
    queryResult.append("</table>"); 
    jspContext.setAttribute("giveResult",queryResult);
    con.close();
}
catch(SQLException exp){
    jspContext.setAttribute("giveResult",new StringBuffer("请设置查询条件。"));
}
%>

完成后在浏览器中运行inputMess.jsp,输入查询文本并选择查询条件,点击提交按钮执行查询:


2 查询记录(DW自动生成代码)

本例使用Dreamweaver的数据库面板自动生成代码来实现图书查询功能。

首先创建图书查询页面findBook.jsp,在页面中添加与上例相同的查询表单,提交查询内容参数findContent和查询字段参数condition。

接下来创建数据库连接:在数据库面板中点击“+”按钮,选择“自定义JDBC连接”;在“自定义JDBC连接”对话框中设置连接信息,连接名称为connBook,驱动程序为com.hxtt.sql.access.AccessDriver,URL为jdbc:access:/d:/Book.mdb,点击“测试”按钮测试连接,点击“确定”按钮完成连接的创建。

接下来是绑定记录集:切换到“绑定”面板,点击“+”按钮,选择“记录集(查询)”;在“记录集”对话框中设置记录集信息:名称为rsBook,连接为connBook,表格为bookForm,先设置筛选为bookName包含URL/表单变量findContent。点击“测试”按钮测试,点击“确定”按钮完成记录集的创建。


注意:在记录集对话框中只能设置筛选书名字段的内容,而不能根据用户提交的参数改变要筛选的字段。想实现更复杂的查询记录集,还需要对自动生成的代码进行一些修改。

在页顶添加以下代码段,获取用户提交的查询条件参数condition,默认值设为书名字段bookName:

<%
request.setCharacterEncoding("utf-8");
String condition = "bookName";
if (request.getParameter("condition") != null) {
    condition = request.getParameter("condition");
}
%> 

然后在代码中找到rsBook记录集对应的查询语句,即下面这一行:

PreparedStatement StatementrsBook = ConnrsBook.prepareStatement("SELECT * FROM bookForm WHERE bookName LIKE ?");

修改查询语句将固定的书名字段改为变量:

PreparedStatement StatementrsBook = ConnrsBook.prepareStatement("SELECT * FROM bookForm WHERE " + condition + " LIKE ?");

接下来是添加显示记录集第一条记录的各个字段的动态文本,在页面中添加一个2行7列的表格,先输入表头文本,然后将绑定面板中rsBook记录集的各个拖到表格第2行的各个单元格即可:

然后还要通过循环显示记录集的所有记录:先在页面中选定动态文本所在的行,切换到“服务器行为”面板,点击“+”按钮,选择“重复区域”,在重复区域对话框中选择显示rsBook记录集的所有记录即可。


注意如果查询所得的rsBook记录集中没有任何记录,运行显示记录的服务器行为就会导致错误,因此还需要选中整个表格并添加一个有条件显示区域的服务器行为,如果记录集不为空则显示区域:

可以看到DW能够自动生成各种通用功能的代码,为Web应用程序的开发提供极大的便利,但要满足更特殊的需求、实现更灵活的功能,阅读和修改代码仍然是开发者必须掌握的能力。

评论:

发表评论:
该文章禁用评论功能。