📄 building_view.html
字号:
<p>
在任何情况下,字段标签都必须内置在<code>form</code>标签中,这样这些字段才知道用哪个bean来得到初始值。
</p>
</blockquote></td></tr></table><a name="presentation_tags"></a><table width="100%" cellpadding="5" cellspacing="5" border="0"><tr><td bgcolor="#023264"><font size="+1" face="arial,helvetica,sanserif" color="#ffffff"><strong>3.3.3 其它有用的表示层标签</strong></font></td></tr><tr><td><blockquote>
<p>
有好几个有用的tag用来创建表示层,请查阅它们的标签库的文档和Tag Develipers Guide得到更多的信息:
</p>
<ul>
<li>[逻辑] <a href="../struts-logic.html#iterate">iterate 枚举</a> 为一个列表中的所有元素重复输出标签。(这个列表可能是 Enumeration,Hashtable, Vector, 或者对象数组)。</li>
<li>[逻辑] <a href="../struts-logic.html#present">present 存在</a> 根据一个指定的属性,这个tag在当前的request中检查,如果这个属性存在的话就显示它所包含的页面内容。每次使用这个标签的时候只能指定一个属性,名字是必需的。属性可以包括cookie, header,name,parameter,property,role,scopr还有user。
</li>
<li>[逻辑] <a href="../struts-logic.html#notPresent">notPresent 不存在</a> 和present作用相反的标签,当指定的属性不存在的时候显示。</li>
<li>[html] <a href="../struts-html.html#link">link 连接</a> 创建一个 <a> HTML元素,作为一个锚点或者指向指定URL的超链接,它会自动进行URL编码,以在不支持cookie的时候维护session状态。</li>
<li>[html] <a href="../struts-html.html#img">img 图像</a> 创建一个 <img> HTML元素,它可以动态改变"src"和"lowurl"中指定的URL,和<html:link>的方式相同。
</li>
<li>[bean] <a href="../struts-bean.html#parameter">parameter 参数</a> 获取特定的request 参数的值,把结果作为一个page范围的属性,类型是字符串或者字符串数组。</li>
</ul>
</blockquote></td></tr></table><a name="form_validation"></a><table width="100%" cellpadding="5" cellspacing="5" border="0"><tr><td bgcolor="#023264"><font size="+1" face="arial,helvetica,sanserif" color="#ffffff"><strong>3.3.4 自动form检查</strong></font></td></tr><tr><td><blockquote>
<p>
除了上文提到的form和bean之间的交互之外,Struts还提供了附加的机制来检查它接收到的输入字段。要使用这个特性,在你的ActionForm中重载下面的这个类:
</p>
<pre>public ActionErrors
validate(ActionMapping mapping,
HttpServletRequest request);
</pre>
<p>
validate() 方法在bean的属性被自动填充之后,在对应的Action类的<code>porform()</code>方法调用之前由controller servlet自动调用。<code>validate()</code>方法有下面几个选择:
</p>
<ul>
<li>进行了恰当的检查,没有发现任何问题——返回<code>null</code>或者长度为零的ActionError实例,Controller servlet会继续调用对应的<code>Action</code>类的<code>的perform()</code>方法。</li>
<li>进行了恰当的检查,发现了问题。——返回一个包含<code>ActionError</code>的ActionErrors实例,它包含了应该显示错误信息的关键字(位于程序的<code>MessageResources</code> 信息资源库中的关键字)。controller servlet会把这个数组保存为request的属性,以便<code><html:errors></code>标签使用,并且流程会重新转回到输入form(通过<code>ActionMapping</code>的<code>input</code>属性得到)。</li>
</ul>
<p>
前面曾经提到过,这个特性完全是可选的。默认的validate()方法返回<code>null</code>,controller servelt会认为对应的Action类会做必要的检查。
</p>
<p>
另一个常用的方式是在ActionForm的validate()方法中进行简单的主要的检查,在Action里面做“商业逻辑”检查。
</p>
<p>
在夜间编译包和下列地址还有一个可选的ActionForm检查的包可以使用:<a href="http://home.earthlink.net/~dwinterfeldt/">David Winterfeldt的网站</a>。
</p>
</blockquote></td></tr></table><a name="other_presentations"></a><table width="100%" cellpadding="5" cellspacing="5" border="0"><tr><td bgcolor="#023264"><font size="+1" face="arial,helvetica,sanserif" color="#ffffff"><strong>3.4 其他表示层技术</strong></font></td></tr><tr><td><blockquote>
<p>
虽然你的程序的观感可以完全用标准的JSP和Struts的自定义标签库创建,你也许会考虑动用其他技术来增加部件重用,减少维护工作,并且/或者减少错误。下面几节讨论了几种可选项。
</p>
</blockquote></td></tr></table><a name="custom_tags"></a><table width="100%" cellpadding="5" cellspacing="5" border="0"><tr><td bgcolor="#023264"><font size="+1" face="arial,helvetica,sanserif" color="#ffffff"><strong>3.4.1
针对程序的自定义标签</strong></font></td></tr><tr><td><blockquote>
<p>
除了Struts定义的自定义标签,你针对你正在编写的程序创建标签也很容易,这会帮助你编写用户界面。通过针对下面的程序编写tag,Struts附带的示例程序描绘了基本原理:
</p>
<ul>
<li><b>checkLogon</b> - 检察是否存在一个特定的session对象,并且如果没有的话就转向到登录页面。这可以防止用户在使用你的程序到一半的时候,把页面用书签记录下来,试图以后跳过登录这一步。或者防止session失效。</li>
<li><b>linkSubscription</b> - 生成一个指向明细页面的超连接,它传递需要的主键的值作为request属性。这在列出用户拥有的订阅纪录时有用,它提供了编辑或者删除订阅信息的链接。</li>
<li><b>linkUser</b> - 生成一个指向用户详细信息页面的超链接,把需要的主键信息作为request属性传递。</li>
</ul>
<p>
这些tag的源代码都在<code>src/example</code>目录下,位于<code>org.apache.struts.example</code>包中,和其它在程序中需要的java类在一起。
</p>
</blockquote></td></tr></table><a name="includes"></a><table width="100%" cellpadding="5" cellspacing="5" border="0"><tr><td bgcolor="#023264"><font size="+1" face="arial,helvetica,sanserif" color="#ffffff"><strong>3.4.2 用Include(引用)来组合页面</strong></font></td></tr><tr><td><blockquote>
<p>
用一个JSP页面(包括子定义标签和Bean来取得必要的动态数据)在生成整个表现是一个很普通的方式,在Struts的示例程序中也出现过。然而,很多程序需要在同一个页面中显示多个不同的单一逻辑部分的组合。
</p>
<p>
举例,一个门户站点可能在门户的主页上有以下几个功能部分:
</p>
<ul>
<li>显示门户的搜索引擎</li>
<li>一个或多个"新闻"显示部分,根据用户登记的个性文件中的兴趣组合。</li>
<li>显示关于这个门户的讨论主题</li>
<li>一个“有邮件在等待”提示,如果你的门户提供免费邮件账户。</li>
</ul>
<p>
如果你能把工作分成不同的部分,为每个部分分配不同的开发者,开发工作会容易些。那么你需要用JavaServer Pages技术中的<i>include(包含)</i>能力,或者Struts提供的include 标签来把不同的页面结果组合到一起去。取决于你需要在什么时候组合你的输出,有三种不同的<i>include</i>可供选择:
</p>
<ul>
<li>一个 <code><%@ include file="xxxxx" %></code>指令可以包含一个包括Java代码或者JSP标记的页面。其中的代码甚至可以访问父页面之前定义的变量。在JavaServer Page编译之前,这段代码已经被包含了,所以它可以包含的不只是HTML代码。</li>
<li> include <i>action(动作,这里指JSP中的标准指令)</i>(<code><jsp:include page="xxxxx"
flush="true" /></code>)在请求时被处理,服务器会透明的处理它。除此以外,这意味着你通过在一个类似<a href="../struts-logic.html#equals">equals</a>这样使用参数的标签中编写这条请求,可以有条件的进行包含。</li>
<li><a href="../struts-bean.html#include">bean:include</a>读取一个"forward"参数通过一个逻辑名字映射到一个被包含的jsp页面,或者读取"id"参数,打印一个页面上下文的字符串变量到jsp页面上。</li>
</ul>
<p>
另一个方法是使用Struts Template Tag library(模版标签库)。察看Developer's Guide得到详细信息。
</p>
<p>
Tiles是一个原来的Template Tag library的替代品,提供几处增强和新功能。Tiles位于夜间编译包,或者在<a href="http://www.lifl.fr/~dumoulin/tiles/">Cedric Dumoulin的网站</a>。
</p>
</blockquote></td></tr></table><a name="image_rendering"></a><table width="100%" cellpadding="5" cellspacing="5" border="0"><tr><td bgcolor="#023264"><font size="+1" face="arial,helvetica,sanserif" color="#ffffff"><strong>3.4.3 图像生成部件</strong></font></td></tr><tr><td><blockquote>
<p>
有一些程序需要动态生成图像,比如价格图或者股票报告等等。一般有两种不同的方法满足这个需求:
</p>
<ul>
<li>显示一个指向servlet请求的超链接。这个servlet会使用一个图像库来渲染出图像,把输出改为合适的内容类型(比如<code>image/gif</code>),并送出图像的字节流到浏览器。浏览器会像一个静态图像一样显示它。</li>
<li>生成必要的HTML代码来下载一个Java applet来创建需要的图像。通过在生成的代码中传送初始化参数,你可以决定图像。或者applet也可以自行和server连结以取得这些参数。</li>
</ul>
</blockquote></td></tr></table><a name="text_rendering"></a><table width="100%" cellpadding="5" cellspacing="5" border="0"><tr><td bgcolor="#023264"><font size="+1" face="arial,helvetica,sanserif" color="#ffffff"><strong>3.4.4 生成文字</strong></font></td></tr><tr><td><blockquote>
<p>
有些程序需要动态生成文本或者打包的文本,例如XML.如果整个页面都是被生成的,可以用PrintWriter输出,从Action里可以很容易的办到:
</p>
<pre>
response.setContentType("text/plain"); // or text/xml
PrintWriter writer = response.getWriter();
// use writer to render text
return(null);
</pre>
<p align="center">
下一章: <a href="building_controller.html">构造 Controller (控制器)部件</a>
</p>
</blockquote></td></tr></table>
</body></td></tr><tr><td colspan="2"><hr></td></tr><tr><td colspan="2"><div align="center"><font size="-1" color="#023264"><em>
Copyright (c) 2000-2002, Apache Software Foundation
</em></font></div><img border="0" align="right" src="../images/struts-power.gif"></td></tr></table></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -