- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
Ruby 不仅可以编写自己的 SMTP 服务器,FTP程序,或 Web 服务器,而且还可以开发 CGI 程序
接下来,我们将花几节时间来学习 Ruby 的 CGI 开发
为了更好的了解 CGI 是如何工作的,我们可以从在网页上点击一个链接或 URL 来了解网页请求响应流程:
1、 打开浏览器访问URL并连接到HTTPweb服务器;
2、 WEB服务器接收到请求信息后会解析URL,并查找访问的文件在服务器上是否存在,如果存在返回文件的内容,否则返回错误信息;
3、 浏览器从服务器上接收信息,并显示接收的文件或者错误信息;
CGI程序可以是 Ruby 脚本,Python 脚本,PERL 脚本,SHELL 脚本,C 或者 C++ 程序等
在开发CGI 程序前,我们先要配置 WEB 服务器支持 CGI 及 CGI 的处理程序
设置好CGI目录:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
所有的HTTP 服务器执行 CGI 程序都保存在一个预先配置的目录。 这个目录被称为 CGI 目录,并按照惯例,它被命名为 /var/www/cgi-bin 目录
CGI程序的扩展名为 .cgi,Ruby 也可以使用 .rb 扩展名
默认情况下,Linux 服务器配置运行的 cgi-bin 目录中为 /var/www
如果想指定其它运行 CGI 脚本的目录,可以修改 httpd.conf 配置文件
<Directory "/var/www/cgi-bin">
AllowOverride None
Options +ExecCGI
Order allow,deny
Allow from all
</Directory>
在AddHandler 中添加 .rb 后缀,这样我们就可以访问 .rb 结尾的 Ruby 脚本文件
AddHandler cgi-script .cgi .pl .rb
一个简单的 Ruby CGI 脚本如下所示
# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: hello.cgi
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.
puts "Content-type: text/html\n\n"
puts "<html><body>Hello World</body></html>"
将以上代码保持到 hello.cgi 文件中,上传到服务器并赋予足够权限,即可作为 CGI 脚本执行
假设我们站点的地址为: http://localhost:8080/ 那么可以通过 http://localhost:8080/hello.cgi 访问 CGI 程序,输出结果为: "Hello World"
浏览器访问该网址后,Web 服务器会在站点目录下找到 hello.cgi 文件,然后通过 Ruby 解析器来解析脚本代码并访问 HTML 文档
Ruby 可以调用 CGI 库来编写更复杂的 CGI 脚本
# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: print_header.cgi
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.
require 'cgi'
cgi = CGI.new
puts cgi.header
puts "<html><body>Hello World</body></html>"
上面的代码,创建了 CGI 对象并打印头部信息
CGI程序可以通过两种方式获取表单提交的数据
例如URL: /cgi-bin/form_get.cgi?FirstName=Li&LastName=Hong
可以使用 CGI#[] 来直接获取参数 FirstName 和 LastName
# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: form_get.cgi
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.
require 'cgi'
cgi = CGI.new
cgi['FirstName'] # => ["Li"]
cgi['LastName'] # => ["Hong"]
另外一种获取表单数据的方法:
# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: form_get.cgi
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.
require 'cgi'
cgi = CGI.new
h = cgi.params # => {"FirstName"=>["Li"],"LastName"=>["Hong"]}
h['FirstName'] # => ["Li"]
h['LastName'] # => ["Hong"]
以下代码用于检索所有的表单键值:
# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: form_get.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.
require 'cgi'
cgi = CGI.new
cgi.keys # => ["FirstName", "LastName"]
如果表单包含了多个相同名称的字段,则该相同字段的值将保存在数组中
以下范例中,指定表单中三个相同的字段 "name",值分别为 "XiaoHong", "XiaoMing" 和 "XiaoZhang"
#!/usr/bin/ruby
require 'cgi'
cgi = CGI.new
cgi['name'] # => "XiaoHong"
cgi.params['name'] # => ["XiaoHong", "XiaoMing", "XiaoZhang"]
cgi.keys # => ["name"]
cgi.params # => {"name"=>["XiaoHong", "XiaoMing", "XiaoZhang"]}
注意: Ruby 会自动判断 GET 和 POST 方法,所以无需对两种方法区别对待
下面是相关的 HTML 代码
<html>
<body>
<form method="POST" action="/form_get.cgi">
<p>First Name :<input type="text" name="FirstName" value="" /></p>
<p>Last Name :<input type="text" name="LastName" value="" /></p>
<p><input type="submit" value="Submit Data" /></p>
</form>
</body>
</html>
Ruby CGI 模块包含了大量的方法来创建 HTML,每个HTML标签都有相对应的方法。
在使用这些方法前,必须通过 CGI.new 来创建 CGI 对象
为了使标签的嵌套更加的简单,这些方法将内容作为了代码块,代码块将返回字符串作为标签的内容
# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.
require "cgi"
cgi = CGI.new("html5")
cgi.out{
cgi.html{
cgi.head{ "\n"+cgi.title{"Hello World"} } +
cgi.body{ "\n"+
cgi.form{"\n"+
cgi.hr +
cgi.h1 { "A Form: " } + "\n"+
cgi.textarea("get_text") +"\n"+
cgi.br +
cgi.submit
}
}
}
}
处理URL 中的参数或者 HTML 表单数据时,需要对指定的特殊字符进行转义,如:引号("),反斜杠(/)
Ruby CGI 对象提供了 CGI.escape 和 CGI.unescape 方法来处理特殊字符
# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.
require 'cgi'
puts CGI.escape("Li XiaoMing /A Sweet & Sour Girl")
运行以上范例,输出结果如下
$ ruby main.rb
Li+XiaoMing+%2FA+Sweet+%26+Sour+Girl
另一组范例
# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.
require 'cgi'
puts CGI.escapeHTML("<h1>Li XiaoMing /A Sweet & Sour Girl</h1>")
运行以上脚本,输出结果如下
$ ruby main.rb
<h1>Li XiaoMing /A Sweet & Sour Girl</h1>
如果想知道 Ruby 中完整的 CGI 类的方法,请移步 Ruby CGI
我正在尝试打印 timeval 类型的值。实际上我可以打印它,但我收到以下警告: 该行有多个标记 格式“%ld”需要“long int”类型,但参数 2 的类型为“struct timeval” 程序
我正在编写自己的 unix 终端,但在执行命令时遇到问题: 首先,我获取用户输入并将其存储到缓冲区中,然后我将单词分开并将它们存储到我的 argv[] 数组中。IE命令是“firefox”以启动存储在
我是 CUDA 的新手。我有一个关于一个简单程序的问题,希望有人能注意到我的错误。 __global__ void ADD(float* A, float* B, float* C) { con
我有一个关于 C 语言 CGI 编程的一般性问题。 我使用嵌入式 Web 服务器来处理 Web 界面。为此,我在服务器中存储了一个 HTML 文件。在此 HTML 文件中包含 JavaScript 和
**摘要:**在代码的世界中,是存在很多艺术般的写法,这可能也是部分程序员追求编程这项事业的内在动力。 本文分享自华为云社区《【云驻共创】用4种代码中的艺术试图唤回你对编程的兴趣》,作者: break
我有一个函数,它的任务是在父对象中创建一个变量。我想要的是让函数在调用它的级别创建变量。 createVariable testFunc() [1] "test" > testFunc2() [1]
以下代码用于将多个连续的空格替换为1个空格。虽然我设法做到了,但我对花括号的使用感到困惑。 这个实际上运行良好: #include #include int main() { int ch, la
我正在尝试将文件写入磁盘,然后自动重新编译。不幸的是,某事似乎不起作用,我收到一条我还不明白的错误消息(我是 C 初学者 :-)。如果我手动编译生成的 hello.c,一切正常吗?! #include
如何将指针值传递给结构数组; 例如,在 txt 上我有这个: John Doe;xxxx@hotmail.com;214425532; 我的代码: typedef struct Person{
我尝试编写一些代码来检索 objectID,结果是 2B-06-01-04-01-82-31-01-03-01-01 . 这个值不正确吗? // Send a SysObjectId SNMP req
您好,提前感谢您的帮助, (请注意评论部分以获得更多见解:即,以下示例中的成本列已添加到此问题中;西蒙提供了一个很好的答案,但成本列本身并未出现在他的数据响应中,尽管他提供的功能与成本列一起使用) 我
我想知道是否有人能够提出一些解决非线性优化问题的软件包的方法,而非线性优化问题可以为优化解决方案提供整数变量?问题是使具有相等约束的函数最小化,该函数受某些上下边界约束的约束。 我已经在R中使用了'n
我是 R 编程的初学者,正在尝试向具有 50 列的矩阵添加一个额外的列。这个新列将是该行中前 10 个值的平均值。 randomMatrix <- generateMatrix(1,5000,100,
我在《K&R II C 编程 ANSI C》一书中读到,“>>”和“0; nwords--) sum += *buf++; sum = (sum >>
当下拉列表的选择发生变化时,我想: 1) 通过 div 在整个网站上显示一些 GUI 阻止覆盖 2)然后处理一些代码 3) 然后隐藏叠加层。 问题是,当我在事件监听器函数中编写此逻辑时,将执行 onC
我正在使用 Clojure 和 RESTEasy 设计 JAX-RS REST 服务器. 据我了解,用 Lisp 系列语言编写的应用程序比用“传统”命令式语言编写的应用程序更多地构建为“特定于领域的语
我目前正在研究一种替代出勤监控系统作为一项举措。目前,我设计的用户表单如下所示: Time Stamp Userform 它的工作原理如下: 员工将选择他/她将使用的时间戳类型:开始时间、超时、第一次
我是一名学生,试图自学编程,从在线资源和像您这样的人那里获得帮助。我在网上找到了一个练习来创建一个小程序来执行此操作: 编写一个程序,读取数字 a 和 b(长整型)并列出 a 和 b 之间有多少个数字
我正在尝试编写一个 shell 程序,给定一个参数,打印程序的名称和参数中的每个奇数词(即,不是偶数词)。但是,我没有得到预期的结果。在跟踪我的程序时,我注意到,尽管奇数词(例如,第 5 个词,5 %
只是想知道是否有任何 Java API 可以让您控制台式机/笔记本电脑外壳上的 LED? 或者,如果不可能,是否有可能? 最佳答案 如果你说的是前面的 LED 指示电源状态和 HDD 繁忙状态,恐怕没
我是一名优秀的程序员,十分优秀!