版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
Andriod實用教程(第2版)第7章
Android數(shù)據(jù)庫和網(wǎng)絡(luò)編程7.1
數(shù)據(jù)庫準(zhǔn)備數(shù)據(jù)庫準(zhǔn)備1.?dāng)?shù)據(jù)庫環(huán)境本章所有的實例程序一共使用到3個數(shù)據(jù)庫:MySQL、SQL
Server和Oracle,筆者將它們分別安裝在3臺不同的筆記本電腦上,每臺電腦的主機名、IP、操作系統(tǒng)及所安裝數(shù)據(jù)庫的版本見下表7.1。主機名IP操作系統(tǒng)數(shù)據(jù)庫SMYSQL51Windows
Server
2012
R2標(biāo)準(zhǔn)版64位MySQL
8.0LAPTOP-8SJBOG5R83Windows
10SQL
Server
2019SMONGO52Windows
Server
2012
R2標(biāo)準(zhǔn)版64位Oracle
11g數(shù)據(jù)庫準(zhǔn)備2.Navicat
Premium工具為管理數(shù)據(jù)庫方便,我們使用當(dāng)前最為流行的Navicat
Premium統(tǒng)一管理和操作以上3個數(shù)據(jù)庫。NavicatPremium是Navicat的衍生版本,提供了對數(shù)據(jù)庫領(lǐng)域最廣泛的DBMS兼容性支持,用它幾乎能夠操作所有類型的DBMS產(chǎn)品。Navicat
Premium當(dāng)前的最新版本是12.1,可從官網(wǎng)https:///do
wnload/navicat-premium免費下載獲得,筆者使用的是Windows版(64位),下載得到的安裝文件名為navicat121_premium_cs_x64.exe,雙擊啟動安裝向?qū)?,按照向?qū)У闹敢掳惭b,每一步都取默認(rèn),安裝過程從略。數(shù)據(jù)庫準(zhǔn)備啟動Navicat
Premium,點擊主界面左上角工具欄的“連接”按鈕,出現(xiàn)下拉菜單可選擇創(chuàng)建到不同數(shù)據(jù)庫的連接,如圖7.1所示。數(shù)據(jù)庫準(zhǔn)備3.創(chuàng)建數(shù)據(jù)庫及連接為接下來開發(fā)實例做準(zhǔn)備,我們在3臺計算機的MySQL、SQL
Server、Oracle數(shù)據(jù)庫中分別創(chuàng)建名為
emarket(電子商城)的數(shù)據(jù)庫,其中創(chuàng)建一個commodity(商品)表,各數(shù)據(jù)庫中的表結(jié)構(gòu)如圖7.2所示(其中Oracle由于默認(rèn)只支持大寫,故數(shù)據(jù)庫名和表名也都使用全大寫英文名稱),創(chuàng)建完成后分別往3個數(shù)據(jù)庫的表中錄入3條樣本數(shù)據(jù)。數(shù)據(jù)庫準(zhǔn)備接下來,通過Navicat
Premium分別創(chuàng)建到這3個數(shù)據(jù)庫的連接,連接名分別為:rmysql(MySQL
8.0)、mysqlsrv(SQL
Server
2019)和oracle11g(Oracle
11g),各個連接的具體配置信息見圖7.3,讀者請根據(jù)自己計算機上安裝數(shù)據(jù)庫的實際情況來配置連接。7.2
Android
JDBC編程目錄01
基本原理1.系統(tǒng)結(jié)構(gòu)2.配置支持直連數(shù)據(jù)庫的工程基本原理1.系統(tǒng)結(jié)構(gòu)Android程序直連數(shù)據(jù)庫的系統(tǒng)結(jié)構(gòu)如圖7.4所示,其中畫出了Android
9.0程序連接MySQL、SQL
Server和Oracle
11g的情況以及它們所需.jar包的具體版本信息?;驹?.配置支持直連數(shù)據(jù)庫的工程當(dāng)Android程序要訪問某個DBMS時,必須首先在工程中添加該DBMS支持Android直連的JDBC驅(qū)動。下面我們來創(chuàng)建和配置一個支持直連數(shù)據(jù)庫的工程,步驟如下:創(chuàng)建Android
Studio工程MySqlTest。將預(yù)先準(zhǔn)備好的JDBC驅(qū)動(.jar包)拷貝進工程的app\libs目錄下,刷新。在Android
Studio中選擇主菜單“File”→“Project
Structure...”,彈出“Project
Structure”窗口,如圖7.5所示。左側(cè)欄切換至“Dependencies”頁,中間“Modules”選“app”,此時右邊區(qū)域列出了當(dāng)前工程所依賴的全部Java庫和包及所在目錄。基本原理“”,選擇“Jar
Dependency”,從彈出對話框下拉列表中選擇需要加載的.jar包,(4)點擊左上角如圖7.6所示。(5)最后,不要忘了在AndroidManifest.xml中添加配置:<uses-permission
android:name="android.permission.INTERNET"/>打開Android程序的網(wǎng)絡(luò)連接。目錄02
Android
JDBC直連MySQLAndroid
JDBC直連MySQL【例7.1】用JDBC直連的方式訪問MySQL,讀出其中信息。實現(xiàn)思路:在程序開頭導(dǎo)入JDBC驅(qū)動相關(guān)的類,并在主程序MainActivity類中聲明數(shù)據(jù)庫連接對象、SQL語句對象和查詢結(jié)果集對象。自定義一個connToDb()方法專門連接和訪問數(shù)據(jù)庫,該方法中開啟一個線程,在這個單獨的線程中執(zhí)行連接數(shù)據(jù)庫和查詢商品信息的一系列操作。查詢的結(jié)果封裝在一個Message對象中,通過句柄Handler發(fā)給主程序,刷新UI界面。設(shè)計Android程序界面,為簡單起見,界面上僅放置一個文本視圖和一個圖像視圖(代碼略),為顯示商品圖片,將要用到的各商品圖片預(yù)先置于工程的drawable目錄下。MainActivity.java代碼。Android
JDBC直連MySQL其中:(a)new
Thread(new
Runnable(){...}).start();:為保證移動用戶的使用體驗,Android規(guī)定:程序中一切耗時的操作都必須放在子線程中去完成,數(shù)據(jù)庫操作屬于耗時操作,故必須放在一個子線程中來執(zhí)行。通過Message由子線程向主線程UI傳遞消息。(b)conn=DriverManager.getConnection("jdbc:mysql://51:3306/emarket","root","ross456");:通過驅(qū)動管理器DriverManager獲取數(shù)據(jù)庫連接對象,其參數(shù)是連接字符串,訪問IP為192.168.0.251機器上emarket數(shù)據(jù)庫,必須提供root用戶名和密碼,且必須只能以IP地址訪問,不能用主機名。(c)rs=stmt.executeQuery("SELECT*FROM
commodity
WHERE商品編號="21101"");:執(zhí)行查詢語句返回結(jié)果集,這里查詢數(shù)據(jù)庫中名為commodity的表中編號為“"21101"”的商品信息,表名不區(qū)分大小寫。(d)Message
msg=Message.obtain();:用Android系統(tǒng)的Message對象來存儲要向主線程傳遞的消息(即從數(shù)據(jù)庫查到的商品名稱、價格、圖片名等信息)。(e)publicvoidhandleMessage(Message
message):句柄的handleMessage()方法與主線程是公用的,故可以在其中直接操作界面上的UI對象,完成對Android程序界面的刷新。Android
JDBC直連MySQL程序運行結(jié)果查詢出MySQL數(shù)據(jù)庫中編號為“21101”的商品記錄,將該商品的信息和圖片在APP界面上顯示出來,結(jié)果如圖7.7所示。Android
JDBC直連MySQL如果要訪問MySQL其他版本或者本地MySQL數(shù)據(jù)庫,也是用同樣的JDBC驅(qū)動,只須對連接字符串稍作修改,筆者先后試驗了遠(yuǎn)程MySQL
5及本地MySQL
8,它們獲取連接的語句分別為:conn
=
DriverManager.getConnection("jdbc:mysql://38:3306/emarket",
"root",
"njnu123456");//MySQL
5(遠(yuǎn)程)
conn=DriverManager.getConnection("jdbc:mysql://83:3306/emarket","root","zhou123456");//MySQL
8(本地)目錄03
Android
JDBC直連SQL
ServerAndroid
JDBC直連SQL
ServerSQL
Server是微軟公司出品的大型數(shù)據(jù)庫產(chǎn)品,但微軟官方并不提供支持Android程序訪問它的驅(qū)動,而且普通Java程序訪問SQLServer的驅(qū)動(如sqljdbc.jar、sqljdbc4.jar和mssql-jdbc-7.2.2.jre11.jar等)均不能用于Android。好在有第三方開源社區(qū)提供的JTDS包可以支持SQL
Server直連,它實質(zhì)上是SQL
Server的JDBC除微軟官方外的另一種實現(xiàn)(加入了Android功能),目前最新版本是1.3.1,下載地址:/projects/jtds/files/jtds/,下載得到文件jtds-1.3.1.jar,用前面講的JDBC驅(qū)動包加載方法將它載入到工程中,然后修改程序,只須改動兩句(驅(qū)動類加載和獲取連接):Class.forName("net.sourceforge.jtds.jdbc.Driver");conn
=
DriverManager.getConnection("jdbc:jtds:sqlserver://83:1433/emarket",
"sa",
"zhou123456");我們使用最新的SQL
Server
2019,運行結(jié)果同前。目錄04
Android
JDBC直連OracleAndroid
JDBC直連OracleOracle的主流版本Oracle11g能夠支持Android程序直連,但只能使用較早版本的驅(qū)動ojdbc6.jar,同樣地,將該驅(qū)動包載入工程中,然后修改程序。由于Oracle默認(rèn)只支持大寫的表名,故還要修改查詢語句(一共要改動3處地方),如下:Class.forName("oracle.jdbc.driver.OracleDriver");
//驅(qū)動類加載conn
=
DriverManager.getConnection("jdbc:oracle:thin:@52:1521:EMARKET",
"SCOTT",
"Mm123456");//這里數(shù)據(jù)庫名EMARKET必須寫在冒號而不是/后面rs=stmt.executeQuery("SELECT
*
FROM
COMMODITY
WHERE商品編號="21101"");//查詢語句運行結(jié)果同前。Android
JDBC直連Oracle最后,我們總結(jié)一下使用Android直連數(shù)據(jù)庫需要注意的幾點,如下:JDBC驅(qū)動MySQL最高只能用mysql-connector-java-5.1.48.jar,雖然MySQL
8最新的驅(qū)動版本為mysql-connector-java-8.0.17.jar,但那只能用作普通Java程序訪問數(shù)據(jù)庫,Android程序并不支持;SQL
Server只能使用第三方庫jtds-1.3.1.jar;Oracle
11g最高只能用ojdbc6.jar。仿真器AVD中的系統(tǒng)鏡像最高只能到Android
9.0。不論遠(yuǎn)程(局域網(wǎng))還是本地計算機,都只能使用IP地址訪問。本地訪問也必須先配置IP,程序連接字符串中要寫出具體的IP,不能用localhost或替代。訪問數(shù)據(jù)庫的代碼只能寫在線程中,Android不支持用戶將耗時操作放在主線程中去做!通常的做法是,使用Handler機制由子線程刷新界面,用Handler的handleMessage()方法可直接操作主線程UI上的控件。mysql-connector-java-5.1.48.jar、JTDS包jtds-1.3.1.jar與ojdbc6.jar可以加載同時存在于同一個工程中,程序代碼在需要時調(diào)用,互不干擾。目錄05
Android
JDBC直連Oracle1.實現(xiàn)思路2.界面設(shè)計3.開發(fā)數(shù)據(jù)模型和適配器4.實現(xiàn)功能以表格形式顯示數(shù)據(jù)庫表數(shù)據(jù)【例7.2】將MySQL中的商品信息通過JDBC讀取后,以表格形式呈現(xiàn)在界面上,并且當(dāng)用戶長按表格中的條目時,顯示對應(yīng)商品的實物圖片,如圖7.8所示。以表格形式顯示數(shù)據(jù)庫表數(shù)據(jù)1.實現(xiàn)思路以列表視圖(ListView)實現(xiàn)顯示商品的表格,整個程序采用MVC框架模式,自定義適配器CommodityAdapter類和模型Commodity類,前端列表項文件itemlayout.xml以View分隔結(jié)合線性布局(LinearLayout)設(shè)計表格樣式。后臺用JDBC連接MySQL讀取數(shù)據(jù),結(jié)合線程和Message-Handler句柄機制刷新界面。所有用到的商品圖片存放在工程res\drawable目錄下,以資源ID引用。通過綁定在列表視圖上的長按事件監(jiān)聽器(OnItemLongClickListener)響應(yīng)用戶的選擇動作,以Dialog彈窗的形式顯示浮動的商品實物圖供用戶預(yù)覽。創(chuàng)建Android
Studio工程MyDbGrid,將MySQL的JDBC驅(qū)動拷貝進工程并添加依賴項,具體操作見7.2.1節(jié)。以表格形式顯示數(shù)據(jù)庫表數(shù)據(jù)2.界面設(shè)計主界面XML文件主界面XML文件main.xml上簡單地放置一個ListView,代碼為:<LinearLayout
xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"
><ListViewandroid:id="@+id/myListView"android:layout_width="match_parent"android:layout_height="wrap_content"
/></LinearLayout>列表項XML文件表格內(nèi)每一行條目項的具體外觀定義在itemlayout.xml中,代碼為。以表格形式顯示數(shù)據(jù)庫表數(shù)據(jù)3.開發(fā)數(shù)據(jù)模型和適配器(1)定義數(shù)據(jù)模型既然采用MVC,就要將商品數(shù)據(jù)封裝在模型中,本例定義模型類Commodity.java的代碼如下:public
class
Commodity
{public
String
cid;public
String
name;public
String
image;public
float
price;//商品編號//商品名稱//商品圖片//價格public
Commodity(String
cid,
String
name,
String
image,
float
price)
{this.cid
=
cid;
=
name;this.image
=
image;this.price
=
price;}}以表格形式顯示數(shù)據(jù)庫表數(shù)據(jù)(2)開發(fā)適配器下面來為ListView視圖開發(fā)適配器,適配器類CommodityAdapter.java,代碼。其中:(a)private
int[]colors={Color.WHITE,Color.rgb(219,238,244)};:這里我們定義一個顏色值的數(shù)組,預(yù)先存放兩種不同顏色,是為了能給表格中條目間隔著切換上色,這樣可使表格的行與行之間界限分明,數(shù)據(jù)顯示效果更加清晰醒目。(b)convertView.setBackgroundColor(colors[position%2]);:每隔條目之間顏色不同,以模2取余間隔引用顏色數(shù)組中的元素進行設(shè)定。(c)public
final
classViewHolder{...}:ViewHolder類對應(yīng)于convertView參數(shù)要設(shè)定的列表項中各控件元素的引用對象,根據(jù)界面上實際需要顯示的內(nèi)容來設(shè)計其中屬性項,本例就只包含商品編號、商品名稱和價格這3項,而未包含商品圖片,但商品圖片信息仍然存儲于模型及其對象列表ArrayList<Commodity>中,需要時隨時可以根據(jù)索引訪問獲取到。以表格形式顯示數(shù)據(jù)庫表數(shù)據(jù)4.實現(xiàn)功能在主程序中使用ListView實現(xiàn)顯示表格的功能,主程序GridActivity.java代碼。其中:(a)private
Context
myContext;
myContext
=
this.getApplicationContext();
CommodityAdapter
adapter
=
new
CommodityAdapter(myContext,R.layout.itemlayout,commodityList,Color.WHITE);:由于本例中創(chuàng)建適配器對象的語句是放在線程句柄的handleMessage()方法中,無法直接引用主程序上下文,故這里要將主程序的上下文聲明為一個全局變量,在初始化onCreate()方法中通過getApplicationContext()獲取后,就可以在程序中的任何地方引用。(b)Dialog
dlg=newDialog(GridActivity.this,R.style.myDialogStyle);:創(chuàng)建對話框彈窗用來顯示商品圖片的預(yù)覽,這里指定對話框樣式為myDialogStyle,這個樣式是我們自定義的,位于工程的values目錄下的styles.xml文件中,如下:<resources>//取消標(biāo)題欄//設(shè)為半透明背景......<!--彈出框樣式定義--><style
name=”myDialogStyle”
parent=”@android:style/Theme.Dialog”><item
name=”android:windowIsFloating”>true</item><item
name=”android:windowIsTranslucent”>true</item><item
name=”android:windowNoTitle”>true</item><item
name=”android:windowBackground”>@android:color/transparent</item><item
name=”android:background”>@android:color/transparent</item><item
name=”android:backgroundDimEnabled”>true</item></style></resources>以表格形式顯示數(shù)據(jù)庫表數(shù)據(jù)(c)dlg.setContentView(R.layout.preview_dialog);:設(shè)置對話框的顯示內(nèi)容視圖,我們設(shè)計的視圖文件preview_dialog.xml位于工程layout目錄下,內(nèi)容為:<?xml
version=”1.0”
encoding=”utf-8”?><LinearLayout
xmlns:android=”/apk/res/android”xmlns:app=”/apk/res-auto”android:orientation=”vertical”
android:layout_width=”match_parent”android:layout_height=”match_parent”><ImageViewandroid:id=”@+id/view_img”android:layout_width=”179dp”android:layout_height=”159dp”
/></LinearLayout>以表格形式顯示數(shù)據(jù)庫表數(shù)據(jù)(d)dlg.setCanceledOnTouchOutside(true);:設(shè)置這個屬性是為了達(dá)到當(dāng)用戶觸擊圖片外部區(qū)域時,對話框自動消失,回到原來的表格顯示主頁。(e)msg.obj+=rs.getString("商品編號")+":"+rs.getString("商品名稱")+":"+rs.getString("商品+":"+rs.getString("價格")+";";:為了便于主程序解析商品信息,我們對從數(shù)據(jù)庫查詢得到的商品信息進行格式化,同一條記錄的字段之間以“:”分隔,而在記錄之間則以“;”隔開,解析時通過字符串split()方法拆分即可。(f)commodityList=cList;:由于本例用了消息句柄機制在線程間異步傳遞數(shù)據(jù)對象,故這里賦值的時候只能先創(chuàng)建一個臨時的ArrayList<Commodity>對象,將Message中解析出的信息存儲其中,然后再賦
值給全局列表對象commodityList,而不能直接對全局的商品數(shù)據(jù)列表對象調(diào)用add()方法進行賦值。7.3
Android
HTTP編程目錄01
基本原理基本原理Android程序通過JDBC直連網(wǎng)絡(luò)數(shù)據(jù)庫的方式雖然簡便,但在實際開發(fā)中并不提倡使用這種方法,基于兩點:不安全。移動端用戶直接操作,數(shù)據(jù)庫連接字符串(含用戶名密碼)就會在網(wǎng)絡(luò)上以明文傳輸,很容易被截獲導(dǎo)致機密信息泄露,且這樣的Android程序也有很大可能被黑客反編譯從中獲取數(shù)據(jù)庫用戶密碼信息。加重數(shù)據(jù)庫系統(tǒng)負(fù)荷。大量用戶并發(fā)直接操作數(shù)據(jù)庫,對DBMS的性能和載荷量是個嚴(yán)峻考驗,弄不好有把數(shù)據(jù)庫搞崩潰的風(fēng)險。實際的互聯(lián)網(wǎng)應(yīng)用系統(tǒng)大多采用如下“移動端—Web服務(wù)器—后臺數(shù)據(jù)庫”的3層架構(gòu)方式,如圖7.9所示,保證安全性的同時又提高系統(tǒng)的性能和可用性?;驹碓谶@種架構(gòu)下,移動端是通過HTTP協(xié)議,由Web服務(wù)器間接操作數(shù)據(jù)庫的。Android為HTTP編程提供了HttpURLConnection類,它的功能非常強大,具有廣泛的通用性,可用它連接Java/JavaEE、.NET、PHP等幾乎所有主流平臺的Web服務(wù)器,如圖7.10所示?;驹肀竟?jié)我們來實現(xiàn)一個最簡單(也是最典型)的以Java
Servlet作為Web服務(wù)程序操作后臺數(shù)據(jù)庫并向移動前端返回信息的系統(tǒng),它一共涉及3臺計算機,分別為:移動端:華碩筆記本(83,Win10)。裝Android
Studio
3.5和Eclipse,開發(fā)程序,運行Android移動端。Web服務(wù)器:聯(lián)想筆記本(38,Win7
64位),其上有Tomcat
9.0和JDK。部署開發(fā)好的Java
Servlet服務(wù)器程序。DB服務(wù)器:ThinkPad筆記本(51,Windows
Server
2012
R2標(biāo)準(zhǔn)版64位),其上有MySQL
8.0數(shù)據(jù)庫。目錄02
環(huán)境安裝1.安裝Eclipse2.安裝Tomcat3.配置Eclipse環(huán)境中的Tomcat環(huán)境安裝1.安裝Eclipse我們使用最新的Eclipse
IDE
2019
09作為開發(fā)Web端Java程序的工具,目前官方只提供Eclipse安裝器的
下載,下載地址:https:///downloads/,獲取文件名為:eclipse-inst-win64.exe。實際安裝時先必須確保計算機處于聯(lián)網(wǎng)狀態(tài),然后啟動eclipse-inst-win64.exe選擇要安裝的Eclipse
IDE類型,我們選擇“Eclipse
IDE
for
Enterprise
Java
Developers”(即Jave
EE版),如圖7.11所示,安裝全過程要始終確保聯(lián)網(wǎng)以實時下載所需的文件。點“INSTALL”開始安裝,如圖7.12所示。環(huán)境安裝安裝過程中會出現(xiàn)幾次對話框讓確認(rèn)許可協(xié)議條款,如圖7.13所示,分別點“Accept”、“Select
All”和“Accept
selected”,一律接受。安裝完成點“LAUNCH”啟動并設(shè)置工作區(qū)。環(huán)境安裝2.安裝Tomcat如果是干凈系統(tǒng),須先安裝JDK(為配合Eclipse調(diào)試程序用,筆者在搭建Android開發(fā)環(huán)境時已經(jīng)裝
好了JDK12)。我們使用最新的Tomcat
9.0作為Web服務(wù)器,下載地址:/download-90.cgi,獲得安裝包:apache-tomcat-9.0.26.exe,雙擊啟動安裝向?qū)?,按照向?qū)У闹敢虏僮?,過程略。筆者使用的JDK12的JRE已經(jīng)集成,安裝后無獨立JRE目錄,故安裝Tomcat時直接選JDK目錄即可,如圖7.15所示。環(huán)境安裝3.配置Eclipse環(huán)境中的Tomcat要將Tomcat與Eclipse
IDE整合起來,才能在開發(fā)調(diào)試程序時使用。下面簡述整合的步驟:在Eclipse中選擇主菜單“Window”→“Preferences”,在出現(xiàn)的“Preferences”對話框中選擇左側(cè)項目樹中的“Server”→“Runtime
Environments”,點“Add”,如圖7.16所示。在接下來的“New
Server
Runtime
Environment”對話框中,服務(wù)器類型列表中選中“ApacheTomcat
v9.0”,勾選“Create
a
new
local
server”,如圖7.17所示,點“Next”。環(huán)境安裝(3)接下來選擇服務(wù)器路徑為我們安裝的Tomcat
9.0所在目錄,Tomcat運行基于JRE為我們計算機上安裝的JDK(這里是“jdk-12.0.2”),如圖7.18所示。目錄03
Web應(yīng)用開發(fā)和部署1.創(chuàng)建動態(tài)Web項目2.編寫Servlet程序3.打包部署Web項目Web應(yīng)用開發(fā)和部署【例7.3】開發(fā)Web服務(wù)端的Java
Servlet程序。1.創(chuàng)建動態(tài)Web項目服務(wù)端的Web程序我們用Java的Servlet實現(xiàn),在剛剛搭建的Eclipse
IDE環(huán)境下開發(fā),選擇主菜單“File”→“New”→“Dynamic
Web
Project”,出現(xiàn)如圖7.19所示對話框,給項目命名為“MyServlet”。在“Web
Module”頁勾選“Generate
web.xml
deployment
descriptor”,點“Finish”,如圖7.20所示。Web應(yīng)用開發(fā)和部署項目創(chuàng)建完成后,在Eclipse開發(fā)環(huán)境左側(cè)的樹狀視圖中,可看到該項目的組成目錄結(jié)構(gòu)。這個運行在Web端的程序負(fù)責(zé)接收Android程序發(fā)來的請求,再根據(jù)Android程序的要求去操作后臺數(shù)據(jù)庫,故離不開JDBC驅(qū)動包,這里仍然使用mysql-connector-java-5.1.48.jar,將它拷貝進項目的lib目錄直接刷新即可,最終形成的項目目錄細(xì)節(jié)如圖7.21所示。Web應(yīng)用開發(fā)和部署2.編寫Servlet程序現(xiàn)在EclipseIDE已能支持在src下直接創(chuàng)建Servlet的源文件模板,自動生成Servlet的代碼框架即可運行,無須再配置web.xml。在項目src下創(chuàng)建包org.easybooks.myservlet,右擊此包,彈出菜單中選擇“New”→“Servlet”,在彈出的向?qū)υ捒蛑休斎隨ervlet類名,于多個頁面上根據(jù)需要配置Servlet的具體屬性(我們都使用默認(rèn)),如圖7.22所示。Web應(yīng)用開發(fā)和部署實現(xiàn)思路:在主Servlet類MainServlet中聲明數(shù)據(jù)庫連接對象、SQL語句對象和結(jié)果集對象。主要功能代碼全部在doGet()方法中,根據(jù)移動端發(fā)來的請求HttpServletRequest的內(nèi)容決定要執(zhí)行的操作。如果請求中包含新價格,則更新寫入數(shù)據(jù)庫;否則讀取并返回原來的商品信息。下面給出本例使用的Servlet源代碼(加黑語句為添加的內(nèi)容)。Web應(yīng)用開發(fā)和部署3.打包部署Web項目(1)項目打包將編寫完成的Servlet程序打包成.war文件。用Eclipse對項目打包的基本操作為:右擊項目MyServlet,選擇“Export”→“WAR
file”,從彈出對話框中選擇打包.war文件存放的路徑,如圖7.23所示,點“Finish”即可。將打包形成的.war文件直接復(fù)制到Web服務(wù)器上Tomcat(注意不是本地Eclipse開發(fā)環(huán)境的Tomcat)的webapps目錄下。Web應(yīng)用開發(fā)和部署(2)升級Web服務(wù)器的Java運行時環(huán)境如果Web服務(wù)器上的JDK版本低于客戶端開發(fā)機器上的JDK版本,需要先升級Java運行時環(huán)境。筆者Web服務(wù)器計算機上原來安裝的是JDK11,而Servlet是基于最新JDK12開發(fā),故要做升級,方法如下:①先卸載重裝高版本的JDK12,然后重設(shè)Tomcat的jvm.dll虛擬機運行時,進入Web服務(wù)器上Tomcat安裝的bin目錄,雙擊Tomcat9w.exe,彈出對話框切換至“Java”選項頁,點擊“Java
Virtual
Machine”右側(cè)“...”按鈕,如圖7.24所示。Web應(yīng)用開發(fā)和部署②然后選中JDK安裝bin\server目錄下的jvm.dll,如圖7.25所示,點“應(yīng)用”后重啟Tomcat即可。Web應(yīng)用開發(fā)和部署(3)測試Web服務(wù)器打包部署完成,啟動Web服務(wù)器上的Tomcat,可先在客戶端用瀏覽器訪問38:8080/MyServlet/MainServlet?id=31101測試看是否成功,如果能正確查詢出特定編號的商品信息,如圖7.26所示,表示W(wǎng)eb服務(wù)器環(huán)境已經(jīng)搭建成功。目錄04
移動端Android程序開發(fā)移動端Android程序開發(fā)【例7.4】在移動端計算機上開發(fā)一個Android程序來訪問Web服務(wù)器。在移動端AndroidStudio中創(chuàng)建名為HttpServletMySqlDemo的工程。在界面上拖曳放置一個文本視圖、一個圖像視圖、一個編輯框和一個按鈕,如圖7.27所示。移動端Android程序開發(fā)實現(xiàn)思路:初始啟動Android程序時通過connToWeb()方法連接到Web服務(wù)器。該方法提交的請求URL只帶一個id(商品編號)參數(shù),指明要顯示的商品。若是用戶輸入了新的價格,點擊“提交”按鈕后,就執(zhí)行onSubmitClick()方法,此方法帶兩個參數(shù),除了表示商品編號的id外,還有一個price就是用戶輸入的新價格。連接通過getInputStream()方法獲取到Web服務(wù)器返回響應(yīng)的輸入流之后,調(diào)用refresh_UI()方法來刷新前端界面,該方法中用到了Android的Message-Handler消息句柄刷新機制,將移動端對獲取到的輸
入流的解析及刷新前端UI的Message-Handler操作全都封裝在其中,避免了代碼冗余。代碼全部位于主程序類MainActivity中,為使讀者清楚程序的結(jié)構(gòu),我們將以上3步在程序代碼中特別標(biāo)示出來。移動端Android程序開發(fā)最后,不要忘記在AndroidMainifest.xml中打開http明文傳輸及互聯(lián)網(wǎng)訪問的權(quán)限://允許http明文傳輸//打開互聯(lián)網(wǎng)訪問權(quán)限<manifest
xmlns:android="/apk/res/android"package="com.easybooks.httpservletmysqldemo"><application...android:supportsRtl="true"android:usesCleartextTraffic="true"android:theme="@style/AppTheme">...</application><uses-permission
android:name="android.permission.INTERNET"/></manifest>移動端Android程序開發(fā)運行Android程序,顯示數(shù)據(jù)庫中的商品名稱、價格和圖片,在移動界面上填寫新的價格后提交,數(shù)據(jù)庫的信息被修改后回顯在移動界面上,如圖7.28所示。7.4
Android與WebService交互目錄01
基本原理基本原理移動端Android程序通過HTTP訪問互聯(lián)網(wǎng)上的WebService,由WebService提供數(shù)據(jù)或完成處理功能。仍然沿用前述互聯(lián)網(wǎng)應(yīng)用系統(tǒng)的3層架構(gòu),如圖7.29所示的是Android與WebService交互的原理。目錄02
配置IIS服務(wù)器配置IIS服務(wù)器(1)在Windows控制面板“程序和功能”下點“打開或關(guān)閉Windows功能”鏈接,在出現(xiàn)的
“Windows功能”對話框中補充勾選“Internet信息服務(wù)”下“Web管理工具”和“萬維網(wǎng)服務(wù)”中的選項,如圖7.30所示,確定后出現(xiàn)“Windows正在更改功能...”的提示進度框,稍候片刻,待框消失后重啟Windows。配置IIS服務(wù)器(2)在Windows控制面板中選“系統(tǒng)和安全”→“管理工具”→“Internet信息服務(wù)(IIS)管理器”,打開Windows的網(wǎng)站管理器界面,如圖7.31所示。配置IIS服務(wù)器(3)在計算機E:\盤下創(chuàng)建一個名為MyServices的目錄,右擊“Internet信息服務(wù)(IIS)管理器”左側(cè)樹狀視圖下的“網(wǎng)站”→“添加網(wǎng)站”,在出現(xiàn)的“添加網(wǎng)站”對話框中填寫網(wǎng)站名稱為“EasyService”,選擇物理路徑為“E:\MyServices”,綁定IP地址“38”、端口“8080”(讀者請根據(jù)自己Web服務(wù)器的實際IP和端口填寫),如圖7.32所示。配置IIS服務(wù)器(4)將網(wǎng)站“EasyService”的應(yīng)用程序池設(shè)為ASP.NET
v4.0,如圖7.33所示,選中網(wǎng)站“EasyService”,點右側(cè)操作下的“基本設(shè)置”,出現(xiàn)“編輯網(wǎng)站”對話框,單擊“選擇”按鈕,從彈出框“應(yīng)用程序池”下拉列表中選“ASP.NET
v4.0”,點“確定”即可。配置應(yīng)用程序池的目的主要是為了讓網(wǎng)站的.NET框架與WebService的相兼容。目錄03
開發(fā)WebService1.創(chuàng)建Web服務(wù)項目2.編寫WebService程序開發(fā)WebService【例7.5】在服務(wù)器計算機上開發(fā)一個WebService。1.創(chuàng)建Web服務(wù)項目我們使用微軟的Visual
Studio
2015(VS2015)來開發(fā)WebService。啟動VS2015,選擇主菜單“文件”→“新建”→“項目”,彈出“新建項目”對話框,如圖7.34所示,在左側(cè)選擇“已安裝”→“模板”→“Visual
C#”→“Web”,中間選中“ASP.NET空Web應(yīng)用程序”項,上方下拉列表注意一定要選
“.NET
Framework
4”(圖中特別圈出),底部“名稱”欄填寫項目名稱為“MyWebService”,單擊“確定”按鈕。開發(fā)WebService在“解決方案資源管理器”中右擊剛剛創(chuàng)建的項目,選擇“添加”→“新建項”,彈出“添加新項”對話框,如圖7.35所示,在左側(cè)選擇“已安裝”→“Visual
C#”→“Web”,中間列表選中“Web服務(wù)(ASMX)”,底部“名稱”欄填寫Web服務(wù)名稱為“MainWebService.asmx”,單擊“添加”按鈕,這樣就創(chuàng)建好了一個Web服務(wù)項目。開發(fā)WebService2.編寫WebService程序此時,在VS2015中打開MainWebService.asmx源文件,可以看到VS已經(jīng)自動為我們生成了WebService的代碼框架,其中有個HelloWorld方法(默認(rèn)的示例方法),如圖7.36所示,它僅僅簡單地返回“HelloWorld”字符串。用戶可改寫這個方法,也可以自定義其他方法來擴充此WebService的功能。開發(fā)WebService由于本項目是基于.NET
Framework
4創(chuàng)建的,而VS2015默認(rèn)的.NET平臺版本是4.5.2,我們希望本項目的WebService要能夠訪問后臺MySQL
8數(shù)據(jù)庫,但MySQL
8自帶的C#驅(qū)動也是.NET
4.5.2版的,故我們需要想辦法弄到匹配.NET
4.0的MySQL驅(qū)動MySql.Data.dll。這里筆者是從CSDN上下載得到與.NET
4.0兼容的MySQL驅(qū)動的(附在本書源碼中提供給讀者),將其添加引用進項目中,如圖7.37所示。開發(fā)WebService實現(xiàn)思路:在程序開頭using引用MySQL
8驅(qū)動庫,并在WebService主類MainWebService中聲明數(shù)據(jù)庫連接對象、MySQL命令對象和數(shù)據(jù)讀取器。自定義一個WebService方法(以[WebMethod]聲明)GetCommodity()連接和訪問數(shù)據(jù)庫,該方法有兩個參數(shù):id(商品編號)和price(價格),當(dāng)price不為空時更新商品價格;否則查詢出對應(yīng)id編號的商品信息返回。在MainWebService.asmx文件中編寫WebService代碼。其中:(a)publicstringGetCommodity(string
id,stringprice):GetCommodity()是我們自定義的方法,它的功能就是從數(shù)據(jù)庫中獲取商品信息、更改價格。(b)if(!string.IsNullOrEmpty(price)):如果移動端用戶發(fā)來價格值(參數(shù)price不為空)則更新數(shù)據(jù)庫。(c)result=mdr["商品名稱"].ToString()+""+mdr["價格"].ToString()+":"+mdr["商品圖片"].ToString();:將查到的內(nèi)容按照一定格式組織起來賦給返回字符串。目錄04
發(fā)布WebService發(fā)布WebService(1)在解決方案資源管理器中右擊項目,點“發(fā)布”,出現(xiàn)如圖7.38所示的“發(fā)布Web”向?qū)υ捒颉T诘谝粋€“配置文件”頁點“選擇發(fā)布目標(biāo)”為“自定義”,彈出“新建自定義文件”對話框,填寫配置文件的名稱(可任?。?,點“確定”,單擊“下一頁”繼續(xù)。發(fā)布WebService(2)在“連接”頁,選擇“Publish
method”(發(fā)布方式)為“File
System”;“Target
location”(目標(biāo)路徑)為“E:\MyServices”(也就是我們之前創(chuàng)建的IIS網(wǎng)站“EasyService”的物理路徑),單擊“下一頁”,如圖7.39所示。發(fā)布WebService(3)在接下來的“設(shè)置”頁,“Configuration”選為“Debug”(注意一定要選這個?。?,如圖7.40所示,單擊“發(fā)布”按鈕,開始生成WebService。發(fā)布WebService稍候片刻,在VS環(huán)境下方的“輸出”子窗口出現(xiàn)如圖7.41所示的信息,表示發(fā)布成功。去往E:\MyServices下可看到發(fā)布的文件和目錄。發(fā)布WebService讀者可以先測試一下這個WebService能否正常工作,在移動端瀏覽器中輸入38:8080/MainWebService.asmx回車,如果出現(xiàn)圖7.42所示的頁面就表明該WebService已部署成功且能正常提供服務(wù)。目錄05
移動端Android程序開發(fā)1.加載ksoap2包2.編寫Android程序移動端Android程序開發(fā)【例7.6】在移動端計算機上開發(fā)一個Android程序訪問WebService。在移動端AndroidStudio中創(chuàng)建名為HttpWebServiceDemo的工程。與前一樣,在界面上拖曳放置一個文本視圖、一個圖像視圖、一個編輯框和一個按鈕,代碼略。1.加載ksoap2包Android程序與WebService通信使用的是SOAP協(xié)議,谷歌的ksoap2庫實現(xiàn)了這個協(xié)議,需要引入這個庫才能實現(xiàn)對WebService的訪問。到/content/repositories/ksoap2-android-releases/com/google/code/ksoap2-android/ksoap2-android-assembly/上可以下載到ksoap2,當(dāng)前最新版本為3.6.4,下載獲得的JAR包文件名為ksoap2-android-assembly-3.6.4-jar-with-dependencies.jar,用7.2.1節(jié)介紹的方法將它加載到工程中。移動端Android程序開發(fā)編寫Android程序 實現(xiàn)思路:在程序開頭導(dǎo)入ksoap2庫。MainActivity中聲明WebService命名空間、方法名、URL地址、SOAP動作等一系列參數(shù)。定義一個onSubmitClick(null)方法向WebService發(fā)起請求,在onCreate()中調(diào)用該方法。在onSubmitClick(null)方法內(nèi)另開一個線程實現(xiàn)與WebService的交互,先創(chuàng)建一個SOAP請求對象,裝入信封;然后創(chuàng)建一個HttpTransportSE對象,指定WebService的URL;再通過HttpTransportSE對象的call()方法調(diào)用WebService方法(GetCommodity());最后從信封的getResponse()方法得到WebS
ervice的返回結(jié)果。WebService返回結(jié)果轉(zhuǎn)換為字符串的形式封裝于Message消息對象中,通過Handler句柄發(fā)給主程序刷新UI界面。MainActivity.java代碼。移動端Android程序開發(fā)其中:(a)new
Thread(new
Runnable(){...}).start();:請求WebService是耗時操作,要放在線程里。(b)requestObj.addProperty("id",myCommodityId);:這里id與WebService中的參數(shù)名必須完全一樣。SoapSerializationEnvelope
envelope=new
SoapSerializationEnvelope(SoapEnvelope.VER12);:創(chuàng)建SoapSerializationEnvelope對象時需要通過SoapSerializationEnvelope類的構(gòu)造方法設(shè)置SOAP協(xié)議的版本號,該版本號需要根據(jù)服務(wù)端WebService的版本號來設(shè)置。HttpTransportSE
transportSE=new
HttpTransportSE(URL);:通過HttpTransportsSE類的構(gòu)造方法可以指定WebService的WSDL文檔的URL。(e)transportSE.call(SOAP_ACTION,envelope);:使用call()方法調(diào)用WebService方法。(f)Object
responseObj=envelope.getResponse();:使用getResponse()方法獲得WebService方法的返回結(jié)果。移動端Android程序開發(fā)運行程序,顯示數(shù)據(jù)庫中的商品名稱、價格和圖片,在移動界面上填寫新的價格后提交給WebService,數(shù)據(jù)庫的信息被修改后回顯在移動界面上,如圖7.43所示。7.5 網(wǎng)上商城JSON數(shù)據(jù)操作目錄01
基本原理基本原理本系統(tǒng)還是采用HTTP-Web-DB的3層架構(gòu),移動端以HttpURLConnection向Web服務(wù)器發(fā)起請求,Web服務(wù)器上的Java
Servlet接收請求,通過JDBC操作后臺Oracle
11g數(shù)據(jù)庫,將獲取的結(jié)果數(shù)據(jù)封裝為JSON對象返回給移動端。JSON是目前移動互聯(lián)網(wǎng)通行的信息傳輸格式,因此下圖7.44很好地演示了當(dāng)前真實移動互聯(lián)網(wǎng)應(yīng)用的運作模式。目錄02
Web端開發(fā)Web端開發(fā)【例7.7】開發(fā)Web端程序,以JSON與移動端交互。Web端仍然使用Java
Servlet程序,它負(fù)責(zé)接收Android程序發(fā)來的請求,根據(jù)Android程序的要求去操作后臺Oracle
11g數(shù)據(jù)庫,故離不開JDBC驅(qū)動包,這里使用的是ojdbc7.jar;又由于Web服務(wù)程序是以
JSON格式向移動端返回
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度寵物醫(yī)院寵物醫(yī)院寵物健康數(shù)據(jù)管理合同4篇
- 二零二五年版鋁合金散熱器研發(fā)與生產(chǎn)合同樣本2篇
- 引進創(chuàng)新創(chuàng)業(yè)團隊2025年度協(xié)議3篇
- 2025年度個人商鋪租賃合同裝修工程監(jiān)督合同4篇
- 二零二五年度地質(zhì)災(zāi)害風(fēng)險評估與防治合同3篇
- 2025年度個人閑置土地承包權(quán)置換合同范本4篇
- 2025年度大型活動策劃與執(zhí)行服務(wù)合同模板4篇
- 二零二五年度建筑廢棄物處理項目擔(dān)保合同范本3篇
- 二婚家庭專用2024離婚協(xié)議范本樣本版B版
- 2025年度趕工環(huán)保設(shè)備趕工銷售合作協(xié)議書
- 高考語文復(fù)習(xí)【知識精研】《千里江山圖》高考真題說題課件
- 河北省承德市2023-2024學(xué)年高一上學(xué)期期末物理試卷(含答案)
- 高中物理斜面模型大全(80個)
- 012主要研究者(PI)職責(zé)藥物臨床試驗機構(gòu)GCP SOP
- 農(nóng)耕研學(xué)活動方案種小麥
- 2024年佛山市勞動合同條例
- 污水管網(wǎng)規(guī)劃建設(shè)方案
- 城鎮(zhèn)智慧排水系統(tǒng)技術(shù)標(biāo)準(zhǔn)
- 采購管理制度及流程采購管理制度及流程
- 五年級美術(shù)下冊第9課《寫意蔬果》-優(yōu)秀課件4人教版
- 節(jié)能降耗課件
評論
0/150
提交評論