手机java 联网,基于J2ME的手机联网程序

随着国内3G的启动,新一代移动通信大潮已经到来。技术的进步使得无线网络取得不错的发展,移动互联网巨大前景也随着显现。无线网络速度的提高,催生大量的手机联网应用程序。手机联网功能的强化,使得手机应用更具价值,进一步扩展了手机功能。

现在我们就来实现一个基于J2ME的手机联网程序。考虑到手机运算资源的限制,我们采用客户端/服务器的模式来实现,J2ME只做为客户端运行于手机上,负责展现和处理简单的业务逻辑,保存少量的关键数据;服务器端采用J2EE实现,负责保存用户数据,以及响应在线用户的复杂业务逻辑。

在这里,服务端J2EE的实现不是本文的重点,所以只进行简单的描述,我们主要对手机客户端J2ME的讲解。

在J2ME客户端,我们可以采用的MVC软件架构模式,进行逻辑分层,使代码更为清晰,权责更为明确,也利于代码维护和功能升级。

1、Handle(Controller):它既做为控制器,也做为简单逻辑处理器。如处理网络请求,网络消息分发。它是关键层,涉及到整体结构的每一层,用于控制应用程序的流程。它处理事件并作出响应。因为复杂业务逻辑的处理权责已经分化到服务器端,只处理简单的逻辑和少量的数据访问,所以此层没有进一步划分出业务层,统一划为处理层。

2、DAO:数据访问对象(Data Access Object),用于封装数据的于Database的读取和存储操作。便于Handle的调用完成简单业务逻辑的处理。

3、Database:用来存储少量数据,即负责关键数据的持久化。在J2ME中,RMS(Record Management System)是这个层次主要承担者。在实际应用中,如果数据间关系很简单,也可以选用文件进行保存,如XML格式或普通文本格式。Handler会控制对Database的存储和提取,用来View层显示。

4、Model:数据模型用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。数据的抽象化分离了具体的View,也方便Handle对数据持久化操作。

5、View: 这层用来显示用户界面,并且响应和处理键盘的指令。将Handler层指派的一些信息显示出来,并且将需求信息送给Handler去处理。所以这层直接于Handler沟通,不会直接涉及到Database或网络信息。

5b6c2dd4364f1143be7cce1cb890c046.gif

我们这里做的这个联网程序是一个即时读取互联网资讯的工具,从任意一个网站的资讯列表页面获取其中的资讯标题和链接,返回给手机客户端。而在手机客户端选取一条资讯进行打开时,又去联网获取文章的文本内容。从服务器端返回的数据中只包含文本信息,无任何除资讯资讯URL的HTML数据。这样就大大减少了无用数据传输,降低了网络通信费用,提高访问速度,更为方便地访问WWW网站。

服务端要处理的业务逻辑有:根据提供的链接地址,获取页面内容并进行分析,提取资讯条目或资讯内容数据。返回给手机客户端。这部分的处理逻辑有一定的复杂,需要耗费一定的资源,所以将其划分到服务端进行处理。

客户端只负责发送请求和接收服务端返回的数据,进行简单处理后将内容呈现到用户浏览界面。相当于一个网页浏览器。

--演示截图--

b6542fc6061d88cf870829f72d38c793.png

c55366a54dfdfea580e13b006d636977.png

/***********************************************************/

package com.efan.wb.view;

import javax.microedition.lcdui.Command;

import javax.microedition.lcdui.CommandListener;

import javax.microedition.lcdui.Display;

import javax.microedition.lcdui.Displayable;

import javax.microedition.lcdui.Form;

import javax.microedition.lcdui.TextBox;

import javax.microedition.midlet.MIDlet;

import com.efan.wb.handle.WbAction;

public class WebBrowser extends MIDlet implements CommandListener {

private TextBox textbox;

private Display display = null;

private Form mainForm = null;

public static final Command exitCommand = new Command("Exit", Command.OK, 1);

public void startApp() {

Display.getDisplay(this).setCurrent(textbox);

if (display == null) {

display = Display.getDisplay(this);

}

mainForm = new Form("News Form");

// 从控制器加载

WbAction action = new WbAction();

String newsList = action.getNews();

mainForm.append(newsList);// 加载默认新闻标题列表

mainForm.addCommand(exitCommand);

mainForm.setCommandListener(this);

display.setCurrent(mainForm);

}

public void commandAction(Command cmd, Displayable displayable) {

if (cmd == exitCommand) {

destroyApp(false);

notifyDestroyed();

}

}

public void pauseApp() {

}

public void destroyApp(boolean unconditional) {

}

}

/***********************************************************/

package com.efan.wb.handle;

import java.io.DataInputStream;

import java.io.IOException;

import javax.microedition.io.Connector;

import javax.microedition.io.HttpConnection;

import com.efan.wb.dao.WbDao;

import com.efan.wb.model.UrlEntity;

public class WbAction {

public String getNews() {

// 从RMS中获取默认的URL

WbDao dao = new WbDao();

UrlEntity ue = dao.getDefaultURL();

String url = ue.getUrl();

WebExplorer we = new WebExplorer(url);

we.start();// 启动网络新闻获取线程

// 轮循等待操作完成

while (!we.isComplete()) {

// 超时处理,此略

}

return we.getNewsList();

}

// 为了简化代码,把这个访问网络的线程类作为内部类

class WebExplorer extends Thread {

private String newsList;

private String url;

public WebExplorer(String url) {

this.url = url;

}

public WebExplorer() {

}

public void setUrl(String url) {

this.url = url;

}

private boolean isComplete() {

return this.newsList == null ? false : true;

}

public String getNewsList() {

return newsList;

}

public void run() {

try {

HttpConnection conn = (HttpConnection) Connector.open(this.url);

DataInputStream is = conn.openDataInputStream();

this.newsList = is.readUTF();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

/***********************************************************/

package com.efan.wb.dao;

import com.efan.wb.model.UrlEntity;

public class WbDao {

public UrlEntity getDefaultURL() {

UrlEntity ue = new UrlEntity();

// 访问RMS,查询默认的URL,此略,直接硬编码来测试

String url = "http://localhost:8080/rss/news";

String name = "Test Web URL";

ue.setName(name);

ue.setUrl(url);

return ue;

}

}

/***********************************************************/

package com.efan.wb.model;

public class UrlEntity {

private String name;

private String url;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getUrl() {

return url;

}

public void setUrl(String url) {

this.url = url;

}

}

/***********************************************************/

package cn.rssweb.site.web;

import java.io.DataOutputStream;

import java.io.IOException;

import java.util.Iterator;

import java.util.List;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import cn.rssweb.edp.component.spider.RobotFactory;

import cn.rssweb.edp.component.spider.model.DataModel;

import cn.rssweb.edp.component.spider.robot.Robot;

public class NewsListServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String url = "http://www.techweb.com.cn/news/20.shtml";

Robot robot = RobotFactory.getInstance(Robot.HTML,url);//服务器逻辑处理核心类,此略

List list = robot.parseList();

Iterator it = list.iterator();

int i=0;

StringBuffer sb = new StringBuffer();

while(it.hasNext()){

i++;

DataModel data = (DataModel)it.next();

String title = data.getLinkText();

sb.append(i).append(".").append(title).append("\n");

}

DataOutputStream dos = new DataOutputStream(response.getOutputStream());

dos.writeUTF(sb.toString());

dos.flush();

dos.close();

}

@Override

protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1)

throws ServletException, IOException {

super.doPost(arg0, arg1);

}

}

/***********************************************************/

  一.JAVA程序传送到手机的方法:   JAVA程序传送到手机的方法有4种,分别是手机上网直接下载安装,通过电脑下载到本地 后,然后通过读卡器,数据线,蓝牙,红外线传输JAVA程序手机.具体方法说明如下.   1.手机上网下载:   通过手机上网下载以及使用短信定购的方式,直接在手机的个人文档或者应用程序中找 到(根据手机各不相同),无需在安装,直接可以在类似"我的文件夹"之类的选项找到。   使用电脑下载就需要将文件传送到手机上。   2. 读卡器:   1 新买的卡,先在手机上格式你的 TF 卡:设置 -- 手机状态 -- 存储存储设备 - - 卡 -- 菜单键 -- 格式 OK      或先安装 TF 卡到手机上采取拍照,录象的方式,激活 TF 卡的文件夹。 如果是 已经使用的就不必了...   2 .将我的电脑 -- 工具 - 文件夹选项 - 查看中的,隐藏文件和文件夹 -- 选显示   3 .打开我的电脑 -- 工具 - 文件夹选项 - 查看,把 " 隐藏受保护的操作系统文 件 " 前面的勾去掉   4.然后用读卡器打开你的 TF ,就可以看见 TF 卡上的 KJAVA 了。 copy JAVA程序(包 括 *.JAR,*.JAD)到你 TF 卡的 KJAVA 目录里就行了   5 .安装 TF 卡到手机。   6 .进入手机 " 游戏 和应用程序)里安装新的程序 OK   3.数据线传输:   通过安装购买手机时所附带的 软件 安装盘,安装其pc套件,用数据线接上手机与电脑, 通过管理 软件 把JAVA程序文件*.JAD,*.JAR传送到手机上;MIDWAY2.8 也可以传输 JAVA 程序,但是需要开启 JAVA 设置中的 "JAVA 加载器 "     二、安装问题-相关说明 1. 如何安装Kjava程序   JAVA平台的手机软件一般有两个文件,一个是jar,一个是jad。 诺基亚等品牌的机器 需要两个文件都传入手机中才能正常使用。   而索爱等品牌的手机只需要一个jar文件就可以用了。具体情况要根据你自己的手机来 确定。   如果你是下载至电脑本地安装,你的手机需要用到.jad文件才能完成安装. 通过数据 线,红外或蓝牙等方式把两个文件[.jar,.jad]存到手机上同一个目录中即可。      2.如何安装Symbian程序   Symbian软件安装包通常是.sis的压缩文件,其中包含许多组件文件。   安装步骤如下 :   (1) 安装文件可以通过蓝牙连接或红外连接发送至手机.   (2) 在手机收到信息后,打开新信息,选择打开->安装   (3) 按照提示一步一步操作下去,直到安装完成   3.如何安装微软SmartPhone智能手机软件    在使用微软操作系统的SmartPhone上安装软件,有三种方法:   1)直接拷贝法 与电脑类似,在智能手机上也流行"绿色软件"一说。这一类软件只须将相关文件 Copy到手机或存储卡上,然后建立一快捷方式,并将其拖入"Storage\windows\Start Menu" 文件夹。欲使用该软件,只须进入"开始"菜单即可。 小知识:与电脑不同,使用微软操作系统的SmartPhone并未自带资源管理器,因此 须要自行安装,否则无法进行文件操作。推荐使用Explorer 2003。   (2)CAB文件安装法   如果下载的软件为*.CAB格式,那么请先用数据线或者读卡器将该文件Copy到SD卡等 附加储存卡上(不推荐Copy到手机内置闪存上)。然后打开资源管理器(笔者使用的是 Explorer 2003中文版),选中文件按OK键执行安装。一般来说,系统会弹出警告,点击确 定即可。 有的软件可能会选择安装路径,选择安装路径,建议选择将软件安装到储存卡上。安装 完毕后,就可以在开始菜单中找到该软件的快捷方式了。   (3)EXE文件安装法    前两种文件的安装都比较简单,但如果遇到*.EXE文件,那么安装起来就稍显繁复。首 先,必须在电脑里安装Microsoft ActiveSync同步软件;其次,须要一根同步数据线或红外 /蓝牙适配器(推荐使用数据线)。当这两者都齐备后,就可以进行安装了。   Microsoft ActiveSync联线后,双击运行*.EXE文件会看到一个安装界面。选择一个目 录,单击安装,安装文件会自动解压并传送数据至手机。在电脑屏幕上弹出提示时,就要换 为手机操作了。按照手机屏幕上的提醒,选择将软件安装在手机或者储存卡上即可。   安装java程序要有两个文件,一个是JAR和JAD, 但拷贝下来的游戏只
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值