MIDP與CGI和Servlet間通訊(轉)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【雜談】從CGI到ServletServlet
- 深入剖析 Web 伺服器與 PHP 應用之間的通訊機制 – 掌握 CGI 和 FastCGI 協議的執行原理Web伺服器PHPAST協議
- 深入剖析 Web 伺服器與 PHP 應用之間的通訊機制 - 掌握 CGI 和 FastCGI 協議的執行原理Web伺服器PHPAST協議
- servlet 轉發與重定向Servlet
- 元件間通訊provide和inject元件IDE
- CGI與FastCGIAST
- Javascript與Python之間的程序間通訊JavaScriptPython
- CGI和FastCGIAST
- Flutter與android之間的通訊FlutterAndroid
- 在Go和Python之間通過ActiveMQ通訊GoPythonMQ
- 程序間的通訊(訊號通訊)
- Java 和 Python 之間的 Socket 通訊JavaPython
- Tcp, WebSocket 和 http 之間的通訊TCPWebHTTP
- 程序間通訊
- Linux 下的程式間通訊:套接字和訊號Linux
- 樂訊通雲通訊:物聯卡,物與物之間溝通的橋樑
- 20.2、python程式間通訊——佇列和管道Python佇列
- CGI、FastCGI、PHP-CGI和PHP-FPM 概念區分ASTPHP
- cgi和fast-cgi以及php-fpm的聯絡和區別ASTPHP
- 程式間通訊——POSIX 有名訊號量與無名訊號量
- Vue子元件與父元件之間的通訊Vue元件
- 例項詳解不同VLAN間通訊(轉發過程)
- PHP程式間通訊PHP
- 程式間通訊——LINUXLinux
- 程式間通訊(Socket)
- React 《元件間通訊》React元件
- 程式間的通訊
- 程序間通訊MPI
- Linux程式間通訊Linux
- (八)Flutter 和 Native 之間的通訊詳解Flutter
- Linux 下的程式間通訊:使用管道和訊息佇列Linux佇列
- Servlet 規範和 Servlet 容器Servlet
- [譯] React Native 與 iOS 和 Android 通訊React NativeiOSAndroid
- 微服務的服務間通訊與服務治理微服務
- 一篇看懂Android與Flutter之間的通訊AndroidFlutter
- 什麼是程式間通訊?Linux程式間通訊有幾種方式?Linux
- 程式間通訊是什麼?Linux程式間通訊有幾種方式?Linux
- 程序間通訊(4)-訊號量
- 程式間通訊--訊息佇列佇列