zoukankan      html  css  js  c++  java
  • J2me c/s结构,访问数据库

    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原文件里面一样的文字了。
        是不是很开心。呵呵!

       

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

  • 相关阅读:
    CentOS7中Tomcat的安装和配置
    CentOS7中JDK的安装和配置
    Linux基本指令
    MySQL数据库索引:索引介绍和使用原则
    MongoDB基础篇2:数据库/用户/数据集合的增删改
    MongoDB基础篇1:安装和服务配置
    JSTL fn:replace()函数替换 换行符
    LeetCode440. 字典序的第K小数字
    kubeadm搭建kubernetes-1.13.2集群
    kubernetes(k8s)kubectl使用详解
  • 原文地址:https://www.cnblogs.com/fubeidong/p/1398697.html
Copyright © 2011-2022 走看看