print $q->textfield(
-name => 'UserName',
-value =>'JACOB',
-size => 30,
-maxlength =>50,
);
my $User =$q->param('UserName');
此代码不会从文本字段中读取值。这有什么问题?
问题在于您对 CGI 的理解,以及您构建 Web 应用程序的方式。
在其最简单的形式中,使用 CGI 模块可以为您提取的一些参数(通常是 GET 查询字符串或一些 POST 数据)调用 CGI 脚本。完成后,您可以打印对该请求的一些响应。
一个更复杂的表单从 HTTP 方法和/或可用参数中计算出来,如果它已经被自己调用,或者如果用户之前不在那里。在这种情况下,通常会打印出一张空白表格。当用户将该表单提交回脚本时,脚本可以从查询中提取想要的数据:
用户:嘿,接受这个请求:
GET /script.pl
Script1:哦,没有参数☹……好的,请收下这个:
Content-type: text/html <form action="/script.pl" method="post"> <input name="foo" type="text"/> <input name="age" type="text"/> <button type="submit>Submit</button> </form>
用户:好的,让我填写表格:
POST /script.pl foo=Foofle+Barbar&age=42
Script2:哦,太好了,你给了我
foo
参数。让我回应:Content-type: text/html <p>Great, your name is <i>Foofle Barbar</i>! You are 42 years old!</p>
HTTP,以及扩展的 CGI,是无状态的——你必须在每个请求中携带所有重要信息。此外,每次调用您的 CGI 脚本时,您都会获得该脚本的一个新实例(除非您使用某些技术)。
因此,您可能应该编写如下代码
if (my $User = $q->param('UserName')) {
print "hello, $User!\n";
} else {
print $q->textfield( ... );
}
甚至更好:
if ($q->request_method() eq 'POST')
print "hello, ", $q->param('UserName'), "!\n";
else {
print $q->textfield( ... );
}
一种常见的技术是包含与每个请求一起传输的隐藏字段。这可用于确定脚本的状态。但这确实是 Cookie 的用途。