当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:16:00  来源:本站整理

post是什么意思[Java编程]

赞助商链接



  本文“post是什么意思[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在很多利用程序中利用GET都没有问题.但是,GET要求通过一个环境变量将自己的数据传送给CGI程序.但假定GET字串太长,有些Web服务器大概用光自己的环境空间(若字串长度超越200字符,就应开始关心这方面的问题).CGI为此供应了一个办理筹划:POST.通过POST,数据可以编码,并按与GET相同的办法连结起来.但POST操纵尺度输入将编码过后的查询字串传送给CGI程序.我们要做的全部事情就是判断查询字串的长度,而这个长度已在环境变量CONTENT_LENGTH中保存好了.一旦知道了长度,便可安闲分配存储空间,并从尺度输入中读入指定数目的字符.
对一个用来掌握POST的CGI程序,由CGITools.h供应的Pair和CGI_vector都可不加丝毫改变地利用.下面这段程序揭露了写这样的一个CGI程序有多么简单.这个例子将采取“纯”C++,所以studio.h库被iostream(IO数据流)替换.关于iostream,我们可以利用两个预先定义好的对象:cin,用于同尺度输入衔接;以及cout,用于同尺度输出衔接.有几个办法可从cin中读入数据以及向cout中写入.但下面这个程序预备采取尺度办法:用“<<”将信息发给cout,并用一个成员函数(此时是read())从cin中读入数据:

//: POSTtest.cpp
// CGI_vector works as easily with POST as it
// does with GET. Written in "pure" C++.
#include <iostream.h>
#include "CGITools.h"

void main() {
  cout << "Content-type: text/plain\n" << endl;
  // For a CGI "POST," the server puts the length
  // of the content string in the environment 
  // variable CONTENT_LENGTH:
  char* clen = getenv("CONTENT_LENGTH");
  if(clen == 0) {
    cout << "Zero CONTENT_LENGTH" << endl;
    return;
  }
  int len = atoi(clen);
  char* query_str = new char[len + 1];
  cin.read(query_str, len);
  query_str[len] = '\0';
  CGI_vector query(query_str);
  // Test: dump all names and values
  for(int i = 0; i < query.size(); i++)
    cout << "query[" << i << "].name() = [" <<
      query[i].name() << "], " <<
      "query[" << i << "].value() = [" <<
      query[i].value() << "]" << endl;
  delete query_str; // Release storage
} ///:~

getenv()函数返回指向一个字串的指针,那个字串指导着内容的长度.若指针为零,表明CONTENT_LENGTH环境变量还没有设置,所以必定某个地方出了问题.不然就必须用ANSI C库函数atoi()将字串转换成一个整数.这个长度将与new一同应用,分配充足的存储空间,以便包容查询字串(另加它的空中止符).随后为cin()调用read().read()函数需求获得指向目标缓冲区的一个指针以及要读入的字节数.随后用空字符(null)中止query_str,指出已经到达字串的末尾,这就叫作“空中止”.
到这个时刻,我们得到的查询字串与GET查询字串已经没有什么辨别,所以把它传送给用于CGI_vector的构建器.随后便和前例一样,我们可以安闲vector内差别的字段.
为测试这个程序,必须把它编译到主机Web服务器的cgi-bin目录下.然后便可以写一个简单的HTML页举行测试,就象下面这样:

<HTML>
<HEAD>
<META CONTENT="text/html">
<TITLE>A test of standard HTML POST</TITLE>
</HEAD>
Test, uses standard html POST
<Form method="POST" ACTION="/cgi-bin/POSTtest">
<P>Field1: <INPUT TYPE = "text" NAME = "Field1" 
VALUE = "" size = "40"></p>
<P>Field2: <INPUT TYPE = "text" NAME = "Field2" 
VALUE = "" size = "40"></p>
<P>Field3: <INPUT TYPE = "text" NAME = "Field3" 
VALUE = "" size = "40"></p>
<P>Field4: <INPUT TYPE = "text" NAME = "Field4" 
VALUE = "" size = "40"></p>
<P>Field5: <INPUT TYPE = "text" NAME = "Field5" 
VALUE = "" size = "40"></p>
<P>Field6: <INPUT TYPE = "text" NAME = "Field6" 
VALUE = "" size = "40"></p>
<p><input type = "submit" name = "submit" > </p>
</Form>
</HTML>

填好这个表单并提交出去今后,会得到一个简单的文本页,此中包含了解析出来的后果.从中可知道CGI程序能否在正常工作.
当然,用一个程序片来提交数据显得更风趣一些.但是,POST数据的提交属于一个差别的历程.在用通例方法调用了CGI程序今后,必须另行成立与服务器的一个衔接,以便将查询字串反馈给它.服务器随后会举行一番处理,再通过尺度输入将查询字串反馈回CGI程序.
为成立与服务器的一个直接衔接,必须获得自己成立的URL,然后调用openConnection()成立一个URLConnection.但是,由于URLConnection普通不答应我们把数据发给它,所以必须很好笑地调用setDoOutput(true)函数,同时调用的还包含setDoInput(true)以及setAllowUserInteraction(false)——注释⑥.最后,可调用getOutputStream()来成立一个OutputStream(输出数据流),并把它封装到一个DataOutputStream里,以便能按传统方法同它通信.下面列出的就是一个用于完成上述工作的程序片,必须在从它的各个字段里汇集了数据之后再履行它:

//: POSTtest.java
// An applet that sends its data via a CGI POST
import java.awt.*;
import java.applet.*;
import java.net.*;
import java.io.*;

public class POSTtest extends Applet {
  final static int SIZE = 10;
  Button submit = new Button("Submit");
  TextField[] t = new TextField[SIZE];
  String query = "";
  Label l = new Label();
  TextArea ta = new TextArea(15, 60);
  public void init() {
    Panel p = new Panel();
    p.setLayout(new GridLayout(t.length + 2, 2));
    for(int i = 0; i < t.length; i++) {
      p.add(new Label(
        "Field " + i + "  ", Label.RIGHT));
      p.add(t[i] = new TextField(30));
    }
    p.add(l);
    p.add(submit);
    add("North", p);
    add("South", ta);
  }
  public boolean action (Event evt, Object arg) {
    if(evt.target.equals(submit)) {
      query = "";
      ta.setText("");
      // Encode the query from the field data:
      for(int i = 0; i < t.length; i++)
         query += "Field" + i + "=" +
           URLEncoder.encode(
             t[i].getText().trim()) +
           "&";
      query += "submit=Submit";
      // Send the name using CGI's POST process:
      try {
        URL u = new URL(
          getDocumentBase(), "cgi-bin/POSTtest");
        URLConnection urlc = u.openConnection();
        urlc.setDoOutput(true);
        urlc.setDoInput(true);
        urlc.setAllowUserInteraction(false);
        DataOutputStream server = 
          new DataOutputStream(
            urlc.getOutputStream());
        // Send the data
        server.writeBytes(query);
        server.close();
        // Read and display the response. You
        // cannot use 
        // getAppletContext().showDocument(u);
        // to display the results as a Web page!
        DataInputStream in = 
          new DataInputStream(
            urlc.getInputStream());
        String s;
        while((s = in.readLine()) != null) {
          ta.appendText(s + "\n");
        }
        in.close();
      }
      catch (Exception e) {
        l.setText(e.toString());
      }
    }
    else return super.action(evt, arg);
    return true;
  }
} ///:~
⑥:我不得不说自己并没有真正理解这儿都发生了什么事情,这些概念都是从Elliotte Rusty Harold编著的《Java Network Programming》里得来的,该书由O'Reilly于1997年出版.他在书中提到了Java连网函数库中呈现的很多令人迷惑的Bug.所以一旦涉足这些范畴,事情就不是编写代码,然后让它自己运行那么简单.一定要鉴戒潜在的陷阱!

信息发送到服务器后,我们调用getInputStream(),并把返回值封装到一个DataInputStream里,以便自己能读取后果.要注意的一件事情是后果以文本行的情势显示在一个TextArea(文本区域)中.为什么不简单地利用getAppletContext().showDocument(u)呢?事实上,这恰是那些陷阱中的一个.上述代码可以很好地工作,但假定试图换用showDocument(),几近一切城市终止运行.也就是说,showDocument()确切可以运行,但从POSTtest得到的返回后果是“Zero CONTENT_LENGTH”(内容长度为零).所以不知道为什么缘由,showDocument()禁止了POST查询向CGI程序的传送.我很难判断这毕竟是一个在今后版本里会修复的Bug,还是由于我的理解不够(我看过的书对此讲得都很模糊).但无论在哪类情形下,只要能保持在文本区域里傍观自CGI程序返回的内容,上述程序片运行时就没有问题.
  以上是“post是什么意思[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 比一比才知道 GET vs POST
  • 办理Ubuntu 9.10安装PostgreSQL 8.4不能启动问题
  • Ubuntu 9.10下PostgreSQL 8.4忘掉密码的办理办法
  • PostgreSQL数据库远程衔接功效的开启
  • CentOS 5.5安装与配置Postfix
  • MySQL5、PostgreSQL8和Oracle10g的初步对比
  • <b>备份PostgreSQL和MySQL数据库</b>
  • post是什么意思
  • Java向Web站点发送POST哀告
  • <b>诊断Java代码: Impostor Type错误情势</b>
  • CPPWebBrowser的PostData
  • Ubuntu 10.10 Server+Nginx+Django+Postgresql安装步骤
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .