📄 ch05s04.html
字号:
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>4. 猜数字之Rife版</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.69.1"><link rel="start" href="index.html" title="Java网络程序员看Continuation"><link rel="up" href="ch05.html" title="Chapter 5. RIFE简介"><link rel="prev" href="ch05s03.html" title="3. Counter之Rife版"><link rel="next" href="pr03.html" title="后记"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">4. 猜数字之Rife版</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch05s03.html">Prev</a> </td><th width="60%" align="center">Chapter 5. RIFE简介</th><td width="20%" align="right"> <a accesskey="n" href="pr03.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e746"></a>4. 猜数字之Rife版</h2></div></div></div><p>下面我们来看看Rife里如何写猜数字游戏。有意思的是,Rife的范例程序2和范例程序3分别是猜数字游戏的非continuation版和continuation版。既然我们的题目是Java网络程序员看continuation,我们在这里就不讲解其非continuation版本了。有兴趣的读者可以自己看看如何在Rife下实现猜数字的传统做法。下面我们就来看看Rife中是如何用continuation写猜数字游戏的。</p><p>首先,我们在public.xml里定义程序需要的element。</p><pre class="programlisting"><?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE site SYSTEM "/dtd/site.dtd"><site> <arrival destid="numguess"/> <element id="numguess" implementation="numguess.Game" url="numguess"> <submission name="perform_guess"> <param name="guess"/> </submission> <exit name="SUCCESS"/> <flowlink srcexit="SUCCESS" destid="success"/> </element> <element id="success" extends="rife/template/print.xml" url="success"> <property name="name">numguess.success</property> </element> </site></pre><p>我们定义了两个部件,numguess和success。对于numguess部件,我们定义了一个出口SUCCESS,并在flowlink中把它连至success部件。Success部件的定义由rife/template/print.xml延伸而来,后者是Rife内建部件,它的功能是输出其name指定的模版。这里我们定义该模版为numguess.success。</p><p>下面是src/templates/numguess/success.html的内容,它是success部件的模版。</p><pre class="programlisting"><!--I 'common.blueprint'/--><!--BV 'window_title'-->Congratulations!<!--/BV--><!--BV 'content'--> <div class="content"> <h1>Congratulations!</h1> </div><!--/BV--></pre><p>现在我们可以浏览<code class="uri">http://localhost:8080/success</code>,看看success部件显示是否正常。</p><div class="screenshot"><div class="mediaobject"><img src="resources/numguess-rife-success.png"></div></div><p>确认success部件工作正常后,我们来实现numguess部件。下面是src/implementation/numguess/Game.java文件,我们实现了setGuess()方法用来接受perform_guess提交的guess值。游戏的逻辑都在processElement()方法中,注意到这是Rife中的特殊函数,只有它支持continuation。下面程序的逻辑方面除了pause()以外和Seaside相当类似,我们就不多加解释了。</p><pre class="programlisting">package numguess;import java.util.Random;import com.uwyn.rife.engine.Element;import com.uwyn.rife.template.Template;public class Game extends Element { private Template template; private int guess; public int getGuess() { return guess; } public void setGuess(int guess) { this.guess = guess; } public void initialize() { } public void processElement() { int answer = new Random().nextInt(101); template = getHtmlTemplate("numguess.game"); while (true) { print(template); pause(); if (guess < answer) { template.setValue("message", "Number too small."); template.setValue("window_title", "Number too small."); } else if (guess > answer) { template.setValue("message", "Number too big."); template.setValue("window_title", "Number too big."); } else { exit("SUCCESS"); } } }}</pre><p>最后一步是实现上面用到的模版numguess.game。该模版映射至文件src/templates/numguess/game.html。其内容如下:</p><pre class="programlisting"><!--I 'common.blueprint'/--><!--BV 'window_title'-->Number Guessing Game<!--/BV--><!--BV 'content'--> <div class="content"> <h1>Number Guessing Game</h1> <p><!--V 'message'--><!--/V--></p> <form action="[!V 'SUBMISSION:FORM:perform_guess'/]" method="post"> <!--V 'SUBMISSION:PARAMS:perform_guess'/--> <input type='text' name='guess' value="[!V 'PARAM:guess'][!/V]"/> <input type='submit' value="Guess"/> </form> </div><!--/BV--></pre><p>上面的模版需要稍微解释一下。[ !V ‘SUBMISSION:FORM:perform_guess’/]定义该表格会引发perform_guess这个提交动作(submission)。另外,< !--V ‘SUBMISSION :PARAMS :perform_guess’/-->语句在所有的表格中都必须存在,它会生成几个Rife内部使用的hidden field。最后,input中的[ !V ‘PARAM:guess’][!/V]表示该input提供guess参数。该值最终会以setGuess()的方式传给numguess.Game类。</p><p>好了,我们的最后一个猜数字游戏完成了。浏览<code class="uri">http://localhost:8080/numguess</code>,我们看到:</p><div class="screenshot"><div class="mediaobject"><img src="resources/numguess-rife-game.png"></div></div><p>休息一下,玩玩自己写的小游戏吧。:)</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch05s03.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="pr03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">3. Counter之Rife版 </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 后记</td></tr></table></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -