0
      print $q->textfield(
            -name => 'UserName',
            -value =>'JACOB',
            -size  => 30,
            -maxlength =>50,
          ); 
     my $User =$q->param('UserName');

此代码不会从文本字段中读取值。这有什么问题?

4

1 回答 1

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 的用途。

于 2013-09-05T12:10:20.550 回答