📄 building_view.html
字号:
<html><head><META http-equiv="Content-Type" content="text/html; charset=GB2312"><meta content="Craig R. McClanahan" name="author"><meta content="Xiaogang Cao" name="translator">
<title>Struts 用户指南 - 构造 View(视图) 部件</title></head><body vlink="#023264" alink="#023264" link="#023264" text="#000000" bgcolor="#ffffff"><table cellspacing="5" width="100%" border="0"><tr><td colspan="2"><a href="http://jakarta.apache.org"><img border="0" align="left" src="../images/jakarta-logo.gif"></a><img border="0" align="right" src="../images/struts.gif"></td></tr><tr><td colspan="2"><hr></td></tr><tr><td valign="top" width="120">
<title>Struts 用户指南</title>
<table cellspacing="5" border="0"><tr><th align="left" colspan="2"><font color="#023264"><strong>快速连接</strong></font></th></tr>
<tr><td width="15" align="center"></td><td><font size="-1"><a href="../index.html">Home</a></font></td></tr>
<tr><td width="15" align="center"></td><td><font size="-1"><a href="index.html">目录</a></font></td></tr>
<tr><td width="15" align="center"></td><td><font size="-1"><a href="introduction.html">简介</a></font></td></tr>
<tr><td width="15" align="center"></td><td><font size="-1"><a href="building_model.html">Model 部件</a></font></td></tr>
<tr><td width="15" align="center"></td><td><font size="-1"><a href="building_view.html">View 部件</a></font></td></tr>
<tr><td width="15" align="center"></td><td><font size="-1"><a href="building_controller.html">Controller 部件</a></font></td></tr>
<tr><td width="15" align="center"></td><td><font size="-1"><a href="resources.html">资源</a></font></td></tr>
<tr><td width="15" align="center"></td><td><font size="-1"><a href="volunteers.html">我们是谁</a></font></td></tr>
</table>
</td><td valign="top"><body>
<a name="building_view"></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. 构造 View (视图)部件</strong></font></td></tr></table><a name="overview"></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.1 纵览</strong></font></td></tr><tr><td><blockquote>
<p>
这一章关注构造程序的View(视图)部件的任务,主要是由JavaServer Pages(JSP)技术完成的。特别的,Struts提供对编写国际化程序的支持,同时也支持和(用户)输入的Form交互。其他几个和View(视图)有关的主题也会被简要的涉及。
</p>
</blockquote></td></tr></table><a name="i18n"></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.2 Internationalized Messages</strong></font></td></tr><tr><td><blockquote>
<p>
几年前,程序开发者们只期望支持他们自己国家的国民,只使用一种(有时候是两种)语言,也只有一种表达日期,数字,钱币的格式。然而,基于Web技术的,在internet和其他一些可以被广泛访问的网络上的程序开发有了爆炸性的增长,让国界问题浮现在我们的眼中。这个问题被理解为对于支持<i>国际化</i>(经常被称为i18n,因为在"国际化"一词internationalization中i和n之间有18个字母)和<i>本地化</i>程序的需要。
</p>
<p>
Struts 在Java平台上编写,可以辅助支持编写国际化和本地化的程序。需要熟悉的概念有:
</p>
<ul>
<li><b>Locale (国籍,地区)</b> - 支持国际化的最基本的Java类是<code>java.util.Locale</code>。每一个<code>Locale</code>表示一个特定的国家和语言(包括一种可选的不同语言),和一套对于数字,日期之类的字符串的格式化方案。</li>
<li><b>ResourceBundle (资源包)</b> - <code>java.util.ResourceBundle</code>类提供了支持不同语言的信息的基本支持。参阅<code>ResourceBundle</code>的Javadoc和在你的JDK版本中的国际化支持的信息来得到进一步的帮助。</li>
<li><b>PropertyResourceBundle (属性资源包)</b> - 一个<code>ResourceBundle</code>的标准实现,它允许你用和properties文件一样的"name=value"的格式来定义资源。这对于在web程序中准备信息资源宝石很方便的,因为大部分的信息都是文本。</li>
<li><b>MessageFormat (信息格式)</b> - <code>java.text.MessageFormat</code> 类允许你在运行时用参数的方式替代一个信息字符串(在这种情况下,是从reousece bundle中取出的)。有时候你要编写一个句子,但是在不同的语言中词语出现的顺序不一样,这就很有用了。字符串中的占位符<code>{0}</code>会被第一个运行时参数取代,<code>{1}</code>会被第二个取代,其它的也是这样。</li>
<li><b>MessageResources (信息资源)</b> - Struts类<code><a href="api/org/apache/struts/util/MessageResources.html">org.apache.struts.util.MessageResources</a></code>让你把一套resource bundle当成数据库,允许你得到某种特定的Locale(一般是当前用户的Locale)中的特定信息字符串,而非服务器自己正在使用的Locale。</li>
</ul>
<p>
请注意在一个Struts之类的框架中i18n的支持只限于<b>显示</b>国际化的字符串和图像给用户。支持地区相关的<b>输入法</b>(在日语,中文,或者韩文之类的语言中使用)被留给客户端设备,一般是一个web浏览器。
</p>
<p>
对于一个国际化程序来说,请遵循JDK中附带的国际化文档中描述的步骤来为你的平台创建每一种语言的properties文件。下面的例子更深入的说明这一点:
</p>
<p>
假设你的源代码位于<code>com.mycompany.mypackage</code>包,所以它保存在<code>com/mycompany/mypackage</code>目录中(相对于你的源代码目录)。要创建一个名为<code>com.mycompany.mypackage.MyResources</code>的资源包,你应该在<code>com/mycompany/mypackage</code>下创建下列文件:
</p>
<ul>
<li><b>MyResources.properties</b> - 包含了使用你的服务器所在的语言的文本。如果你的默认语言是英语,你可能会有如下的条目:
<code>prompt.hello=Hello</code></li>
<li><b>MyResources_xx.properties</b> - 包含了ISO代码为"xx"的语言的文本(参阅ResourceBundle的Javadoc得到最新的代码列表)。对于一个上面所示文本的法语版本,你可能会有如下的条目:
<code>prompt.hello=Bonjour</code>
你可以编写所以你愿意支持的语言的资源包。</li>
</ul>
<p>
当你配置你web程序中controller servlet的发布描述时,你需要定义的一个国际化参数是程序的基本资源包的名字。在我们上面举的例子中,它就是<code>com.mycompany.mypackage.MyResources</code>。
</p>
<pre>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>application</param-name>
<param-value>com.mycompany.mypackage.MyResources</param-value>
</init-param>
<.../>
</servlet>
</pre>
<p>
一件重要的事情是要让你的资源包在你程序可以访问的class path中。另一个方法是把<code>MyResources.properties</code>放在你的程序的<code>classes</code>目录下,你就可以简单的用“myResource”作为程序的值。但是要注意如果你的编译脚本为了保证一个“干净”的编译目标,会删除整个classes目录,这时要保证这个资源文件不被删除。
</p>
<p>
如果是这种情形,这儿有一段Ant任务可以包含在你的编译脚本中,它把<code>src/conf</code>目录中的内容拷贝到<code>classes</code>目录去。
</p>
<pre>
<!-- Copy any configuration files -->
<copy todir="classes">
<fileset dir="src/conf"/>
</copy>
</pre>
</blockquote></td></tr></table><a name="form_beans"></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 Forms 和 FormBean 的交互</strong></font></td></tr><tr><td><blockquote>
<p>
以前,大多数web开发者使用标准的HTML能力来编写Forms,比如使用<code><input></code>标签。用户希望和程序互动,产生某种特定的行为,其中之一和错误处理有关——如果用户犯了个错误,程序应该允许他们改正需要改正的地方——而非重新填写页面上所有的字段。
</p>
<p>
使用标准的HTML和JSP页面来满足这种需求是非常繁琐和粗笨的,举个例子,一个<code>username</code>字段的输入框可能是这样的(在JSP里):
</p>
<pre>
<input type="text" name="username"
value="<%= loginBean.getUsername() %>"/>
</pre>
<p>
如果HTML程序员并没有编程基础知识的话,这很难输入正确,而且也会对页面编辑者带来麻烦。基于JSP1.1中的自定义标签库,Struts为编写form提供了很大的方便,可以取代原始的方法。上面的例子用Struts来编写的话会是这样:
</p>
<pre>
<html:text property="username"/>
</pre>
<p>
并不需要显式的引用一个JavaBean以取得初始值。框架自动完成这些事情。
</p>
<p>
HTML form有时候被用来上传一些文件。大部分浏览器通过<input type="file"> 元素来支持这一点,它会显示一个浏览文件的按钮,但是(在Server端--译者注)下面就轮到开发者来处理这些(上传)来的文件了。Struts可以用和普通的form一致的方式来处理这些"multipart" form.在下一节里,我们会谈到用Struts来创建一个简单的login页面,还包括一个简单的multipart form。
</p>
</blockquote></td></tr></table><a name="forms"></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.1 在Struts里编写Form </strong></font></td></tr><tr><td><blockquote>
<p>
一个完整的login页面有助于展示Struts如何用比直接的HTML和标准JSP方式更轻松的方式来处理form。考虑如下的页面(基于Struts附带的示例程序),名字是<code>logon.jsp</code>:
</p>
<hr>
<pre>
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-html.tld"
prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld"
prefix="bean" %>
<html:html>
<head>
<title>
<bean:message key="logon.title"/>
</title>
<body bgcolor="white">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -