【发布时间】:2014-03-28 08:13:44
【问题描述】:
我正在查看CGI::Application 的基本示例,但是当我尝试添加第三种模式时,查询对象似乎拒绝使用我提供的值。
webapp.cgi:
#!/usr/bin/perl
use webapp;
my $webapp = WebApp->new();
$webapp->run();
webapp.pm:
package WebApp;
use base 'CGI::Application';
sub setup {
my $self = shift;
$self->start_mode('mode1');
$self->mode_param('rm');
$self->run_modes(
'mode1' => 'do_stuff',
'mode2' => 'do_more_stuff',
'mode3' => 'do_something_else'
);
}
sub do_stuff {
my $self = shift;
my $q = $self->query();
my $output = '';
$output .= $q->start_html(-title => 'Widget Search Form');
$output .= $q->start_form();
$output .= $q->textfield(-name => 'widgetcode');
$output .= $q->hidden(-name => 'rm', -value => 'mode2');
$output .= $q->submit();
$output .= $q->end_form();
$output .= $q->end_html();
return $output;
}
sub do_more_stuff {
my $self = shift;
my $q = $self->query();
my $widgetcode = $q->param("widgetcode");
my $output = '';
$output .= $q->start_html(-title => 'List of Matching Widgets');
$output .= $q->start_form();
$output .= $q->textfield(-name => 'widgetcode');
$output .= $q->hidden(-name => 'rm', -value => 'mode3');
# ^^^^^^
# this value is being ignored
$output .= $q->submit();
$output .= $q->end_form();
$output .= $q->end_html();
return $output;
}
sub do_something_else {
my $self = shift;
my $q = $self->query();
my $widgetcode = $q->param("widgetcode");
my $output = '';
$output .= $q->start_html(-title => 'Widgets details');
$output .= $q->start_form();
$output .= $q->textfield(-name => 'widgetcode');
$output .= $q->hidden(-name => 'rm', -value => 'mode4');
$output .= $q->submit();
$output .= $q->end_form();
$output .= $q->end_html();
return $output;
}
1;
所以加载第一页(模式1)工作正常,它给了我表单,我可以提交它并到达第二页(模式2),但我无法到达模式3,因为rm参数正在设置为“mode2”,尽管正如您在上面看到的那样,我将其设置为“mode3”。这意味着我再次被送回模式 2。我可以将rm 更改为rm2 或其他内容,然后获取正确的值,但这显然没有帮助,因为rm 变量是用于设置模式的。
我没有使用 CGI.pm(它提供 query 对象)的经验,正如您所知,我才刚刚开始学习 CGI::Application,所以我不知道发生了什么或者如何解决这个问题。
【问题讨论】:
-
请注意,模块的包和文件名必须在 Linux 机器上相同,并且在 Windows 上遵循该约定也是如此。所以文件应该是
WebApp.pm,包应该是WebApp,你应该是use WebApp,并用my $webapp = WebApp->new创建一个新对象 -
嗨 Borodin,这个 is 在 linux 机器上,是的,我知道惯例,我只是碰巧在意识到我没有大写之前保存了它一样的方法。由于它有效,而且只是为了测试示例代码,我并没有真正打扰。无论如何感谢您的提醒。