电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> JSP教程
在J2ME平台上构建你的邮件程序-JSP教程,J2ME开发
作者:网友供稿 点击:21
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 
在j2me平台上构建你的邮件程序
jacky pan



table of contents
1. 教程的介绍和程序的安装

2. 程序的结构

3. 界面的设计

4. 账户的管理

5. midlet和servlet的网络连接

6. servlet和javamail

7. 简单的xml

8. 小结




1.教程的介绍和程序的安装



本教程讲述了如何在j2me平台上编写一个简单的邮件应用程序,包括界面的设计,邮件的发送/接受,邮件账户的创建/修改/删除,后台servlet的编写。



为了运行本教程所带的演示程序,您需要安装下列软件:

1. wtk2.0 (java.sun.com)

2. apache tomcat (www.apache.org)



安装和运行示例程序的步骤:

1. 从http://groups.yahoo.com/group/oritec/files/下载micromail beta.zip(包括了源代码和二进制文件)

2. 解压micromail beta.zip至$tmp

3. 在$wtk/apps下建一新目录micromail

4. 拷贝$tmp/src/client/* 至 $wtk/apps/micromail/src/

5. 拷贝$/tmp/bin/server/mail.war至$tomcat/webapps/

6. 运行tomcat

7. 运行wtk2.0, “open project” 并选中micromail


8. 设置url为mailagent的地址http://server/mail/mailagent


2. 程序的结构

采用client-web server-mail server三层架构,如图1。

midlet

(cell phone)

servlet

(web server)

mail server











my application


figure 1



cell phone将请求(接受/发送邮件)传给web server,web server将这些http请求转换成对pop3或 smtp server的请求。pop3/smtp server执行相应的请求,并将相应通过web server返回给cell phone.



客户端(pda/手机)为j2me平台上的程序。midp2提供了一些基本网络连接的api。利用这些api可以使得j2me程序可以向远端发出http请求,并接受响应,传递数据流。



mailagent 为servlet,用来接收来自客户端的请求,并调用java mail api,将这些请求转变成对远端mail server 的请求,同时将mail server的响应传给客户端。



那么为什么要采用这样的架构了?这是因为midp2.0只支持http协议, 而不支持pop3 和 smtp等其它应用层协议,而j2ee提供了完整的java mail的api,所以考虑通过一个servlet将http请求转换成pop3或smtp请求。另一个原因是,很多运营商可能只提供有限的网络访问的能力,而通过一个agent则提供了程序部署的灵活性。



下面简单介绍一下源码的结构,在客户端,ui包中的类定义程序的用户界面,utility包中的类定义了数据库的操作,网络的连接,xml的解析等,mail包中的类定义了邮件账户,邮件的头。

ui package:

accountform.java

accountslist.java

confirm.java

confirmlistener.java

mailmidlet.java

messagelist.java

progressform.java

sendmessage.java

writecontent.java



utility package:

dboperator.java

headparser.java

netadapter.java

networker.java

parserlistener.java



mail package:

mailaccount.java

messagehead.java



服务器端只有一个文件mailagent.java,包含了一个servlet,用来做midlet和邮件服务器的桥梁。






3. 界面的设计

midp2.0提供了大量的api供开发者创建和控制用户界面。在包javax.microedition.lcdui中提供了list, form, textbox, alert等screen组件,在form中可以包含一系列item,如choicegroup, textfield, stringitem等。包中还提供了command组件,以及相应的listener。



源文件ui/mailmidlet.java定义了程序的入口以及micromail的主页面。如图2主页面是一个list,显示了几个功能模块,包括添加账户,修改/删除账户,接受邮件,发送邮件。


figure 2

public mailmidlet()

{

display = display.getdisplay(this);

/* 创建list */

mainlist = new list("micromail0.1", choice.implicit);

/* 创建两个控制按钮ok和exit */

cmok = new command("ok", command.ok, 1);

cmexit = new command("exit", command.exit, 1);

/* 向mainlist中添加内容 */

mainlist.append("add account", null);

mainlist.append("edit account", null);

mainlist.append("receive message", null);

mainlist.append("send message", null);

/* 为mainlist添加command */

mainlist.addcommand(cmok);

mainlist.addcommand(cmexit);

/* mailmidlet实现了commandlistener接口,可以作为监听器 */

mainlist.setcommandlistener(this);



……

}



通过accountform(源文件ui/accountform.java),用户可以添加和修改邮件账户,如图3。



figure 3a figure 3b



accountform包含了6个textfield,分别显示邮件账户的6个属性。account为账户名,也是账户的唯一标识,不可重名。address为邮件的地址,如bill@ms.com。 user, password是在邮件服务商注册的用户名和密码。pop3, smtp是pop3服务器和smtp服务器的名字或地址。

private void setcontent(mailaccount macc)

{

account = new textfield("account: ", "", 20, textfield.any);

address = new textfield("address; ", "", 40, textfield.emailaddr);

user = new textfield("user name: ", "", 20, textfield.any);

password = new textfield("password: ", "", 20, textfield.password);

pop3 = new textfield("pop3 server: ", "", 20, textfield.any);

smtp = new textfield("smtp server: ", "", 20, textfield.any);



if (macc != null)

{

account.setstring(macc.accountname);

address.setstring(macc.address);

user.setstring(macc.username);

password.setstring(macc.password);

pop3.setstring(macc.pop3server);

smtp.setstring(macc.smtpserver);

}



append(account);

append(address);

append(user);

append(password);

append(pop3);

append(smtp);



}

其它页面与accountform类似,在此不再赘述,请大家参照源代码和midp api的文档。




4. 账户的管理

邮件账户的创建,修改,删除都涉及到对数据记录的存取。midp提供了一种叫做记录管理系统(record management system)的机制来存储和访问数据。



javax.microedition.rms.recordstore提供了一些api来操作这个系统。静态方法openrecordstore用来打开或创建一个recordstore对象。方法addrecord, getrecord, deleterecord, setrecord分别用来添加,访问,删除或修改recordstore对象中的记录。



utility/dboperator.java中封装了这些方法,从而实现添加,修改,删除邮件账户的操作。以添加帐户为例,下面的addrecord方法用来向recordstore中添加一个记录,同时把这个记录所表示的邮件账户加到一个accounts中,accounts是一个vecotr,用来存储系统中当前的账户。参数str包含了账户的所有信息,如账户名,地址,用户名,密码,pop3,smtp等,它们之间用空格隔开。



public void addrecord(string str)

{

int id;

byte[] rec = str.getbytes();

string record = str;



try

{

/* 向recordstore中添加记录 */

id = rs.addrecord(rec, 0 , rec.length);



/* 同时把帐户添加到accounts向量中 */

mailaccount mailacc = mailaccount.createmailaccountfromstring(id, str);

accounts.addelement(mailacc);

}

catch(recordstoreexception rse)

{

rse.printstacktrace();

}



}




5. midlet和servlet的网络连接

midp的网络api在包javax.microedition.io中定义,其中httpconnection提供了对http协议的支持。



在文件utility/networker.java中通过调用这些网络api实现了接收当前信箱中邮件列表setmessagelist,接受某一邮件的内容receivemessage,发送邮件sendmessage等功能。以sendmessage为例。



public void sendmessage(final string url, final string formdata)//send a message

{

/* 创建新的进程 */

thread t = new thread()

{

public void run()

{

httpconnection http = null;



byte[] data = formdata.getbytes();

try

{

/* 打开并返回一个http连接 */

http = (httpconnection) connector.open(url);

......

/* 设置http请求头 */

http.setrequestmethod(httpconnection.post);

http.setrequestproperty("content-type", "application/x-www-form-urlencoded");

http.setrequestproperty("user-agent",

"profile/midp-1.0 configuration/cldc-1.0");

http.setrequestproperty("content-language", "en-us");

http.setrequestproperty("accept", "application/octet-stream");

http.setrequestproperty("connection", "close"); // optional

http.setrequestproperty("content-length", integer.tostring(data.length));

......

/* 打开输出流 */

outputstream os = http.openoutputstream();

/* 写邮件数据 */

os.write(data);

/* 关闭输出流 */

os.close();



}

catch (ioexception ioe)

{

......

}

finally

{

try

{

/* 关闭连接 */

if (http != null) http.close();

}

catch (ioexception ignored) {}

}

}

};

/* 启动进程 */

t.start();



}



midlet通过http连接向servelet发出接受或发送邮件的请求,servlet根据不同的请求向邮件服务器发出相应的请求,并将返回结果传给midlet。




6. servlet和javamail

j2ee中提供了对邮件相关协议的支持,包javax.mail和包javax.mail.internet 中定义了javamail api。下面是mailagent.java中servlet处理接受邮件列表请求的代码片断。

public void dopost(httpservletrequest request, httpservletresponse response)

throws servletexception, ioexception

{

printwriter out = response.getwriter();



string typestr = request.getparameter("type");

int type = integer.parseint(typestr);



string pop3server;

string username;

string password;



properties props;

string provider;



switch (type)

{

case receive_list:

/* 提取参数pop3服务器,用户名,密码 */

pop3server = request.getparameter(parampop3);

username = request.getparameter(paramname);

password = request.getparameter(parampass);



if (pop3server == null || username == null || password == null)

{

out.print(status_bad);//xml?

return;

}



props = new properties();

provider = "pop3";

try

{

/* 以指定的用户名和密码连接pop3服务器 */

session session = session.getdefaultinstance(props, null);

store store = session.getstore(provider);

store.connect(pop3server, username, password);

/* 得到inbox收件箱 */

folder inbox = store.getfolder("inbox");



if (inbox == null)

{

out.print(status_bad);//xml?

return;

}

/* 打开收件箱 */

inbox.open(folder.read_only);

/* 得到收件箱中的邮件列表,并写到 xml中 */

writexml(inbox.getmessages(), out);



inbox.close(false);

store.close();

}

catch(exception e)

{

out.println(e.getmessage());

e.printstacktrace();

}



out.close();



break;



case receive_message:

......

break;



case send_message:

......

break;

}



}

j2ee程序的编译和部署请大家参照相关的书籍或文档。http://www.tusc.com.au/tutorial/html/ 的<<tutorial for building j2ee applications using jboss and eclipse>>是一篇不错的文档。




7. 简单的xml

在midlet接受邮件时,首先向servlet请求传送邮箱中当前邮件的列表。列表中包括了邮件的头部信息,包括发送者的地址,邮件的主题,发送的时间等,如图4。


figure 4

在邮件主题中可能包括任何字符,所以没有办法用某一特殊字符分隔这些信息,而xml正好适合传输这种具有特定格式的信息。在servlet端,把有用的邮件头部信息作为xml的元素写到输出流中。

private void writexml(message[] messages, printwriter out)

{

out.println("<?xml version=\"1.0\"?>");

out.println("<mail>");



if (messages == null)

{

out.println("<error>no mail</error>");

}



try

{

int j = 0;

for (int i = messages.length -1; i >= 0; i--)

{

out.println("<message>");

/* 写邮件头 */

out.println("<from><![cdata[" + internetaddress.tostring(messages[i].getfrom()) + "]]></from>");

out.println("<subject><![cdata[" + messages[i].getsubject() + "]]></subject>");

out.println("<date>" + messages[i].getsentdate().tolocalestring() + "</date>");

out.println("<index>" + i + "</index>");

out.println("</message>");



j++;

if (j > 9)

{

/* 一次只看10个邮件 */

break;

}

}

}

catch(messagingexception me)

{

out.println("<error>" + me.tostring() + "</error>");

}



out.println("</mail>");

}



在midlet端再解析这个xml,在j2me平台上有许多免费的xml parser,kxml就是其中的一个。可以从 http://kxml.enhydra.org/ 下载kxml 1.21的源代码,jar文件以及api文档。



下面是utility/headparser.java中处理xml的代码片断

public void parse(inputstream in) throws ioexception

{

reader reader = new inputstreamreader(in);

xmlparser parser = new xmlparser(reader);

parseevent pe = null;



parser.skip();

/* 读一个名字为mail的event */

parser.read(xml.start_tag, null, "mail");



boolean trucking = true;

boolean first = true;



while (trucking)

{

/* 读取下一个event */

pe = parser.read();



if (pe.gettype() == xml.start_tag)

{

/* 得到event的名字 */

string name = pe.getname();



if (name.equals("message"))

{

string from = null;

string subject = null;

string date = null;

int index = -1;



while ((pe.gettype() != xml.end_tag) ||

(pe.getname().equals(name) == false))

{

pe = parser.read();

if (pe.gettype() == xml.start_tag &&

pe.getname().equals("subject"))

{

pe = parser.read();

/* 得到event的内容 */

subject = pe.gettext();

}

else if (pe.gettype() == xml.start_tag &&

pe.getname().equals("from"))

{

pe = parser.read();

from = pe.gettext();

}

else if (pe.gettype() == xml.start_tag &&

pe.getname().equals("date"))

{

pe = parser.read();

date = pe.gettext();

}

else if (pe.gettype() == xml.start_tag &&

pe.getname().equals("index"))

{

pe = parser.read();

index = integer.parseint(pe.gettext());

}



}



/* 把邮件头交给监听器处理 */

headlistener.itemparsed(from, subject, date, index);

}

else //non message block

{

while ((pe.gettype() != xml.end_tag) ||

(pe.getname().equals(name) == false))

pe = parser.read();

}

}

if (pe.gettype() == xml.end_tag &&

pe.getname().equals("mail"))

{

trucking = false;

}



}



具体的api的用法请大家参照kxml的文档。jsr172 (j2me web services specification)提出了在j2me平台上处理xml的规范,有兴趣的朋友可以到jcp的网站 (http://www.jcp.org) 上看看,但目前可能还没有厂商或组织的实现。




8. 小结

本文介绍了j2me平台上邮件程序的编写,涉及的知识点有:

1. j2me的ui

2. record store

3. j2me的网络连接 / j2me 和j2ee之间数据的传递

4. parsing xml in j2me

5. 简单的servlet

6. java mail apis





参考资料有:

1. midp2.0 spec, http://www.jcp.org

2. <<core j2me>>, http://www.corej2me.com/

3. <<j2me in nutshell>>, http://www.oreilly.com

4. tutorial for building j2ee applications using jboss and eclipse, http://www.tusc.com.au/tutorial/html/


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·IReport与JasperReport开发详解一-JSP教程,Java技巧及代码
·JSTL(JSP标准标签库)介绍-JSP教程,资料/其它
·格式化输入日期时间控件 JieFormattedDateBox-JSP教程,Java技巧及代码
·JSTL简化JSP编码-JSP教程,Jsp/Servlet
·JUnit和单元测试入门简介-JSP教程,Java技巧及代码
·从数据库中读取一个图片并保存为一个图片文件-JSP教程,数据库相关
·Java Swing入门基础-JSP教程,Java技巧及代码
·IntelliJ IDEA培训-JSP教程,Java技巧及代码
·通过JSP的预编译消除性能瓶颈-JSP教程,Jsp/Servlet
·Java中利用JMF编写摄像头拍照程序-JSP教程,Java技巧及代码

最新文章
·J2ME中的时间处理方法
·J2ME播放声音流程简介
·J2ME开发之手机键盘使用注意问题
·J2ME 记录管理存储
·MVC模式在j2me项目中的应用(二)
·MVC模式在j2me项目中的应用(一)
·J2ME中使用记录存储系统(RMS)存储信息
·J2ME与MIDP开发(1)
·用简单的J2ME程序测试MIDlet的生命周期
·JAVA基础:提升JSP应用程序的七大绝招


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号