使用JDBC完成動態驗證、採用MVC完成數據查詢


目標:
l         掌握JDBC鏈接數據庫的基本過程;
l         掌握使用JDBC進行數據查詢。
主要內容:
l         在上一次的實例基礎上,通過連接數據庫完成用戶登錄功能,介紹JDBC的基本用法;
l         通過顯示所有用戶信息進一步介紹JDBC的用法和查詢結果的處理。
1、 JDBC概念
Java Database Connectivity的縮寫,用於連接Java應用程序與各種關係數據庫的標準接口。對於編程人員來說,連接任何數據庫都是相同的。
2、 要使用JDBC開發應用需要哪些準備工作?
安裝數據庫,包括數據庫表的創建;
根據數據庫的類型,得到數據庫的JDBC驅動程序,不同的數據庫管理系統需要不同的JDBC驅動程序,並且不同版本的數據庫管理系統需要的驅動程序有可能不同的;這裏使用Oracle數據庫,驅動程序需要放在WEB-INF/lib下面。
數據庫的相關信息:數據庫的IP地址,服務的端口號,數據庫的名字,連接數據庫的用戶名和密碼。
3、 舉例:使用數據庫對用戶登錄信息進行驗證。
需要修改User.java中驗證用戶信息的方法。
1)在類的前面增加了一個import語句:
import java.sql.*;
2)增加的後的check方法如下:
   public boolean check()
   {
/*
      if(username==null || userpass==null)
         return false;
      if(username.equals("zhangsan") && userpass.equals("lisi"))
      {
         return true;
      }else{
         return false;
      }
 
*/
 
      Connection con = null;
      Statement stmt = null;
      ResultSet rs = null;
      boolean b = true;
      try{
         // 指出連接數據庫所需要的驅動程序
         Class.forName("oracle.jdbc.driver.OracleDriver");
 
        // 建立與數據庫之間的連接
// myserver修改爲數據庫服務器IP,mydb爲數據庫名
        con = DriverManager.getConnection("jdbc:oracle:thin:@myserver:1521:mydb","scott","tiger");
 
        // 編寫查詢數據庫信息的SQL語句
        String sql="select * from usertable where username='"+username+"' and userpass='"+userpass+"'";
 
        System.err.println(sql);
 
        // 創建語句對象,用於執行SQL語句
        stmt = con.createStatement();
 
        // 執行SQL語句得到結果集
        rs = stmt.executeQuery(sql);     
 
        // 判斷rs中是否有數據
        if(rs.next())
          b = true;
        else
          b = false;
      }catch(Exception e){
          System.out.println(e.getMessage());
      }
      finally{
        // 關閉相關對象
        if(rs!=null) try{ rs.close(); }catch(Exception ee){}
        if(stmt!=null) try{ stmt.close(); }catch(Exception ee){}
        if(con!=null) try{ con.close(); }catch(Exception ee){}
      }
      return b;
   }
4、 運行測試
可以使用數據庫中的用戶名和口令進行登錄。
5、 向頁面傳遞查詢結果
很多時候,客戶端需要從服務器端得到數據並顯示,因爲數據的查詢是由JavaBean完成的,對JavaBean的調用是通過Servlet完成的,Servlet中可以得到查詢的結果,但是顯示信息是由JSP頁面完成的,如何把Servlet中查詢的信息傳遞給JSP頁面呢?
前面介紹過可以通過request、session和application傳遞信息,因爲可以讓Servlet和JSP處於相同的請求,所以3個對象都可以使用。但是因爲session和application的保存時間比較長,容易造成服務器資源的浪費,所以通常採用request存儲。
下面通過查詢並顯示所有信息的功能來介紹具體用法。需要完成的工作如下:
l         在User.java中添加查詢所有用戶信息的方法;
l         編寫查詢所有用戶信息的控制器;
l         編寫顯示信息的JSP頁面。
6、 在User.java中添加方法
查詢所有用戶信息的方法如下:
   public ArrayList getAllUser()
   {
      Connection con = null;
      Statement stmt = null;
      ResultSet rs = null;
      ArrayList users = new ArrayList();
 
      try{
         // 指出連接數據庫所需要的驅動程序
         Class.forName("oracle.jdbc.driver.OracleDriver");
 
        // 建立與數據庫之間的連接
        con = DriverManager.getConnection("jdbc:oracle:thin:@myserver:1521:mydb","scott","tiger");
 
        // 編寫查詢數據庫信息的SQL語句
        String sql="select * from usertable";
 
        // 創建語句對象,用於執行SQL語句
        stmt = con.createStatement();
 
        // 執行SQL語句得到結果集
        rs = stmt.executeQuery(sql);     
 
        // 遍歷結果集
        while(rs.next())
        {
           String username = rs.getString(1);
           String userpass = rs.getString(2);
           // java.util.Date birthday = rs.getDate(3);
           // int age = rs.getInt(4);
           User user = new User();
           user.setUsername(username);
           user.setUserpass(userpass);
           users.add(user);
        }
      }catch(Exception e){
          System.out.println(e.getMessage());
      }
      finally{
        // 關閉相關對象
        if(rs!=null) try{ rs.close(); }catch(Exception ee){}
        if(stmt!=null) try{ stmt.close(); }catch(Exception ee){}
        if(con!=null) try{ con.close(); }catch(Exception ee){}
      }     
      return users;
   }
需要在類的前面引入java.util包,代碼如下:
import java.util.*;
7、 編寫控制器
代碼如下:
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javabean.*;
import java.util.*;
 
public class GetAllUser extends HttpServlet
{
   public void doGet(HttpServletRequest request,HttpServletResponse response)
     throws IOException,ServletException
   {
      // 第一步:獲取用戶的輸入信息,這裏不需要
 
      // 第二步:調用JavaBean
      User user = new User();
      ArrayList users=null;
      users = user.getAllUser();
     
      // 第三步:傳值
      request.setAttribute("users",users);
 
      // 第四步:選擇一個界面對用戶進行響應
      String forward="userlist.jsp";
 
      RequestDispatcher rd = request.getRequestDispatcher(forward);
      rd.forward(request,response);
 
   }
   public void doPost(HttpServletRequest request,HttpServletResponse response)
     throws IOException,ServletException
   {
      doGet(request,response);
   }
}
這裏假設使用userlist.jsp對用戶進行響應。
8、 配置控制器
在Web.xml中添加如下代碼:
   <servlet>
      <servlet-name>getAllUser</servlet-name>
      <servlet-class>servlet.GetAllUser</servlet-class>
   </servlet>
   <servlet-mapping>
      <servlet-name>getAllUser</servlet-name>
      <url-pattern>/getAllUser</url-pattern>
   </servlet-mapping>
9、 編寫userlist.jsp響應
<%@ page contentType="text/html;charset=gb2312"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 
<c:forEach var="user" items="${users}">
   用戶名:${user.username} 口令:${user.userpass} <br>
</c:forEach>
這裏的c:forEach標籤用於循環處理,items指出循環遍歷的集合,var聲明循環變量,表示集合中的一個元素。循環體中通過表達式語言顯示用戶信息。
10、              運行測試
http://127.0.0.1:8080/ch7/getAllUser
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章