MIDP與CGI和Servlet間通訊(轉)

post0發表於2007-08-12
MIDP與CGI和Servlet間通訊(轉)[@more@]

  用無線裝置比如手機上網的時候經常需要透過表單提交一些資料,比如登入操作,通常的情況下伺服器端我們採用CGI後者Servlet來執行這些操作。

  

  CLDC作為受限裝置的基本配置通常會提供通用的連線框架給開發者連進行網路開發。另外MIDP還提供HttpConnection的介面,這個介面是javax.microedition.io的一部分,這裡面定義了最基本的HTTP連線需要的方法和常量。

  

  本文主要大概介紹一下HTTP的POST和GET操作,以及如何運用他們並舉例說明如何透過MIDlets的POST和GET操作啟用一個CGI和Servlets。本文還將包含在無線環境下用於追蹤會話的不同技術。

  

  HTTP程式設計的原理

  HTTP協議是一個請求-相應的應用協議,協議規定請求發出前各個引數必須事先設定。比如當使用者點選表單的提交按鈕後表單內填入的內容會作為請求的一部分傳送給伺服器端。

  

  請求的方法型別

  目前有兩種方法可以用來向伺服器端提交請求:GET和POST。這兩種方法決定資料如何遞交給伺服器。

  

  採用GET方式要遞交的值作為URL的一部分傳送給伺服器端,其遞交的值將成為環境變數QUERY_STRING。

  採用POST方式遞交的值作為一個輸入流傳送給伺服器端,其流的長度會放在CONTENT_LENGTH裡。

  

  相對兩種方法POST方法更安全一些,透過POST方法也可以傳輸多種資料。

  利用GET方式遞交資訊的例子

  如下是一個用GET方式遞交表單的HTML例子:

  

  action=""

  method="GET">

  Student#:

  

  表單提交給,當使用者輸入一個學號比如123333,點選Retrieve Marks按鈕後表單的資料將作為URL的一部分傳送給CGI程式。遞交的地址為。用POST方式遞交資料時輸入的數值將作為分段的輸入流傳送給伺服器。

  

  GET方式使用者輸入中帶有空格時這些空格將被(+)取代,當使用者一次要遞交多個數值時這些數值用(&)分割。

  

  Servlet程式設計原理

  

  和CGI相似,Servlets支援請求、響應的程式設計方式,當一個客戶端傳送一個請求給伺服器,伺服器將這個請求傳送給servlet。servlet組織一個響應發回給客戶端。跟CGI不同的是servlet對多次請求使用一個程式處理。

  

  當客戶端遞交了一個請求,servlet 的 service方法就被呼叫並將請求傳遞給request和response。首先servlet判斷請求是post還是get方式,並決定用HttpServlet.doGet還是HttpServlet.doPost方法來處理這個請求。這兩個方法都將呼叫HttpServletRequest和HttpServletResponse。

  

  透過MIDlet啟用CGI指令碼

  

  瞭解了基本的HTTP GET,POST和servlets之後,讓我們來看一個例子。第一個例子是用來說明如何用MIDlet透過POST方式啟用一個CGI指令碼。

  

  例子中當開啟了pgrade.cgi這個CGI的連線後跟著開啟可輸出和輸入流。輸入的內容透過output流傳送。得到的響應透過input流獲得。CGI指令碼是用PERL寫的,指令碼中獲得學號後在資料庫中查詢此學號的記錄,如果找到就返回相關的資訊給請求的客戶端。因為在MIDlet裡並沒有表單可用於提交,所以內容要透過寫流的方法實現。下面是MIDlet的程式碼。

  

  PostMidlet.java

  

  import java.io.*;

  import javax.microedition.io.*;

  import javax.microedition.lcdui.*;

  import javax.microedition.midlet.*;

  

  /**

  * An example MIDlet to invoke a CGI script

  * using the POST method.

  **/

  

  public class PostMidlet extends MIDlet {

  private Display display;

  String url = "";

  

  public PostMidlet() {

  display = Display.getDisplay(this);

  }

  

  //Initialization. Invoked the MIDlet activates.

  public void startApp() {

  try {

  getGrade(url);

  } catch (IOException e) {

  System.out.println("IOException " + e);

  e.printStackTrace();

  }

  }

  

  //Pause, discontinue ....

  public void pauseApp() { }

  

  //Destroy must cleanup everything.

  public void destroyApp(boolean unconditional) { }

  

  //Retrieve a grade.

  void getGrade(String url) throws IOException {

  HttpConnection c = null;

  InputStream is = null;

  OutputStream os = null;

  StringBuffer b = new StringBuffer();

  TextBox t = null;

  try {

  c = (HttpConnection)Connector.open(url);

  c.setRequestMethod(HttpConnection.POST);

  c.setRequestProperty("IF-Modified-Since", "20 Jan 2001 16:19:14 GMT");

  c.setRequestProperty("User-Agent", "Profile/MIDP-1.0 Configuration/CLDC-1.0");

  c.setRequestProperty("Content-Language", "en-CA");

  os = c.openOutputStream();

  

  // send request to the CGI script

  String str = "name=163748";

  byte postmsg[] = str.getBytes();

  for(int i=0; < postmsg.length;i++) {

  os.write(postmsg[i]);

  }

  os.flush();

  

  //receive response and display in a text box.

  is = c.openDataInputStream();

  int ch;

  while((ch = is.read()) != -1) {

  b.append((char) ch);

  System.out.println((char)ch);

  }

  t = new TextBox("Final Grades", b.toString(), 1024, 0);

  } finally {

  if(is!= null) {

  is.close();

  }

  if(os != null) {

  os.close();

  }

  if(c != null) {

  c.close();

  }

  }

  display.setCurrent(t);

  }

  }

  

  當你執行PostMidlet後你將看到如下的畫面

  

  用MIDlet啟用Servlet

  你可以象MIDlet啟用一個CGI一樣啟用servlet,本段將介紹兩個例子:

  

  第一個例子用GET操作啟用一個Servlet,並顯示結果。

  第二個例子是servlet接受使用者由手機POST上來的資料

  

  啟用一個Servlet

  

  下面這個例子的內容是,FirstMidletServlet被GET方法啟用並返回顯示給手機。本例中並沒有遞交資料給Servlet, Servlet被啟用後一會返回字串“Servlet Invoked”和日期給客戶端。

  

  下面是MIDlet的程式碼

  

  FirstMidletServlet.java

  

  import java.io.*;

  import javax.microedition.io.*;

  import javax.microedition.lcdui.*;

  import javax.microedition.midlet.*;

  

  /**

  * An example MIDlet to invoke a CGI script.

  */

  

  public class FirstMidletServlet extends MIDlet {

  private Display display;

  String url = "";

  

  public FirstMidletServlet() {

  display = Display.getDisplay(this);

  }

  

  //Initialization. Invoked when MIDlet activates

  public void startApp() {

  try {

  invokeServlet(url);

  } catch (IOException e) {

  System.out.println("IOException " + e);

  e.printStackTrace();

  }

  }

  

  //Pause, discontinue ....

  public void pauseApp() { }

  

  //Destroy must cleanup everything.

  public void destroyApp(boolean unconditional) { }

  

  //Prepare connection and streams then invoke servlet.

  void invokeServlet(String url) throws IOException {

  HttpConnection c = null;

  InputStream is = null;

  StringBuffer b = new StringBuffer();

  TextBox t = null;

  try {

  c = (HttpConnection)Connector.open(url);

  c.setRequestMethod(HttpConnection.GET);

  c.setRequestProperty("IF-Modified-Since", "20 Jan 2001 16:19:14 GMT");

  c.setRequestProperty("User-Agent", "Profile/MIDP-1.0 Configuration/CLDC-1.0");

  c.setRequestProperty("Content-Language", "en-CA");

  is = c.openDataInputStream();

  int ch;

  

  // receive response and display it in a textbox.

  while ((ch = is.read()) != -1) {

  b.append((char) ch);

  }

  t = new TextBox("First Servlet", b.toString(), 1024, 0);

  } finally {

  if(is!= null) {

  is.close();

  }

  if(c != null) {

  c.close();

  }

  }

  display.setCurrent(t);

  }

  }

  

  下面是返回“Servlet Invoked”和日期的HelloServlet程式碼

  HelloServlet.java

  

  import java.io.*;

  import java.util.*;

  import javax.servlet.*;

  import javax.servlet.http.*;

  

  /**

  * The simplest possible servlet.

  */

  

  public class HelloServlet extends HttpServlet {

  public void doGet(HttpServletRequest reques

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951704/,如需轉載,請註明出處,否則將追究法律責任。

相關文章