程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> J2ME學習記(三)

J2ME學習記(三)

編輯:J2ME
Ticker對象
發信站: 北大未名站 (2001年10月20日21:14:25 星期六) , 站內信件
Ticker對象是一個項目類型的對象,它的作用相當於一個滾動消息欄,在屏幕的上方顯示滾
動的信息。 Ticker類的構造函數僅有一個參數,那就是需要滾動顯示的消息。
package fancy.test;
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
public class ShowTicker extends MIDlet implements CommandListener
{;
private Display display;
       private Form props;
 
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public ShowTicker()
{;
display = Display.getDisplay(this);
        };
public void startApp()
{;
props = new Form("Hello World");
props.append("Hello World!\n");
Ticker ticker=new Ticker("Ð&IExcl;Â¥Ò»Ò¹
;Ìý´ºÓê");
props.setTicker(ticker);
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
       };
public void commandAction(Command c, Displayable s)
{;
if (c == exitCommand)
{;
destroyApp(false);
  notifyDestroyed();
};
      };
public void destroyApp(boolean unconditional)
{;
       };
public void pauseApp()
{;
display.setCurrent(null);
props = null;
       };
Java手機網[www.cnjm.Net]};
ShowTicker.Java程序的運行效果如下圖所示:
獲取文本框的值
發信站: 北大未名站 (2001年10月21日00:34:19 星期天) , 站內信件
在前面的例子中,我們已經演示了如何構造J2ME程序的用戶界面。現在有一個問題,那就是
如何與用戶界面交互呢?亦即如何獲取用戶通過用戶界面輸入的值呢?請看下面的例子。
package fancy.test;
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
public class GetTextBoxValue extends MIDlet implements CommandListener
{;
private Display display;
       private TextBox txtBox;
 
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
Java手機網[www.cnjm.Net]private Command getCommand = new Command("GETVALUE", Command.OK, 1);
public GetTextBoxValue()
{;
display = Display.getDisplay(this);
        };
public void startApp()
{;
//or :
Java手機網[www.cnjm.Net]//String str="hello world";
//txtBox = new TextBox("Text Box",str,str.length(),0);
Java手機網[www.cnjm.Net]//the follow code is wrong:
//txtBox = new TextBox("Text Box",str,any number here,0);
Java手機網[www.cnjm.Net]txtBox = new TextBox("Text Box",null,200,0);
txtBox.addCommand(exitCommand);
txtBox.addCommand(getCommand);
txtBox.setCommandListener(this);
display.setCurrent(txtBox);
       };
public void valueScreen()
{;
Form props=new Form("get text box value");
props.append(txtBox.getString());
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
Java手機網[www.cnjm.Net]};
public void commandAction(Command c, Displayable s)
Java手機網[www.cnjm.Net]{;
if (c == exitCommand)
Java手機網[www.cnjm.Net]{;
destroyApp(false);
  notifyDestroyed();
};
if(c==getCommand)
{;
valueScreen();
};
       };
Java手機網[www.cnjm.Net]public void destroyApp(boolean unconditional)
{;
       };
Java手機網[www.cnjm.Net]public void pauseApp()
Java手機網[www.cnjm.Net]{;
display.setCurrent(null);
txtBox = null;
       };
};
在上面的例子中(GetTextBoxValue.Java),當我們往文本框中輸入文本,並按下退出按鈕,接
著選擇GETVALUE命令的時候,將會調用valueScreen()方法。valueScreen()方法的源代碼如下
:
public void valueScreen()
Java手機網[www.cnjm.Net]{;
Form props=new Form("get text box value");
props.append(txtBox.getString());
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
Java手機網[www.cnjm.Net]};
valueScreen()方法的邏輯是:首先創建一個容器對象Form,然後調用TextBox對象的getStr
Java手機網[www.cnjm.Net]ing()方法,獲取文本框中的輸入值,追加到容器對象中,最後將此Form對象作為屏幕的當前顯
示對象。GetTextBoxValue.Java的運行效果如下面兩圖所示:
Date對象
Java手機網[www.cnjm.Net]發信站: 北大未名站 (2001年10月21日00:35:20 星期天) , 站內信件
Date對象是屬於Java.util包的,它的作用是返回當前的時間。請看下面的代碼:
package fancy.test;
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
import Java.util.*;
Java手機網[www.cnjm.Net]public class GetDate extends MIDlet implements CommandListener
{;
private Display display;
       private Form props;
private Date date;
 
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
Java手機網[www.cnjm.Net]public GetDate()
{;
Java手機網[www.cnjm.Net]display = Display.getDisplay(this);
       };
public void startApp()
{;
props = new Form("Hello World");
props.append("Hello World!\n");
date=new Date();
Java手機網[www.cnjm.Net]props.append("Now Time:"+date.getTime()+"\n");
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
Java手機網[www.cnjm.Net]       };
public void commandAction(Command c, Displayable s)
{;
if (c == exitCommand)
{;
destroyApp(false);
Java手機網[www.cnjm.Net]  notifyDestroyed();
};
       };
public void destroyApp(boolean unconditional)
{;
       };
Java手機網[www.cnjm.Net]public void pauseApp()
{;
display.setCurrent(null);
props = null;
       };
};
GetDate.Java程序的運行效果如下圖所示:
Java手機網[www.cnjm.Net]
--
TimeZone對象
發信站: 北大未名站 (2001年10月21日00:36:16 星期天) , 站內信件
TimeZone對象也是屬於Java.util包的。這個對象的作用是提供關於時區的信息。TimeZon
e類有一個靜態方法----getDefault(),可以獲取與當前系統相關的時區對象。getAvailable
IDs()方法可以獲取系統中所有可用的時區的ID號,getID()方法可以獲取系統當前所設置的時
區。具體的例子如下所示:
package fancy.test;
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
import Java.util.*;
public class GetTimeZone extends MIDlet implements CommandListener
{;
private Display display;
       private Form props;
//private Date date;
private TimeZone zone;
 
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public GetTimeZone()
{;
display = Display.getDisplay(this);
       };
public void startApp()
{;
props = new Form("Hello World");
props.append("Hello World!\n");
//date=new Date();
//props.append("Now Time:"+date.getTime()+"\n");
zone=TimeZone.getDefault();
String []zoneid=zone.getAvailableIDs();
for(int i=0;i<zoneid.length;i++)
{;
props.append(zoneid[i]+"\n");
};
props.append("Current Time Zone:"+zone.getID()+"\n");
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
       };
public void commandAction(Command c, Displayable s)
{;
if (c == exitCommand)
Java手機網[www.cnjm.Net]{;
destroyApp(false);
  notifyDestroyed();
};
       };
public void destroyApp(boolean unconditional)
{;
       };
public void pauseApp()
{;
display.setCurrent(null);
props = null;
        };
};
GetTimeZone.Java程序的運行效果如下圖所示:

--
Calendar對象
發信站: 北大未名站 (2001年10月21日00:37:43 星期天) , 站內信件
Calendar對象歸屬於Java.util包,它可以提供更為詳盡的時間信息。具體的例子如下所示
:
package fancy.test;
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
import Java.util.*;
public class GetCalendar extends MIDlet implements CommandListener
{;
private Display display;
       private Form props;
//private Date date;
//private TimeZone zone;
//private Calendar calendar;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public GetCalendar()
{;
display = Display.getDisplay(this);
       };
public void startApp()
{;
props = new Form("Hello World");
props.append("Hello World!\n");
Calendar rightNow = Calendar.getInstance();
props.append("YEAR:"+rightNow.get(Calendar.YEAR)+"\n");
props.append("MONTH:"+rightNow.get(Calendar.MONTH)+"\n");
props.append("DAY OF MONTH:"
                  +rightNow.get(Calendar.DAY_OF_MONTH)+"\n");
props.append("HOUR OF DAY:"
                  +rightNow.get(Calendar.HOUR_OF_DAY)+"\n");
props.append("MINUTE:"
                  +rightNow.get(Calendar.MINUTE)+"\n");
props.append("SECOND:"
                  +rightNow.get(Calendar.SECOND)+"\n");
props.append("MILLISECOND:"
                  +rightNow.get(Calendar.MILLISECOND)+"\n");
//date=new Date();
//props.append("Now Time:"+date.getTime()+"\n");
//zone=TimeZone.getDefault();
//String []zoneid=zone.getAvailableIDs();
//for(int i=0;i<zoneid.length;i++)
//{;
//props.append(zoneid[i]+"\n");
//};
Java手機網[www.cnjm.Net]//props.append("Current Time Zone:"+zone.getID()+"\n");
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
       };
public void commandAction(Command c, Displayable s)
{;
if (c == exitCommand)
{;
destroyApp(false);
  notifyDestroyed();
};
       };
public void destroyApp(boolean unconditional)
{;
        };
public void pauseApp()
{;
display.setCurrent(null);
props = null;
       };
};
GetCalendar.Java程序的運行效果如下圖所示:

--
Java手機網[www.cnjm.Net]如何建立HTTP連接
發信站: 北大未名站 (2001年10月21日00:40:04 星期天) , 站內信件
Java手機網[www.cnjm.Net]在J2ME程序中,可以利用HttpConnection接口建立HTTP連接,訪問遠程服務器上的資源。具
體的代碼如下所示:
package fancy.test;
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
import Javax.microedition.io.*;
public class GetHttpConnection extends MIDlet implements CommandListener
{;
private Display display;
       private Form props;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public GetHttpConnection()
{;
display = Display.getDisplay(this);
        };
public void startApp()
{;
props = new Form("Get Http Connection");
//props.append("Hello World!\n");
try
{;
                   HttpConnection conn=(HttpConnection) Connector.open
                   ("http://rainbow:8080/index.Html");
//conn.setRequestProperty("user","fancy");
props.append("Date:"+conn.getDate()+"\n");
props.append("Expiration:"+
Java手機網[www.cnjm.Net]                           conn.getExpiration()+"\n");
props.append(conn.getHost()+"\n");
props.append("Last ModifIEd:"+
                           conn.getLastModifIEd()+"\n");
props.append("Port:"+conn.getPort()+"\n");
props.append("Protocol:"+
                           conn.getProtocol()+"\n");
props.append("Request Method:"+
                           conn.getRequestMethod()+"\n");
props.append("Response Code:"+
                           conn.getResponseCode()+"\n");
Java手機網[www.cnjm.Net]props.append("Encoding:"+
                           conn.getEncoding()+"\n");
props.append("Length:"+conn.getLength()+"\n");
props.append("Type:"+conn.getType()+"\n");
props.append("URL:"+conn.getURL()+"\n");
props.append("Response Message:"+
                            conn.getResponseMessage()+"\n");
};
Java手機網[www.cnjm.Net]catch(Exception fe)
{;
Java手機網[www.cnjm.Net]props.append("Error:"+fe.getMessage());
};
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
       };
public void commandAction(Command c, Displayable s)
{;
if (c == exitCommand)
{;
destroyApp(false);
Java手機網[www.cnjm.Net]  notifyDestroyed();
};
      };
public void destroyApp(boolean unconditional)
{;
       };
public void pauseApp()
Java手機網[www.cnjm.Net]{;
display.setCurrent(null);
Java手機網[www.cnjm.Net]props = null;
       };
};
Connector類提供了open()方法,可以和各種各樣的遠程資源建立連接。open()方法的參數
就是遠程資源的URL地址。open()方法的返回值是一個Connection接口。為了建立HTTP連接,
我們應該將它強制轉換為HttpConnection接口的形式。一旦獲取HttpConnection接口的實例
對象,就可以調用HttpConnection接口的各種方法,得到關於HTTP連接的各種信息。
使用J2ME+JavaMail發送電子郵件
Java手機網[www.cnjm.Net]發信站: 北大未名站 (2001年10月21日00:41:24 星期天) , 站內信件
 我的想法是建立一個Web服務器,使用Tomcat 4.0,支持JSP技術。再配置一個Mail服務器,
使用的軟件是Imail 7.0.4。首先編寫一個可以發送電子郵件的JSP程序(post.JSP),具體代碼
Java手機網[www.cnjm.Net]如下所示:
<%@ page import="Java.Net.*" %>
<%@ page import="Java.io.*" %>
<%@ page import="Javax.activation.*" %>
<%@ page import="Java.util.*" %>
<%@ page import="Javax.mail.*" %>
Java手機網[www.cnjm.Net]<%@ page import="Javax.mail.internet.*" %>
<%!
public class SmtpAuthenticator extends Javax.mail.Authenticator
{;
  public Javax.mail.PasswordAuthentication getPassWordAuthentication()
    {;
      return new Javax.mail.PassWordAuthentication("fancy", "fancy");
    };
};
%>
<%
String username="fancyrainbow";
String passWord="fancy";
String from="fancy@rainbow";
String to="fancy@rainbow";
String cc="fancy@rainbow";
String subject="J2ME Mail Test";
//String content="J2ME Mail Test";
String content=request.getParameter("content");
Properties props = System.getPropertIEs();
props.put("mail.smtp.auth","true");
props.put("mail.smtp.host","rainbow"); //263
SmtpAuthenticator sa=new SmtpAuthenticator();
Session sess = Session.getInstance(props, sa);
sess.setDebug(true);
Message msg = new MimeMessage(sess);
msg.setFrom(new InternetAddress(from));
msg.setRecipients(Message.RecipIEntType.TO,InternetAddress.parse(to, false));
msg.addRecipients(Message.RecipIEntType.CC,InternetAddress.parse(cc, false));
msg.setSubject(subject);
msg.setSentDate(new Date());
msg.setText(content);
Transport.send(msg);
%>
Send Message OK!
我將post.JSP程序保存在Tomcat 4.0的ROOT目錄下面,然後使用Web浏覽器測試此程序成功
。然後再將上一個J2ME程序(GetHttpConnection.Java)改一改,讓它與Tomcat 4.0服務器建立
連接,請求post.JSP程序。相關代碼如下所示:
package fancy.test;
Java手機網[www.cnjm.Net]import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
import Javax.microedition.io.*;
import Java.io.*;
public class SendMail extends MIDlet implements CommandListener
{;
Java手機網[www.cnjm.Net]private Display display;
  private Form props;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public SendMail()
{;
display = Display.getDisplay(this);
  };
public void startApp()
{;
Java手機網[www.cnjm.Net]props = new Form("Get Http Connection");
//props.append("Hello World!\n");
Java手機網[www.cnjm.Net]try
{;
HttpConnection conn=(HttpConnection)Connector.open("http://rainbow:8080/post.
JSP?content=Hello World");
//conn.setRequestProperty("user","fancy");
Java手機網[www.cnjm.Net]props.append("Date:"+conn.getDate()+"\n");
props.append("Expiration:"+conn.getExpiration()+"\n");
props.append(conn.getHost()+"\n");
props.append("Last Modified:"+conn.getLastModifIEd()+"\n");
props.append("Port:"+conn.getPort()+"\n");
props.append("Protocol:"+conn.getProtocol()+"\n");
props.append("Request Method:"+conn.getRequestMethod()+"\n");
props.append("Response Code:"+conn.getResponseCode()+"\n");
props.append("Encoding:"+conn.getEncoding()+"\n");
props.append("Length:"+conn.getLength()+"\n");
props.append("Type:"+conn.getType()+"\n");
props.append("URL:"+conn.getURL()+"\n");
props.append("Response Message:"+conn.getResponseMessage()+"\n");
//InputStream is=conn.openInputStream();
Java手機網[www.cnjm.Net]//DataInputStream dis=new DataInputStream(is);
//props.append("System Info:"+dis.readUTF()+"\n");
props.append("Send Mail OK!"+"\n");
};
catch(Exception fe)
{;
props.append("Error:"+fe.getMessage());
};
Java手機網[www.cnjm.Net]props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
       };
public void commandAction(Command c, Displayable s)
{;
if (c == exitCommand)
{;
destroyApp(false);
  notifyDestroyed();
};
       };
public void destroyApp(boolean unconditional)
{;
       };
public void pauseApp()
{;
display.setCurrent(null);
props = null;
  };
};
啟動Tomcat 4.0、Imail 7.0.4、J2MEWTK。在J2MEWTK中運行SendMail.Java程序,事後檢查
郵箱,發現已經成功的收到了郵件。
有兩點需要說明一下:
首先,按照上面的模式,我們可以編寫出功能更為強大的程序來,例如使用J2ME+JDBC+JSP訪
問遠程的數據庫系統,訪問EJB組件等等。
其次,如果要讀取post.JSP程序的輸出信息,你可以從HttpConnection接口中獲取一個輸
入流對象,逐個讀取輸入流中的數據即可。具體的代碼我就不舉了,你可以參考J2ME的DOC。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved