📄 ch05s03.html
字号:
<submission name="increase"/> <submission name="decrease"/> </element></site></pre><p>然后我们在counter.display模版中定义counter值以及两个链接应该显示在哪里。</p><pre class="programlisting"><!--I 'common.blueprint'/--><!--I 'common.error_messages'/--><!--BV 'window_title'-->Counter Application<!--/BV--><!--BV 'content'--> <div class="content"> <h1>Counter Application</h1> <p><!--V 'counter'/--></p> <a href="[!V ‘SUBMISSION:QUERY:increase’/]">++</a> <a href="[!V ‘SUBMISSION:QUERY:decrease’/]">--</a> </div><!--/BV--></pre><p>上面定义了一个叫counter的Value,该Value将由我们在CounterController类中指定。另外,我们看到另一种声明Value的方法,[!V/],它的结构和<!--V/-->是一样的,但是它用在HTML引号之间。Value名SUBMISSION:QUERY:xxx是有意义的,它会生成一个指向该submission的URL。Increase和decrease两个submission则是我们刚才在pub.xml里定义的。</p><p>好,现在准备工作都做好了,我们来看CounterController如何用continuation实现counter。代码如下:</p><pre class="programlisting">package counter;import com.uwyn.rife.engine.Element;import com.uwyn.rife.template.Template;public class CounterController extends Element { private int count = 0; private Template template; public void initialize() { template = getHtmlTemplate("counter.display"); } public void processElement() { while(true) { template.setValue("counter", count); print(template); pause(); if (hasSubmission("increase")) count++; if (hasSubmission("decrease")) count--; } }}</pre><p>注意到我们在initialize()里设置模版,而不是直接private Template template = getHtmlTemplate(“counter.display”)。这很重要,因为initialize()函数会在一个配制好的环境中运行。不过我们不能把count = 0放在initialize()中,否则每次页面调用时count = 0都会执行。</p><p>在processElement()函数里我们用到一个死循环。在这里我们把模版中counter这个Value定成count的值,输出模版,然后我们pause()。这时我们的程序会暂停,等待用户输入。用户输入完成后我们检查是否有submission,并进行相应的操作。保存所有文件,并浏览<code class="uri">http://localhost:8080/</code>,我们会看到下面的页面。您可以试试后退键,自己验证一下Rife对后退的处理。</p><div class="screenshot"><div class="mediaobject"><img src="resources/rife-counter.png"></div></div><p>您应该注意到了,虽然两者都使用continuation,但是Rife的做法和Seaside的略有不同。最主要的区别在于,Rife中的模版输出是我们手动调用的,而Seaside里renderContentOn方法是Seaside自动调用的。Rife用pause()的做法非常直观,但是其缺陷是无法支持Seaside的multi例子中所展示的“多流程控制”。在multi中有多个独立的流程(例子中是几个WACounter)在同时执行,每次请求时有一个流程会做出反应,但是为了生成整个页面,Seaside需要对每个WAComponent调用renderContentOn方法,而这在手动输出模版的Rife中是不可能的。</p><p>另外,Rife受到Java语言的限制,不可能生成直接调用代码的链接,而这种链接正是Seaside的卖点之一。</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch05s02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch05.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch05s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">2. 安装和启动Rife </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 4. 猜数字之Rife版</td></tr></table></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -