下面我通過一個小例子來實現通過手機客戶端發送請求,然後服務器端的servlet響應,servlet通過查詢Access數據庫的內容 ,返回給手機客
戶端並顯示出來。
很簡單的一個東西卻涉及到很多步驟。
開發環境:
操作系統: Windows 2000 professional
JDK版本: 1.4.2
WTK版本: 2.1
Tomcat版本:5.0
如果你還不明白JDK WTK tomcat 是什麼東西的話,建議你補習一下基礎知識,這裡我就不說明了。
JDK的版本,一定要是1.4.0以上的,也許你用的低版本的並且和Tomcat的低版本兼容也不錯。但是我試過用 Tomcat5.0 + JDK1.0.3 就會報錯
,無法啟動Tomcat服務器.在Tomcat的log中,是這樣寫的"Unsuported JNI version 65537" 所以我采用相對高版本的JDK。
配置好環境變量,這裡也不多說了。測試一下你的環境變量。在cmd窗口,輸入java - version 看看JDK的版本。輸入Javac 看看是否報錯,無
錯就證明JDK的環境變量設置正確了。
然後我們編輯J2ME的客戶端程序,程序由兩個類構成。本人不是什麼高手,所以程序只能是實現功能為目的,並沒有體現什麼優化的價值。
---------------------------------NetMain.Java-----------------------------------------------------
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
public class NetMain extends MIDlet implements CommandListener//繼承MIDlet 實現CommandListener接口
{
private Display dis;
sendMsg sm;
private Command sd = new Command("連接",Command.OK,1);//發送數據的按鈕
public NetMain()
{
dis = Display.getDisplay(this);//得到顯示對象
}
public void startApp()
{
Form f = new Form("聯網測試");//顯示在屏幕的Form對象
f.append("發送數據");
f.addCommand(sd);
f.setCommandListener(this);//設置按鈕監聽
dis.setCurrent(f);
}
public void pauseApp()
{
}
public void destroyApp(boolean un)
{
}
public void exit()
{
destroyApp(false);
notifyDestroyed();
}
public void commandAction(Command c,Displayable d)
{
if(c == sd)
{
sm = new sendMsg(this);//調用sendMsg類,將本類作為參數傳入
dis.setCurrent(sm);//顯示sendMsg類
}
}
}
------------------------------------------------------------------------------------------
------------------------------------sendMsg.Java------------------------------------------------------
import Javax.microedition.lcdui.*;
import Javax.microedition.io.*;
import Java.io.*;
public class sendMsg extends Form implements CommandListener,Runnable//繼承Form 實現CommandListener和Runnable接口
{
String url = "http://127.0.0.1:8080/returnMsg";// 定義聯網用的URL
String returnMsg=""; //獲得返回字符串
Command exit=new Command("離開",Command.EXIT,1);//退出程序的按鈕
Thread t;//定義聯網用線程
NetMain nm;//NetMain的實例
public sendMsg(NetMain nm)//構造函數,將NetMain的實例傳入
{
super("返回結果");//定義Form的標題
this.nm = nm;
t = new Thread(this);
t.start();//啟動線程
}
public void run()
{
try
{
returnMsg = sendHttpGet(url);
//將url傳到sendHttpGet方法裡做參數,並返回服務器結果的字符串賦值給returnMsg
//System.out.println(returnMsg);
append(returnMsg);//顯示出返回結果
addCommand(exit);
setCommandListener(this);
}catch(Exception e)
{
System.out.println(e);
}
}
public String sendHttpGet(String url) throws IOException
{
HttpConnection hconn = null; //定義HTTP連接的對象
DataInputStream dis = null; //定義數據輸入流
StringBuffer msg = new StringBuffer() ; //創建一個StringBuffer存放收到的字符串
String s="";
try
{
hconn = (HttpConnection)Connector.open("http://localhost:8080/returnMsg");//得到連接對象
dis = new DataInputStream(hconn.openInputStream());//用得到的對象的數據流做參數 再作為參數構成數據輸入流
while(dis.readUTF()!= null) //判斷當數據流不為空的時候
{
msg = msg.append(dis.readUTF());//用readUTF()方法構造字符串 放在StringBuffer裡
}
}catch(Exception e){}
finally
{
if(hconn != null)//關閉連接
hconn.close();
if(dis != null)
dis.close();
}
return msg.toString();//將得到的StringBuffer 通過toString()方法,生成新的String並返回
}
public void show()
{
}
public void commandAction(Command c,Displayable d)
{
if(c == exit)
{
nm.exit();//退出程序
}
}
}
-------------------------------------------------------------------------------------------------------------------
以上的兩個類,注釋應該能看明白。首先是一個Form,上面放了一個按鈕,當按按鈕的時候,啟動聯網線程,連接URL,然後返回一個字符串,
顯示在一個新的Form裡。很簡單是吧,呵呵。
下面我們來設計服務器端的部分。主要就是寫一個servlet程序。下面是程序代碼
-----------------------------------------returnMsg.Java----------------------------------------------------------------------
----
import Java.sql.*;
import Javax.sql.*;
import Java.io.*;
import Javax.servlet.*;
import Javax.servlet.http.*;
public class returnMsg extends HttpServlet
{
public void doGet(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException
{
res.setContentType("text/Html; charset=gb2312");//設置返回的類型
ServletOutputStream out = res.getOutputStream();//得到輸出流
DataOutputStream DOS = new DataOutputStream(out);
DOS.writeUTF("這是測試結果");
DOS.writeUTF("下面是數據信息");
Connection conn = null;
ResultSet rs = null;
Statement stmt = null;
try
{
String drname = "sun.jdbc.odbc.JdbcOdbcDriver";//這些是連接數據庫的驅動
Class.forName(drname);
String url = "jdbc:odbc:mydata";
conn = DriverManager.getConnection(url);
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from user");//查詢數據庫表 表名為user
while(rs.next())
{
DOS.writeUTF("用戶ID:"+rs.getString("id"));//得到字段ID 和字段name 內容
DOS.writeUTF("用戶名:"+rs.getString("name"));
}
rs.close();
stmt.close();
conn.close();
}catch(Exception e)
{
}
}
}
---------------------------------------------------------------------------------------------------------
首先把寫好的returnMsg.Java程序要進行編譯,生成.class文件。我們把生成好的class文件放在 Tomcat 目錄下的
webaPPS/root/web-inf/classes/ 裡面,注意路徑一定不要錯。
然後還要編輯web-inf目錄下面的web.XML文件.
再裡面加入這些信息:
--------------------------------------------------------
<servlet>
<servlet-name>returnMsg</servlet-name>
<servlet-class>returnMsg</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>returnMsg</servlet-name>
<url-pattern>/returnMsg</url-pattern>
</servlet-mapping>
----------------------------------------------------
你可以把原來裡面的這些內容刪除掉。
注意:如果你在CMD 下面編譯returnMsg.java文件時候,出現import Javax.servlet.*;錯誤的時候,記得要在環境變量裡面填加一句,比
如在classpath裡面加上
c:\Program Files\apache Software Foundation\Tomcat 5.0\common\lib\servlet-api.jar 就是填加servlet api的搜索路徑.
然後我們還需要用Access生成一個數據庫文件,表名就是user,裡面有幾個字段 分別為ID 自動編號就行,name 隨便加幾個名字。然後要
把數據庫作為數據源進行連接。
由於我們的系統是Windows 2000 所以在 開始---設置----控制面板-----管理工具---數據源ODBC 點"添加" 注意要在系統的DSN裡面 操
作,然後把你的數據庫放在一個
沒有中文字符路徑中, 選擇它就可以了。數據源的名稱就是mydata
現在我們可以啟動Tomcat服務器了,然後測試一下我們剛才寫的servlet, 我們打開IE浏覽器 輸入http://127.0.0.1:8080/returnMsg
來看看效果吧,,,,,,
什麼?什麼都沒出現嗎,呵呵,,因為我們並沒有向浏覽器裡面輸出什麼,當然什麼也沒有,,,你可以查看原文件,如果裡面有你數據
庫的信息,那麼就是連接成功了。servlet一切正常。
最後我們打開 WTK 新建工程文件,把前面我們寫的那兩個類 放在scr裡面,然後 build一下,然後run 點"連接" ,這時候模擬器中,就
會出現和剛才在IE原文件裡面一樣的文字了。
是不是很開心。呵呵!