欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
struts原理與實(shí)踐(3)
Struts原理與實(shí)踐(3)- -
一、JDBC的工作原理
Struts在本質(zhì)上是java程序,要在Struts應用程序中訪(fǎng)問(wèn)數據庫,首先,必須搞清楚Java Database Connectivity API(JDBC)的工作原理。正如其名字揭示的,JDBC庫提供了一個(gè)底層API,用來(lái)支持獨立于任何特定SQL實(shí)現的基本SQL功能。提供數據庫訪(fǎng)問(wèn)的基本功能。它是將各種數據庫訪(fǎng)問(wèn)的公共概念抽取出來(lái)組成的類(lèi)和接口。JDBC API包括兩個(gè)包:java.sql(稱(chēng)之為JDBC內核API)和javax.sql(稱(chēng)之為JDBC標準擴展)。它們合在一起,包含了用Java開(kāi)發(fā)數據庫應用程序所需的類(lèi)。這些類(lèi)或接口主要有:
Java.sql.DriverManager
Java.sql.Driver
Java.sql.Connection
Java.sql.Statement
Java.sql.PreparedStatement
Java.sql.ResultSet等
這使得從Java程序發(fā)送SQL語(yǔ)句到數據庫變得比較容易,并且適合所有SQL方言。也就是說(shuō)為一種數據庫如Oracle寫(xiě)好了java應用程序后,沒(méi)有必要再為MS SQL Server再重新寫(xiě)一遍。而是可以針對各種數據庫系統都使用同一個(gè)java應用程序。這樣表述大家可能有些難以接受,我們這里可以打一個(gè)比方:聯(lián)合國開(kāi)會(huì )時(shí),聯(lián)合國的成員國的與會(huì )者(相當我們這里的具體的數據庫管理系統)往往都有自己的語(yǔ)言(方言)。大會(huì )發(fā)言人(相當于我們這里的java應用程序)不可能用各種語(yǔ)言來(lái)發(fā)言。你只需要使用一種語(yǔ)言(相當于我們這里的JDBC)來(lái)發(fā)言就行了。那么怎么保證各成員國的與會(huì )者都聽(tīng)懂發(fā)言呢,這就要依靠同聲翻譯(相當于我們這里的JDBC驅動(dòng)程序)。實(shí)際上是驅動(dòng)程序將java程序中的SQL語(yǔ)句翻譯成具體的數據庫能執行的語(yǔ)句,再交由相應的數據庫管理系統去執行。因此,使用JDBC API訪(fǎng)問(wèn)數據庫時(shí),我們要針對不同的數據庫采用不同的驅動(dòng)程序,驅動(dòng)程序實(shí)際上是適合特定的數據庫JDBC接口的具體實(shí)現,它們一般具有如下三種功能:
建立一個(gè)與數據源的連接
發(fā)送SQL語(yǔ)句到數據源
取回結果集
那么,JDBC具體是如何工作的呢?
Java.sql.DriverManager裝載驅動(dòng)程序,當Java.sql.DriverManager的getConnection()方法被調用時(shí),DriverManager試圖在已經(jīng)注冊的驅動(dòng)程序中為數據庫(也可以是表格化的數據源)的URL尋找一個(gè)合適的驅動(dòng)程序,并將數據庫的URL傳到驅動(dòng)程序的acceptsURL()方法中,驅動(dòng)程序確認自己有連接到該URL的能力。生成的連接Connection表示與特定的數據庫的會(huì )話(huà)。Statement(包括PreparedStatement和CallableStatement)對象作為在給定Connection上執行SQL語(yǔ)句的容器。執行完語(yǔ)句后生成ResultSet結果集對象,通過(guò)結果集的一系列g(shù)etter就可以訪(fǎng)問(wèn)表中各列的數據。
這里,是講的JDBC的基本工作過(guò)程,實(shí)際應用中,往往會(huì )使用JDBC擴展對象如DataSource等,限于篇幅,就不在此詳細討論了。
二、訪(fǎng)問(wèn)數據庫所要做的基本配置
我們以訪(fǎng)問(wèn)MS SQL Server2000數據庫為例,介紹其基本的配置情況。首先,要到微軟網(wǎng)站去下載JDBC的驅動(dòng)程序,運行setup.exe將得到的三個(gè)文件:msbase.jar、mssqlserver.jar及msutil.jar放在 /webapps/mystruts/WEB-INF/lib目錄下。
在struts-config.xml文件中配置數據源
這里,有一點(diǎn)要引起大家的注意的,就是,struts-config.xml中配置的各個(gè)項目是有一定的順序要求的,幾個(gè)主要項目的順序大致是這樣的:
data-sourcesform-beansaction-mappingsmessage-resourcesplug-in
在配置時(shí)要遵守上述順序
<data-sources> <data-source key="A" type="org.apache.commons.dbcp.BasicDataSource"> <set-property property="driverClassName" value="com.microsoft.jdbc.sqlserver.SQLServerDriver" /> <set-property property="url" value="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=mystruts;SelectMethod=cursor" /> <set-property property="username" value="sa" /> <set-property property="password" value="yourpwd" /> <set-property property="maxActive" value="10" /> <set-property property="maxWait" value="5000" /> <set-property property="defaultAutoCommit" value="false" /> <set-property property="defaultReadOnly" value="false" /> </data-source> </data-sources>
我們來(lái)對這段配置代碼做一個(gè)簡(jiǎn)單的說(shuō)明:
這句中,如果您的struts應用程序中只配置一個(gè)數據源則key="A"可以不要,而配置多個(gè)數據源時(shí)就要用這個(gè)鍵值區別,也就是說(shuō),可以為一個(gè)應用程序配置多個(gè)數據源讓它訪(fǎng)問(wèn)多個(gè)數據庫。
<set-property property="url" value="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=mystruts; SelectMethod=cursor" />
這句中的sqlserver://127.0.0.1:1433;DatabaseName=mystruts;的數據庫服務(wù)器名(本例是用代表本機的ip地址)和數據庫名稱(chēng)要與您的具體情況相同。同時(shí),還要注意訪(fǎng)問(wèn)數據庫的用戶(hù)名和口令也要合乎您的實(shí)際情況。
表示最大的活動(dòng)連接數,這也說(shuō)明這些連接是池化(pooling)的。
表示對數據庫的增、刪、改操作必須顯式地提交。即必須使用connect.commit();這樣的命令才能真正讓數據庫表中的記錄作相應的改變。設置成這樣方便用戶(hù)組織自己的數據庫事務(wù)。
三、現在我們就來(lái)擴展前面我們講的那個(gè)登錄的例子,讓它訪(fǎng)問(wèn)存儲在數據庫表中的用戶(hù)名和口令信息,同時(shí)也讓它給出的出錯信息更明確一些。
為此,我們先要做一些準備工作,如果您還沒(méi)有安裝MS SQL Server2000請先安裝,并下載最新的補丁包。再建一個(gè)名為mystruts的數據庫,并在該數據庫中建一個(gè)名為userInfo的表,該表有兩個(gè)字段既:username和password,它們的字段類(lèi)型都為varchar(10),其中username為主鍵。在該表中輸入一條記錄,username和password的字段值分別為lhb和awave。到此準備工作就基本做好了。
為了訪(fǎng)問(wèn)數據庫,首先,要修改Action類(lèi),修改后的代碼清單如下:
package action;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;import org.apache.struts.action.ActionError;import org.apache.struts.action.ActionErrors;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.action.ActionServlet;import bussness.UserInfoBo;import entity.UserInfoForm;import javax.sql.DataSource;import java.sql.Connection;import java.sql.SQLException;public final class LogonAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { UserInfoForm userInfoForm = (UserInfoForm) form; //從web層獲得用戶(hù)名和口令 String username = userInfoForm.getUsername().trim(); String password = userInfoForm.getPassword().trim(); //聲明錯誤集對象 ActionErrors errors = new ActionErrors(); //聲明數據源和連接對象 DataSource dataSource; Connection cnn=null; //校驗輸入 if(username.equals("")){ ActionError error=new ActionError("error.missing.username"); errors.add(ActionErrors.GLOBAL_ERROR,error); } if(password.equals("")){ ActionError error=new ActionError("error.missing.password"); errors.add(ActionErrors.GLOBAL_ERROR,error); } //調用業(yè)務(wù)邏輯 if(errors.size()==0){ String validated = ""; try{ //取得數據庫連接 dataSource = getDataSource(request,"A"); cnn = dataSource.getConnection(); UserInfoBo userInfoBo=new UserInfoBo(cnn); validated =userInfoBo.validatePwd(username,password); if(validated.equals("match")){ //一切正常就保存用戶(hù)信息并轉向成功的頁(yè)面 HttpSession session = request.getSession(); session.setAttribute("userInfoForm", form); return mapping.findForward("success"); } } catch(Throwable e){ //處理可能出現的錯誤 e.printStackTrace(); ActionError error=new ActionError(e.getMessage()); errors.add(ActionErrors.GLOBAL_ERROR,error); } } //如出錯就轉向輸入頁(yè)面,并顯示相應的錯誤信息 saveErrors(request, errors); return new ActionForward(mapping.getInput()); }}
注意:dataSource = getDataSource(request,"A");這句中,如果配置中只有一個(gè)數據源,且沒(méi)有key="A",則這句應寫(xiě)為dataSource = getDataSource(request);
從清單上可以看出,主要就是增加了訪(fǎng)問(wèn)數據庫的代碼。同時(shí),我們的業(yè)務(wù)對象的形式也發(fā)生了一個(gè)變化,原來(lái)沒(méi)有參數,現在有一個(gè)代表數據庫連接的參數cnn,因此我們也要對業(yè)務(wù)對象進(jìn)行適當地修改。
更改后的業(yè)務(wù)對象代碼清單如下:
package bussness;import entity.UserInfoForm;import java.sql.Connection;import java.sql.SQLException;import java.lang.Exception;import db.UserInfoDao;public class UserInfoBo { private Connection cnn=null; public UserInfoBo(Connection cnn){ this.cnn=cnn; } public String validatePwd(String username,String password){ String validateResult=""; try{ UserInfoDao userInfoDao = new UserInfoDao(cnn); validateResult=userInfoDao.validatePwd(username,password); if(validateResult.equals("error.logon.invalid")){ //如果用戶(hù)名與口令不匹配則報此錯 throw new RuntimeException("error.logon.invalid"); } else if(validateResult.equals("error.removed.user")){ //如果找不到用戶(hù)則報此錯,這樣用戶(hù)看到的出錯信息會(huì )更詳細 throw new RuntimeException("error.removed.user"); } } catch(Exception e){ throw new RuntimeException(e.getMessage()); } finally{ try{ if(cnn!=null){ cnn.close(); } } catch(SQLException sqle){ sqle.printStackTrace(); throw new RuntimeException("error.unexpected"); } } return validateResult; }}
這個(gè)業(yè)務(wù)對象的代碼還是比較簡(jiǎn)單的,重點(diǎn)要講的就是它在validatePwd方法中調用了一個(gè)名叫UserInfoDao的對象,它就是真正進(jìn)行數據庫操作的數據訪(fǎng)問(wèn)對象。其代碼清單如下:
package db;import entity.UserInfoForm;import java.sql.*;public class UserInfoDao { private Connection con; public UserInfoDao(Connection con) { this.con=con; } public String validatePwd(String username,String password){ PreparedStatement ps=null; ResultSet rs=null; String validated="error.logon.invalid"; UserInfoForm userInfoForm=null; String sql="select * from userInfo where username=?"; try{ if(con.isClosed()){ throw new IllegalStateException("error.unexpected"); } ps=con.prepareStatement(sql); ps.setString(1,username); rs=ps.executeQuery(); if(rs.next()){ if(!rs.getString("password").trim().equals(password)){ return validated;//口令不正確返回口令不匹配信息 } else{ validated = "match";//口令正確返回口令匹配信息 return validated; } }else{ validated="error.removed.user";//沒(méi)有找到該用戶(hù) return validated; } }catch(SQLException e){ e.printStackTrace(); throw new RuntimeException("error.unexpected"); }finally{ try{ if(ps!=null) ps.close(); if(rs!=null) rs.close(); }catch(SQLException e){ e.printStackTrace(); throw new RuntimeException("error.unexpected"); } } }}
下面,簡(jiǎn)單地分析一下數據訪(fǎng)問(wèn)對象的工作過(guò)程:
要訪(fǎng)問(wèn)數據庫,一般要經(jīng)歷的如下幾個(gè)步驟:
獲得到數據庫的連接
創(chuàng )建SQL語(yǔ)句
執行SQL語(yǔ)句
管理結果集
其中,得到數據庫的連接本例中是在A(yíng)ction類(lèi)中完成的,代碼如下:
dataSource = getDataSource(request,"A");
cnn = dataSource.getConnection();
Action在調用業(yè)務(wù)對象時(shí)將連接作為一個(gè)參數傳給業(yè)務(wù)對象,再由業(yè)務(wù)對象傳給數據庫訪(fǎng)問(wèn)對象。
要說(shuō)明一點(diǎn)的是,要將struts-legacy.jar文件放在 /webapps/mystruts/WEB-INF/lib目錄下。
我們要在 /webapps/mystruts/WEB-INF/classes目錄下再建一個(gè)名叫db的子目錄,將數據訪(fǎng)問(wèn)類(lèi)以UserInfoDao.java文件名保存在該子目錄中。按照上篇文章介紹的方法,編譯各個(gè)包中的.java文件。就可以啟動(dòng)Tomcat重新運行您的程序了。
細心一點(diǎn)的讀者可能都注意到了,到目前為止,我們程序中的各種消息都不是用中文表示的,在下一篇文章中,我們將討論Struts的國際化編程即所謂的i18n編程,對我們在編程中經(jīng)常遇到的亂碼問(wèn)題也一同作些分析。
參考文獻:
《JSP Web 編程指南》---電子工業(yè)出版社 Jayson Falkner等著(zhù) 司光亞 牛紅等譯
《Java數據庫編程寶典》John O‘Donahue等著(zhù) 甑廣啟 于耀等譯
《Struts in Action》Ted Husted Cedric Dumoulin George Franciscus David Winterfeldt著(zhù)
《Programming Jakarta Struts》Chuck Cavaness著(zhù)
《Mastering Jakarta Struts》James Goodwill著(zhù)
《Struts Kick Start》James Turner Kevin Bedell著(zhù)
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JDNI連接數據庫方法
Struts數據源配置過(guò)程
四種連接數據庫的方法(DriverManager、DataSource子類(lèi)、DBCP、c3...
JNDI
JDBC數據源方式連接Oracle,沒(méi)有使用連接池?。?!詳見(jiàn)數據庫連接
用Structs驗證登錄
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久