站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题J2ME程序与Servlet通讯访问数据库

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

摘要: J2ME程序与Servlet通讯访问数据库
:0 〗
</td> </tr> <tr> <td height="35" valign="top" class="ArticleTeitle"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="346" height="258" align="center" valign="top"> 首先这种程序可以简化的分解成三个层面:
1,J2ME的客户端(MIDlet程序)

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

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

下面我通过一个小例子来实现通过手机客户端发送请求,然后服务器端的servlet响应,servlet通过查询Access数据库的内容 ,返回给手机客户端并显示出来。

很简单的一个东西却涉及到很多步骤。

开发环境:
操作系统: windows 2000 professional/xp
JDK版本: 1.4.2以上
WTK版本: 2.1以上
Tomcat版本:5.0以上

</td> <td width="338" valign="top"> </td></tr> </table>

如果你还不明白JDK WTK tomcat 是什么东西的话,建议你补习一下基础知识,这里我就不说明了。
运行图:

我们先编辑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/TestNet/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/TestNet/returnMsg");//得到连接对象
dis = new DataInputStream(hconn.openInputStream());//用得到的对象的数据流做参数 再作为参数构成数据输入流

while(dis.readUTF()!= null) //判断当数据流不为空的时候
{
msg = msg.append(dis.readUTF());//用readUTF()方法构造字符串 放在StringBuffer里
msg.append("/n");
}

}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----------------------------------------------------------------------

package ex;
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/TestNet/WEB-INF/classes/ex/ 里面,注意路径一定不要错。
然后还要编辑WEB-INF目录下面的web.xml文件.
再里面加入这些信息:
--------------------------------------------------------

returnMsg
ex.returnMsg


returnMsg
/returnMsg

----------------------------------------------------
你可以把原来里面的这些内容删除掉。

注意:如果你在命令行下面编译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/TestNet/returnMsg

来看看效果吧,,,,,,
什么?什么都没出现吗,呵呵,,因为我们并没有向浏览器里面输出什么,当然什么也没有,,,你可以查看原文件,如果里面有你数据库的信息,那么就是连接成功了。servlet一切正常。

最后我们打开 WTK 新建工程文件,把前面我们写的那两个类放在scr里面,然后 build一下,然后run 点"连接" ,这时候模拟器中,就会出现和刚才在IE原文件里面一样的文字了。
是不是很开心。呵呵!

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

</td> </tr> <tr>


↑返回目录
前一篇: J2ME中RMS的使用解析
后一篇: MIDP低级事件处理机制