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

       

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

  • 相关阅读:
    461. Hamming Distance
    342. Power of Four
    326. Power of Three
    368. Largest Divisible Subset java solutions
    95. Unique Binary Search Trees II java solutions
    303. Range Sum Query
    160. Intersection of Two Linked Lists java solutions
    88. Merge Sorted Array java solutions
    67. Add Binary java solutions
    14. Longest Common Prefix java solutions
  • 原文地址:https://www.cnblogs.com/fubeidong/p/1398697.html
Copyright © 2020-2023  润新知