📄 ch03s03.html
字号:
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>3. Multi例子与对象模型</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="ch03.html" title="Chapter 3. Seaside框架"><link rel="prev" href="ch03s02.html" title="2. Counter例子与回退键处理"><link rel="next" href="ch03s04.html" title="4. 部件之间的call和answer"></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">3. Multi例子与对象模型</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s02.html">Prev</a> </td><th width="60%" align="center">Chapter 3. Seaside框架</th><td width="20%" align="right"> <a accesskey="n" href="ch03s04.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="d0e301"></a>3. Multi例子与对象模型</h2></div></div></div><p>下面我们来看另一个例子,multi,<code class="uri">http://localhost:9090/seaside/multi</code>。这个例子也很简单,它在一个页面上显示5个独立的counter。</p><div class="screenshot"><div class="mediaobject"><img src="resources/multi.png"></div></div><p>我们单击Toggle Halos链接,看看它的结构是怎样的。</p><div class="screenshot"><div class="mediaobject"><img src="resources/multi-halos.png"></div></div><p>我们看到,每一个counter就是一个WACounter对象,而整个页面则是一个WAMultiCounter对象。注意到在Seaside中,我们写的每个页面都是WAComponent的子类,即都是一个component。而任意一个component可以包含任意一个component,我们作为程序员不用做任何事情。很酷吧?</p><p>我们来看看WAMultiCounter需要做些什么才能包含其他的component。</p><div class="screenshot"><div class="mediaobject"><img src="resources/multi-browser.png"></div></div><p>和WACounter一样,WAMultiCounter也是WAComponent的子类。它有一个instance variable:counters,以及三个函数,children,initialize和renderContentOn。这些函数的代码如下:</p><pre class="programlisting">initialize counters _ (1 to: 5) collect: [:i | WACounter new]children ^ countersrenderContentOn: html counters do: [:ea | html render: ea] separatedBy: [html horizontalRule]</pre><p>相应的Java风格代码为(以下代码不符合任何语言):</p><pre class="programlisting">void initialize() { counters = new Vector(); for (int i = 1; i <= 5; i++) { counters.append(new WACounter()); }}Object children() { return counters;}void renderContentOn(Object html) { foreach (ea : counters) { html.render(ea); if (ea != counters.last()) { html.horizontalRule(); } }}</pre><p>我们看到,除了children之外WAMultiCounter的两个函数用途和WACounter的一模一样。所以我们所需做的全部工作就是实现children函数,让它返回对象本身的所有子部件,我们就能拥有一个强大的部件模型架构!</p><p>在一个页面上显示五个counter可能没有什么实际用途,所以在本章结束前,我们简要地看看一个比较真实的例子。浏览<code class="uri">http://localhost:9090/seaside/alltests</code>,您会看到下面的例子:</p><div class="screenshot"><div class="mediaobject"><img src="resources/alltests.png"></div></div><p>这个页面是由一组各自独立的部件组成的,如Input,Html,等等,每个部件是一个Seaside的小例子。您可能早就觉得这种页面很普通了,但是Seaside写这个页面的方法绝对不普通。WAAllTests类只有一段重要的代码:</p><pre class="programlisting">initialize self contents: (WASimpleNavigation new add: WAInputTest new label: 'Input'; add: WAHtmlTest new label: 'Html'; add: WAEncodingTest new label: 'Encoding'; add: WAErrorTest new label: 'Error'; add: WAExceptionTest new label: 'Exception'; add: WAClosureTest new label: 'Closure'; add: WATransactionTest new label: 'Transaction'; add: WAUploadTest new label: 'Upload'; add: (WAParentTest new parent: self) label: 'Parent'; add: WAPathTest new label: 'Path'; add: WATaskTest new label: 'Task'; add: WACookieTest new label: 'Cookies'; add: WACallbackTest new label: 'Callbacks'; add: WACanvasTest new label: 'Canvas'; add: WALiveRequestTest new label: 'Live'; add: WAImageTest new label: 'Images'; add: WAHomeTest new label: 'Home'; add: WACacheTest new label: 'Cache'; add: WADefaultFormTest new label: 'Default Form'; add: WALinkSubmitTest new label: 'Submit'; yourself)</pre><p>用类似Java的语法写出来是(以下代码不符合任何语言):</p><pre class="programlisting">public void initialize() { Object c = new WASimpleNavigation(); c.addWithLabel(new WAInputTest(), “Input”); c.addWithLabel(new WAHtmlTest(), “Html”); c.addWithLabel(new WAEncodingTest(), “Encoding”); c.addWithLabel(new WAErrorTest(), “Error”); c.addWithLabel(new WAExceptionTest(), “Exception”); c.addWithLabel(new WAClosureTest(), “Closure”); c.addWithLabel(new WATransactionTest(), “Transaction”); c.addWithLabel(new WAUploadTest(), “Upload”); Object p = new WAParentTest(); p.setParent(this); c.addWithLabel(p, “Parent”); c.addWithLabel(new WAPathTest(), “Path”); c.addWithLabel(new WATaskTest(), “Task”); c.addWithLabel(new WACookieTest(), “Cookies”); c.addWithLabel(new WACallbackTest(), “Callbacks”); c.addWithLabel(new WACanvasTest(), “Canvas”); c.addWithLabel(new WALiveRequestTest(), “Live”); c.addWithLabel(new WAImageTest(), “Images”); c.addWithLabel(new WAHomeTest(), “Home”); c.addWithLabel(new WACacheTest(), “Cache”); c.addWithLabel(new WADefaultFormTest(), “Default Form”); c.addWithLabel(new WALinkSubmitTest(), “Submit”); this.setContents(c);}</pre><p>这几乎和用Swing写本地程序一样简洁了。Seaside不愧是真正的面向对象的网络框架。</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch03s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">2. Counter例子与回退键处理 </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 4. 部件之间的call和answer</td></tr></table></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -