友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第181章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




中。  



15。6。1 CGI 数据的编码  



在这个版本中,我们将收集名字和电子函件地址,并用下述形式将其保存到文件中:  

First Last ;  

这对任何E…mail 程序来说都是一种非常方便的格式。由于只需收集两个字段,而且CGI 为字段中的编码采用 

了一种特殊的格式,所以这里没有简便的方法。如果自己动手编制一个原始的HTML 页,并加入下述代码行, 

即可正确地理解这一点:  

  

  

Name:   

Email Address:   

   

  

  

上述代码创建了两个数据输入字段(区),名为name 和 email。另外还有一个submit (提交)按钮,用于收 

集数据,并将其发给CGI 程序。Listmgr2。exe 是驻留在特殊程序目录中的一个可执行文件。在我们的Web 服 

务器上,该目录一般都叫作“cgi…bin”(注释③)。如果在那个目录里找不到该程序,结果就无法出现。填 

好这个表单,然后按下提交按钮,即可在浏览器的 URL 地址窗口里看到象下面这样的内容:  

http://myhome。/cgi…bin/Listmgr2。exe?name=First+Last&email=email@domain。&submit=Submit  

  

③:在Windows32 平台下,可利用与 Microsoft Office 97 或其他产品配套提供的 Microsoft Personal Web  

Server (微软个人Web 服务器)进行测试。这是进行试验的最好方法,因为不必正式连入网络,可在本地环 

境中完成测试(速度也非常快)。如果使用的是不同的平台,或者没有Office 97 或者FrontPage 98 那样的 

产品,可到网上找一个免费的Web 服务器供自己测试。  

  

当然,上述 URL 实际显示时是不会拆行的。从中可稍微看出如何对数据编码并传给CGI。至少有一件事情能 

够肯定——空格是不允许的(因为它通常用于分隔命令行参数)。所有必需的空格都用“+”号替代,每个字 

段都包含了字段名(具体由HTML 页决定),后面跟随一个“=”号以及正式的字段数据,最后用一个“&”结 

束。  

到这时,大家也许会对“+”,“=”以及“&”的使用产生疑惑。假如必须在字段里使用这些字符,那么该如 

何声明呢?例如,我们可能使用“John & MarshaSmith ”这个名字,其中的“&”代表“And”。事实上,它 

会编码成下面这个样子:  

John+%26+Marsha+Smith  

也就是说,特殊字符会转换成一个“%”,并在后面跟上它的十六进制ASCII 编码。  

幸运的是,Java 有一个工具来帮助我们进行这种编码。这是URLEncoder 类的一个静态方法,名为 

encode()。可用下述程序来试验这个方法:  

  

//: EncodeDemo。java  

// Demonstration of URLEncoder。encode()  

import java。*;  

  

public class EncodeDemo {  



                                                                              561 


…………………………………………………………Page 563……………………………………………………………

  public static void main(String'' args) {  

    String s = 〃〃;  

    for(int i = 0; i 《 args。length; i++)  

      s += args'i' + 〃 〃;  

    s = URLEncoder。encode(s。trim());  

    System。out。println(s);  

  }  

} ///:~  

  

该程序将获取一些命令行参数,把它们合并成一个由多个词构成的字串,各词之间用空格分隔(最后一个空 

格用String。trim()剔除了)。随后对它们进行编码,并打印出来。  

为调用一个 CGI 程序,程序片要做的全部事情就是从自己的字段或其他地方收集数据,将所有数据都编码成 

正确的URL 样式,然后汇编到单独一个字串里。每个字段名后面都加上一个“=”符号,紧跟正式数据,再紧 

跟一个“&”。为构建完整的 CGI 命令,我们将这个字串置于CGI 程序的 URL 以及一个“?”后。这是调用所 

有CGI 程序的标准方法。大家马上就会看到,用一个程序片能够很轻松地完成所有这些编码与合并。  



15。6。2 程序片  



程序片实际要比NameSender。java 简单一些。这部分是由于很容易即可发出一个 GET 请求。此外,也不必等 

候回复信息。现在有两个字段,而非一个,但大家会发现许多程序片都是熟悉的,请比较 

NameSender。java 。  

  

//: NameSender2。java  

// An applet that sends an email address  

// via a CGI GET; using Java 1。02。  

import java。awt。*;  

import java。applet。*;  

import java。*;  

import java。io。*;  

  

public class NameSender2 extends Applet {  

  final String CGIProgram = 〃Listmgr2。exe〃;  

  Button send = new Button(  

    〃Add email address to mailing list〃);  

  TextField name = new TextField(  

    〃type your name here〃; 40);  

    email = new TextField(  

    〃type your email address here〃; 40);  

  String str = new String();  

  Label l = new Label(); l2 = new Label();  

  int vcount = 0;  

  public void init() {  

    setLayout(new BorderLayout());  

    Panel p = new Panel();  

    p。setLayout(new GridLayout(3; 1));  

    p。add(name);  

    p。add(email);  

    p。add(send);  

    add(〃North〃; p);  

    Panel labels = new Panel();  

    labels。setLayout(new GridLayout(2; 1));  

    labels。add(l);  

    labels。add(l2);  



                                                                                          562 


…………………………………………………………Page 564……………………………………………………………

    add(〃Center〃; labels);  

    l。setText(〃Ready to send email address〃);  

  }  

  public boolean action (Event evt; Object arg) {  

    if(evt。target。equals(send)) {  

      l2。setText(〃〃);  

      // Check for errors in data:  

      if(name。getText()。trim()  

         。indexOf(' ') == …1) {  

        l。setText(  

          〃Please give first and last name〃);  

        l2。setText(〃〃);  

        return true;  

      }  

      str = email。getText()。trim();  

      if(str。indexOf(' ') != …1) {  

        l。setText(  

          〃Spaces not allowed in email name〃);  

        l2。setText(〃〃);  

        return true;  

      }  

      if(str。indexOf(';') != …1) {  

        l。setText(  

          〃mas not allowed in email name〃);  

        return true;  

      }  

      if(str。indexOf('@') == …1) {  

        l。setText(〃Email name must include '@'〃);  

        l2。setText(〃〃);  

        return true;  

      }  

      if(str。indexOf('@') == 0) {  

        l。setText (  

          〃Name must preceed '@' in email name〃);  

        l2。setText(〃〃);  

        return true;  

      }  

      String end =   

        str。substring(str。indexOf('@'));  

      if(end。indexOf('。') == …1) {  

        l。setText(〃Portion after '@' must 〃 +  

          〃have an extension; such as '。'〃);  

        l2。setText(〃〃);  

        return true;  

      }  

      // Build and encode the email data:  

      String emailData =   

        〃name=〃 + URLEncoder。encode(  

          name。getText()。trim()) +  

        〃&email=〃 + URLEncoder。encode(  

          email。getText()。trim()。toLowerCase()) +  

        〃&submit=Submit〃;  



                                                                                           563 


…………………………………………………………Page 565……………………………………………………………

      // Send the name using CGI's GET process:  

      try {  

        l。setText(〃Sending。。。〃);  

        URL u = new URL(  

          getDocumentBase(); 〃cgi…bin/〃 +  

          CGIProgram + 〃?〃 + emailData);  

        l。setText(〃Sent: 〃 + email。getText());  

        send。setLabel(〃Re…send〃);  

        l2。setText(  

          〃Waiting for reply 〃 + ++vcount);  

        DataInputStream server =  

          new DataInputStream(u。openStream ());  

        String line;  

        while((line = server。readLine()) != null)  

          l2。setText(line);  

      } catch(MalformedURLException e) {  

        l。setText(〃Bad URl〃);  

      } catch(IOException e) {  

        l。setText(〃IO Exception〃);  

      }   

    }  

    else return super。action(evt; arg);  

    return true;  

  }  

} ///:~  

  

CGI 程序(不久即可看到)的名字是Listmgr2。exe。许多Web 服务器都在Unix 机器上运行(Linux 也越来越 

受到青睐)。根据传统,它们一般不为自己的可执行程序采用。exe 扩展名。但在Unix 操作系统中,可以把 

自己的程序称呼为自己希望的任何东西。若使用的是。exe 扩展名,程序毋需任何修改即可通过 Unix 和Win32 

的运行测试。  

和往常一样,程序片设置了自己的用户界面(这次是两个输入字段,不是一个)。唯一显著的区别是在 

action()方法内产生的。该方法的作用是对按钮按下事件进行控制。名字检查过以后,大家会发现下述代码 

行:  

  

      String emailData =   

        〃name=〃 + URLEncoder。encode(  

          name。getText()。trim()) +  

        〃&email=〃 + URLE
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!