名詞解釋: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 }
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>
7.若是Context文件中auth屬性設置爲:Container,須要將數據庫鏈接的jar文件複製到Tomcat的lib目錄下。若是auth屬性設置爲:Application,則不須要複製到Tomcat的lib目錄下。
8.部署運行界面大功告成。