承接上篇,完成 MIDlet 主程式,整合 UI 表單與郵件發送執行緒,透過 HTTP POST 將郵件資料轉發至 Servlet 端由 JavaMail 實際發送。
public class MailClient extends MIDlet {
private MainForm mainForm;
private ContentForm contentForm;
private Display display;
private Message message;
protected void startApp() {
initMIDlet();
}
private void initMIDlet() {
new MailThread(this).start(); // 等待通知的發送執行緒
message = new Message();
display = Display.getDisplay(this);
mainForm = new MainForm(this, "Simple Mail Client");
contentForm = new ContentForm("Content", null, 150, TextField.ANY, this);
display.setCurrent(mainForm);
}
// pauseApp/destroyApp 略
// 供執行緒呼叫的 getter
public Message getMessage() { return message; }
public Display getDisplay() { return display; }
public MainForm getMainForm() { return mainForm; }
public ContentForm getContentForm() { return contentForm; }
public void displayAlert(String txt, AlertType type, Displayable d) { ... }
}
class MailThread extends Thread {
private MailClient midlet;
public MailThread(MailClient m) { midlet = m; }
public void run() {
synchronized (midlet) {
try { midlet.wait(); } catch (Exception e) { e.printStackTrace(); }
}
// 收到 notify() 後發送
HttpConnection conn = null;
DataOutputStream out = null;
try {
conn = (HttpConnection) Connector.open("https://localhost:8088/mail/maildo");
conn.setRequestMethod("POST");
out = new DataOutputStream(conn.openOutputStream());
out.writeUTF(midlet.getMessage().getTo());
out.writeUTF(midlet.getMessage().getSubject());
out.writeUTF(midlet.getMessage().getContent());
out.close(); conn.close();
System.out.println("Mail sent");
} catch (IOException e) { e.printStackTrace(); }
}
}
架構優勢:MIDlet 只負責蒐集資料與 UI,發送邏輯委託 Servlet(JavaMail),輕量、靈活、可擴充附件/加密等功能。