分享
 
 
 

J2ME程序与Servlet通讯访问Access数据库

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

作者:关文柏 时间:2005年5月26日

现在J2ME联网的技术很多,本人也只是刚刚接触这方面,这几天帮别人调试了一些这方面的程序,学到了不少东西,下面就谈谈我学习的过程.

首先这种程序可以简化的分解成三个层面,

1,J2ME的客户端(MIDlet程序)

2,服务器端的servlet(servlet程序)

3,数据库(Access或者是SQL等)

下面我通过一个小例子来实现通过手机客户端发送请求,然后服务器端的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原文件里面一样的文字了。

是不是很开心。呵呵!

当然在实际开发中,不会只实现如此简单的功能。我也在不断的摸索和学习中,希望各位朋友也谈谈你们在学习过程中的心得。我的QQ:19197

1016 MSN:k7sem_88@hotmail.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有