print $q->textfield(
-name => 'UserName',
-value =>'JACOB',
-size => 30,
-maxlength =>50,
);
my $User =$q->param('UserName');
此代码不读取文本字段中的值。 这有什么问题?
答案 0 :(得分:2)
问题在于您对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的用途。