數據源與JNDI資源實現JSP數據庫鏈接池實例

名詞解釋:JNDI的全稱是java命名與目錄接口(Java Naming and Directory Interface),是一個應用程序設計的API,爲開發人員提供了查找和訪問各類命名和目錄服務的通用、統一的接口。咱們能夠把JNDI簡單地理解爲是一種將對象和名字綁定的技術,即指定一個資源名稱,將該名稱與某一資源或服務相關聯,當須要訪問其餘組件和資源時,就須要使用JNDI服務進行定位,應用程序能夠經過名字獲取對應的對象或服務。html

1.context.xml文件設置java

  數據源:Tomcat根目錄\conf\context.xml文件(沒有直接建立也能夠)或者在JSP項目WebRoot目錄下的META-INF目錄中建立一個context.xml文件,添加Context節點,以下:web

1 <Context>
2     <Resource name="jdbc/test" auth="Application" type="javax.sql.DataSource"
3         maxActive="100" maxIdle="30" maxWait="10000" username="sa" password="1234"
4         driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://192.168.2.254:1433;DatabaseName=test" />
5 </Context>

name:指定Resource的JNDI名字。sql

auth:能夠寫成Container和Application。Container表示由容器建立Resource,Application表示由Web應用建立和管理Resource。數據庫

type:指定Resource所屬的Java類名。app

maxActive:指定數據庫鏈接池中處於活動狀態的數據庫鏈接的最大數目。ide

maxIdle:指定數據庫鏈接池中處於空閒狀態的數據庫鏈接的最大數目,取值爲0表示不受限制。sqlserver

maxWait:指定數據庫鏈接池中數據庫鏈接處於空閒狀態的最長時間(以毫秒爲單位),超出這時間將會拋出異常。url

username:指定鏈接數據庫的用戶名。spa

password:指定鏈接數據庫的口令。

driverClassName:指定鏈接數據庫的JDBC驅動程序。

url:指定鏈接數據庫的URL。

2.web.xml文件的配置

  在Web應用程序的WEB-INF/web.xml文件中的<web-app>節點下添加<resource-ref>元素,內容以下:

1 <web-app>
2     ...
3     <resource-ref>
4         <description>news DataSource</description>
5         <res-ref-name>jdbc/test</res-ref-name>
6         <res-type>javax.sql.DataSource</res-type>
7         <res-auth>Container</res-auth>
8     </resource-ref>
9 </web-app>

description:對所引用資源的說明。

res-ref-name:指定所引用資源的JNDI名字,與<Resource>元素中的name屬性對應。

res-type:指定所引用資源的類名字,與<Resource>元素中的type屬性對應。

res-auth:指定管理所引用資源的Manager,與<Resource>元素中的auth屬性對應。

3.在Web應用中添加數據庫鏈接jar文件。

4.編寫使用數據源和JNDI資源,建立採用數據庫鏈接池Connection對象的SqlHelper.java文件(在helper包中建立的),代碼以下:

  1 package helper;
  2 import java.lang.reflect.*;
  3 import java.sql.*;
  4 import java.util.*;
  5 
  6 import javax.naming.Context;
  7 import javax.naming.InitialContext;
  8 import javax.naming.NamingException;
  9 import javax.sql.DataSource;
 10 
 11 public class SqlHelper {
 12     
 13     private static Connection getConnection() throws ClassNotFoundException,
 14             SQLException {
 15         Connection conn = null;
 16         try {
 17             Context ctx = new InitialContext();
 18             // 獲取與邏輯名相關聯的數據源對象
 19             DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/test");
 20             conn = ds.getConnection();
 21         } catch (NamingException e) {
 22             // TODO Auto-generated catch block
 23             e.printStackTrace();
 24         } catch (SQLException e) {
 25             // TODO Auto-generated catch block
 26             e.printStackTrace();
 27         }
 28         return conn;
 29     }
 30 
 31     public static int executeNonQuery(String cmdText)
 32             throws ClassNotFoundException, SQLException {
 33         int result = -1;
 34         Connection con = null;
 35         PreparedStatement ps = null;
 36         try {
 37             con = getConnection();
 38             ps = con.prepareStatement(cmdText);
 39             result = ps.executeUpdate();
 40         }catch (Exception e) {
 41             System.out.println(e);
 42         } finally {
 43             close(con, ps, null);
 44         }
 45         return result;
 46     }
 47 
 48     public static int executeScalar(String cmdText) throws SQLException,
 49             ClassNotFoundException {
 50         int result = -1;
 51         Connection con = null;
 52         PreparedStatement ps = null;
 53         ResultSet rs = null;
 54         try {
 55             con = getConnection();
 56             ps = con.prepareStatement(cmdText);
 57             rs = ps.executeQuery();
 58             if (rs.next()) {
 59                 result = rs.getInt(1);
 60             }
 61         }catch (Exception e) {
 62             System.out.println(e);
 63         } finally {
 64             close(con, ps, rs);
 65         }
 66         return result;
 67     }
 68 
 69     public static <T> List<T> executeList(Class<T> cls, String cmdText)
 70             throws ClassNotFoundException, SQLException,
 71             InstantiationException, IllegalAccessException {
 72         List<T> list = new ArrayList<T>();
 73         Connection con = null;
 74         PreparedStatement ps = null;
 75         ResultSet rs = null;
 76         try {
 77             con = getConnection();
 78             ps = con.prepareStatement(cmdText);
 79             rs = ps.executeQuery();
 80             while (rs.next()) {
 81                 T obj = executeResultSet(cls, rs);
 82                 list.add(obj);
 83             }
 84         } catch (Exception e) {
 85             System.out.println(e);
 86         }finally {
 87             close(con, ps, rs);
 88         }
 89         return list;
 90     }
 91 
 92     public static <T> T executeEntity(Class<T> cls, String cmdText)
 93             throws SQLException, ClassNotFoundException,
 94             InstantiationException, IllegalAccessException {
 95         T obj = null;
 96         Connection con = null;
 97         PreparedStatement ps = null;
 98         ResultSet rs = null;
 99         try {
100             con = getConnection();
101             ps = con.prepareStatement(cmdText);
102             rs = ps.executeQuery();
103             while (rs.next()) {
104                 obj = executeResultSet(cls, rs);
105                 break;
106             }
107         } catch (Exception e) {
108             System.out.println(e);
109         }finally {
110             close(con, ps, rs);
111         }
112         return obj;
113     }
114 
115     private static <T> T executeResultSet(Class<T> cls, ResultSet rs)
116             throws InstantiationException, IllegalAccessException, SQLException {
117         T obj = cls.newInstance();
118         ResultSetMetaData rsm = rs.getMetaData();
119         int columnCount = rsm.getColumnCount();
120 //        Field[] fields = cls.getFields();
121         Field[] fields = cls.getDeclaredFields();
122         for (int i = 0; i < fields.length; i++) {
123             Field field = fields[i];
124             String fieldName = field.getName();
125             for (int j = 1; j <= columnCount; j++) {
126                 String columnName = rsm.getColumnName(j);
127                 if (fieldName.equalsIgnoreCase(columnName)) {
128                     Object value = rs.getObject(j);
129                     field.setAccessible(true);
130                     field.set(obj, value);
131                     break;
132                 }
133             }
134         }
135         return obj;
136     }
137 
138     private static void close(Connection con, PreparedStatement ps, ResultSet rs)
139             throws SQLException {
140         if (rs != null) {
141             rs.close();
142             rs = null;
143         }
144         if (ps != null ) {
145             ps.close();
146             ps = null;
147         }
148         if (con != null) {
149             con.close();
150             con = null;
151         }
152     }
153 }
View Code

5.搭建entity,dal,bll包。(三層是從net開發轉過來的,也能夠使用do包,dao包)。

6.JSP頁面使用代碼以下:

 1 <%@ page language="java" import="java.util.*,bll.*,entity.*" pageEncoding="UTF-8"%>
 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 3 <html>
 4 <head>
 5 <title>採用數據源和JNDI資源方式,建立並使用數據庫鏈接池對象訪問數據庫實例。</title>
 6 </head>
 7 <body>
 8 <div>
 9 <h1>採用數據源和JNDI資源方式,建立並使用數據庫鏈接池對象訪問數據庫實例。</h1>
10     <%
11         List<Student> list = StudentBLL.Select();
12         for (Student student : list) {
13             out.println(String.format(
14                     "<ol><li>StudentId:%d</li><li>StudentName:%s</li><li>Phone:%s</li><li>Email:%s</li><li>Address:%s</li></ol>",
15                     student.getStudentId(), student.getStudentName(),
16                     student.getPhone(), student.getEmail(),
17                     student.getAddress()));
18         }
19     %>
20 </div>
21 </body>
22 </html>
View Code

7.若是Context文件中auth屬性設置爲:Container,須要將數據庫鏈接的jar文件複製到Tomcat的lib目錄下。若是auth屬性設置爲:Application,則不須要複製到Tomcat的lib目錄下。

8.部署運行界面大功告成。

相關文章
相關標籤/搜索