名扬数据:说说Servlet和CGI之间的通讯

比如登录操作,用无线设备比如手机上网的时候经常需要通过表单提交一些数据。通常的情况下服务器端我采用Servlet和CGI来执行这些操作。这个接口是javax.microedition.io一部分,CLDC作为受限设备的基本配置通常会提供通用的连接框架给开发者连进行网络开发。另外MIDP还提供HttpConnect接口。这里面定义了最基本的HTTP连接需要的方法和常量。

目前有两种方法可以用来向服务器端提交请求:GET和POST这两种方法决定数据如何递交给服务器。

其递交的值将成为环境变量QUERY_SPING采用GET方式要递交的值作为URL一局部发送给服务器端。

其流的长度会放在CONTENT_LENGTH里。采用POST方式递交的值作为一个输入流发送给服务器端。

通过POST方法也可以传输多种数据。相对两种方法POST方法更安全一些。

协议规定请求发出前各个参数必需事先设置。比如当用户点击表单的提交按钮后表单内填入的内容会作为请求的一局部发送给服务器端。HTTP协议是一个请求-相应的应用协议。

利用GET方式递交信息的例子

如下是一个用GET方式递交表单的HTML例子:

action="http://www.somesite.com/cgi-bin/getgrade.cgi"

method="GET">

Student#:

表单提交给http://www.somesite.com/cgi-bin/getgrade.cgi当用户输入一个学号比如123333点击 RetrievMark按钮后表单的数据将作为URL一局部发送给CGI顺序。递交的地址为http://www.somesite.com/cgi-bin/gergrade.cgi?idnum=123333用POST方式递交数据时输入的数值将作为分段的输入流发送给服务器。

当用户一主要递交多个数值时这些数值用(&分割。GET方式用户输入中带有空格时这些空格将被(+取代。

通过MIDlet激活CGI脚本

让我来看一个例子。第一个例子是用来说明如何用MIDlet通过POST方式激活一个CGI脚本。解了基本的HTTPGET,POST和Servlet之后。

如果找到就返回相关的信息给请求的客户端。因为在MIDlet里并没有表单可用于提交,例子中当打开了pgrade.cgi这个CGI连接后跟着打开可输出和输入流。输入的内容通过output流发送。得到响应通过input流获得。CGI脚本是用PERL写的脚本中获得学号后在数据库中查找此学号的记录。所以内容要通过写流的方法实现。下面是MIDlet代码。

importjava.io.*; 

importjavax.microedition.io.*; 

importjavax.microedition.lcdui.*; 

importjavax.microedition.midlet.*; 

 

/** 

*AnexamplMIDlettoinvokaCGIscript 

*usthePOSTmethod. 

**/ 

 

publicclassPostMidletextendMIDlet{ 

privatDisplaidisplay; 

Stringurl="http://somesite.com/cgi-bin/pgrade.cgi"; 

 

publicPostMidlet{ 

displai=Display.getDisplaithi; 

 

//Initialization.InvoketheMIDletactivates. 

publicvoidstartA pp{ 

try{ 

getGradurl; 

}catchIOExceptione{ 

System.out.println"IOException"+e; 

e.printStackTrac; 

 

discontinu.... //Pause.

publicvoidpauseA pp{} 

 

//Destroimustcleanupeverything. 

publicvoiddestroyA ppbooleanuncondit{} 

 

//Retrievagrade. 

voidgetGradStringurlthrowIOException{ 

HttpConnectc=null; 

InputStreamis=null; 

OutputStreamos=null; 

StringBuffb=newStringBuff; 

TextBoxt=null; 

try{ 

c=HttpConnectConnector.openurl; 

c.setRequestMethodHttpConnection.POST; 

"20Jan200116:19:14GMT"; c.setRequestProperti"IF-Modified-Since".

"Profile/MIDP-1.0Configuration/CLDC-1.0"; c.setRequestProperti"User-A gent".

"en-CA "; c.setRequestProperti"Content-Language".

o=c.openOutputStream; 

 

//sendrequesttotheCGIscript 

Stringstr="name=163748"; 

bytepostmsg[]=str.getByt; 

forinti=0;<postmsg.length;i++{ 

os.writpostmsg[i]; 

os.flush; 

 

//receivresponsanddisplaiinatextbox. 

i=c.openDataInputStream; 

intch; 

whilech=is.read!=-1{ 

b.appendcharch; 

System.out.printlncharch; 

b.toStr,t=newTextBox"FinalGrades".1024,0; 

}final{ 

ifis!=null{ 

is.clos; 

ifos!=null{ 

os.clos; 

ifc!=null{ 

c.close; 

display.setCurrt; 

Servlet编程原理

Servlet支持请求、响应的编程方式,Servlet和CGI相似。当一个客户端发送一个请求给服务器,服务器将这个请求发送给ServletServlet组织一个响应发回给客户端。Servlet和CGI不同的Servlet对多次请求使用一个进程处理。

Servletservic方法就被调用并将请求传送给request和respons首先Servlet判断请求是post还是get方式,当客户端递交了一个请求。并决定用HttpServlet.doGet还是HttpServlet.doPost方法来处置这个请求。这两个方法都将调用HttpServletRequest和HttpServletRespons