實現功能:
用手機用戶端進行登入伺服器,然後返回訊息進行互動.
伺服器代碼:
LoginServlet:
package com;import java.io.ByteArrayOutputStream;import java.io.DataOutputStream;import java.io.IOException;import java.io.OutputStream;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/******************************************************************************* * * @author zdw * */@SuppressWarnings("serial")public class LoginServlet extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 得到用戶端傳入的資料(使用者名稱和密碼) String username = request.getParameter("username"); String password = request.getParameter("password"); // 構建輸出資料流 ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); // 邏輯操作(這裡寫你的邏輯判斷) if ("zdw".equals(username) && "admin".equals(password)) { // 響應資料 dos.writeUTF("true"); } else { // 響應資料 dos.writeUTF("false"); } // byte[] data = baos.toByteArray(); // 設定伺服器響應參數 response.setStatus(HttpServletResponse.SC_OK); response.setContentLength(data.length); response.setContentType("application/octet-stream"); OutputStream os = response.getOutputStream(); os.write(data); os.close(); }}
手機用戶端代碼:
LoginForm:
package com;import java.io.DataInputStream;import java.io.IOException;import java.io.OutputStream;import javax.microedition.io.Connector;import javax.microedition.io.HttpConnection;import javax.microedition.lcdui.Alert;import javax.microedition.lcdui.AlertType;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.TextField;import javax.microedition.midlet.MIDlet;import javax.microedition.midlet.MIDletStateChangeException;/** * 用Http方式與伺服器互動 * * @author zdw * */public class LoginForm extends MIDlet implements CommandListener{ private Form form = null; private Display display = Display.getDisplay(this);; private Command login = null; private Command exit = null; private TextField username = null; private TextField password = null; private Alert alert = null; private Alert error = null; public LoginForm() { form = new Form("使用者登入"); display.setCurrent(form); login = new Command("登入", Command.SCREEN, 1); exit = new Command("退出", Command.EXIT, 1); form.addCommand(login); form.addCommand(exit); username = new TextField("使用者名稱", "", 20, TextField.ANY); password = new TextField("密碼", "", 20, TextField.PASSWORD); form.append(username); form.append(password); form.setCommandListener(this); } public void initAlertOK() { alert = new Alert("提示", "登入成功!!\r\n您的使用者名稱為:" + username.getString() + "\r\n密碼為:" + password.getString(), null, AlertType.INFO); alert.setTimeout(Alert.FOREVER); display.setCurrent(alert); } public void initAlertError() { error = new Alert("提示", "登入失敗,使用者名稱或密碼錯誤", null, AlertType.ERROR); display.setCurrent(error); } protected void startApp() throws MIDletStateChangeException { } /** * 事件處理 */ public void commandAction(Command cmd, Displayable dis) { // 點擊退出按鈕事件 if (cmd.getCommandType() == Command.EXIT) { System.out.println("exit"); this.notifyDestroyed(); } if (cmd == login) { // 必須開啟獨立線程來處理Http請求,否則會造成死結 new Thread(new Runnable() { public void run() { try { inTurnServer(); } catch (Exception e) { e.printStackTrace(); } } }).start(); } } /*************************************************************************** * 與伺服器互動相關代碼 */ public void inTurnServer() { try { // 伺服器請求地址 String url = "http://localhost:8888/LoginWeb/LoginServlet"; // 使用者輸入的使用者名稱 String username = this.username.getString(); // 使用者輸入的密碼 String password = this.password.getString(); // 用url建立一個Http串連(安全的) HttpConnection conn = (HttpConnection) Connector.open(url); // 佈建要求類型為POST conn.setRequestMethod(HttpConnection.POST); // 設定一般的請求屬性 conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("User-Agent", "Profile/MIDP-1.0 Configuration/CLDC-1.0"); conn.setRequestProperty("Content-Language", "en-US"); conn.setRequestProperty("Accept", "application/octet-stream"); conn.setRequestProperty("Connection", "close"); // 要發送的資料 String formData = "username=" + username + "&password=" + password; // 轉換顯位元組流 byte[] data = formData.getBytes(); // 設定寫入流的長度 conn.setRequestProperty("Content-Length", Integer .toString(data.length)); OutputStream os = conn.openOutputStream(); os.write(data); os.close(); // 得到Http響應代碼 int rc = conn.getResponseCode(); // 正常響應 if (rc == HttpConnection.HTTP_OK) { // 構建輸入資料流 DataInputStream dism = new DataInputStream(conn .openInputStream()); // 讀取伺服器返回的位元組流 String result = dism.readUTF(); dism.close(); // 判斷 if (result.equals("true")) { // 顯示登入成功 this.initAlertOK(); } if (result.equals("false")) { // 顯示登入失敗 this.initAlertError(); // 將輸入框置空 this.username.delete(0, this.username.getString().length()); this.password.delete(0, this.password.getString().length()); } } } catch (IOException e) { e.printStackTrace(); } } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { } protected void pauseApp() { }}
原始碼下載
注意此工程為MyEclipse工程,您需要安裝wtk和tomcat才能正常運行此程式.