`
java2000.net
  • 浏览: 650901 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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

阅读更多

作者:关文柏 时间: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

分享到:
评论

相关推荐

    j2me手机成绩查询系统

    【手机成绩查询系统开发】是基于J2ME技术在...总的来说,"j2me手机成绩查询系统"是一个集成了J2ME移动开发、Servlet服务器编程以及Access数据库管理的技术项目,旨在提升学生的实践技能,同时提供便捷的成绩查询服务。

    J2ME企业级开发-j2me

    4. 数据访问层(Data Access Tier):负责数据库交互,可能包括实体Bean或DAO(Data Access Objects)。 通过这样的设计,系统可以实现安全性、扩展性和可维护性。客户端通过HTTP连接提交请求,服务器处理并返回...

    计算机专业大学生科研课题精选(20211010150051).pdf

    1. **VB+ACCESS**:表明了Visual Basic(VB)与Microsoft Access数据库的结合使用。这通常用于快速开发小型应用程序,因为VB是一种简单易用的编程语言,而Access作为一个轻量级的关系数据库管理系统,它们的组合在...

    java源码包---java 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    01手机客户端系统的设计与开发

    数据库采用Access,技术支持涉及J2ME的Java技术特性以及移动设备的特点。 产品定位在用户市场上主要针对公交路线查询,但可扩展至其他查询服务。在行业市场上,该系统适用于金融、通信、政府、天气预报等多个领域,...

    JAVA上百实例源码以及开源项目源代码

    J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失...

    计算机专业大学生科研课题精选(20211010124021).pdf

    VB经常与Access数据库结合使用,以创建具有简单数据库管理功能的小型应用程序。ASP(Active Server Pages)也是一个微软技术,允许程序员使用VBScript或其他脚本语言来创建动态网页和Web应用。 紧接着,文档提到了...

    java源码包2

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java源码包3

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java源码包4

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失...

    2021-2022计算机二级等级考试试题及答案No.19558.docx

    8. Servlet配置:在访问Servlet时,浏览器地址栏中的路径是通过在Web服务器的配置文件(如Apache Tomcat的web.xml)中配置的。 9. 域名结构:域名中的子域名用"."分隔,而非"//"。 10. Java类型转换:程序中,变量...

    2021-2022计算机二级等级考试试题及答案No.1073.docx

    Access数据库对象中不包含 **文件夹** 。Access支持的数据库对象包括表、查询、窗体等,但不直接支持文件夹作为数据库对象。 ### 16. 接口继承 在面向对象编程中,接口是一种特殊的类,它可以被其他接口继承。然而...

    个性简历模板..docx

    1. **VC++**:作者拥有五个小型系统的开发经验,熟悉在VC++环境下进行数据库编程,特别是使用VFP和Access数据库。他们还掌握了网络编程,特别是MFC、CSocket和CAsyncSocket类的运用,并对DLL、COM和多线程编程有一定...

    Java学习思路.pdf

    Java数据库连接(JDBC)是Java程序与数据库之间通信的API。它允许Java程序执行SQL语句,从而能够操作数据库。JDBC驱动程序使得Java程序能够与特定的数据库产品交互。而JMS(Java Message Service)则是Java平台的...

    2021-2022计算机二级等级考试试题及答案No.14561.docx

    - **宏组调用格式**:在Access数据库中,如果需要调用宏组中的某个宏,可以通过`宏组名.宏名`的格式进行调用。 ### 23. 结构化程序设计 - **三种基本结构**:结构化程序设计提倡使用顺序结构、选择结构和循环结构...

    2021-2022计算机二级等级考试试题及答案No.16401.docx

    5. Java平台:Java为移动设备提供了J2ME(Java 2 Micro Edition)平台,用于开发和运行嵌入式和移动设备的应用程序。 6. 面向对象编程概念:面向对象编程中的消息传递、继承和多态性是核心概念,而模块是面向过程...

    J2EE探索者(中文版).rar

    它包含了各种服务、APIs和协议,用于处理Web应用程序、事务处理、数据库连接、安全性以及更多的企业级功能。通过学习J2EE,开发者可以创建可扩展、安全且可靠的服务器端应用程序。 在《J2EE探索者》中,你可能会学...

Global site tag (gtag.js) - Google Analytics