struts1 构建视图

来源:互联网 发布:win7 端口被屏蔽 编辑:程序博客网 时间:2024/04/28 04:52
URL:http://struts.apache.org/release/1.3.x/userGuide/building_view.html
"What if I should fall right through the center of the earth... oh, and come out the other side, where people walk upside down."
这是《爱丽丝梦游仙境》中的一句台词,大意如果我从地心下降穿过,从另一边出现,哪里的人走路都是上下颠倒的。

1.概述
struts1框架为视图组件提供了基础组件支持,但是不会提供任何属于struts1现行的视图组件。多种展现技术都是可用的,包括Cocoon,JSP,XSLT,Velocity模板技术。
由框架提供可直接被视图组件使用的特性包括提供展示文本图片的Message Resources,和FormBeans提供的自动验证和弹出提示信息。
2.国际化信息
几年前,应用开发者只能为他们自己国家的,使用同一中语言的居住者,并提供一种日期格式,数字,货币值的运算支持。然而,基于web技术的应用开发爆发,同那些部署在网络或者广泛的传输平台一样,需要在不同的国家环境下展示渲染效果。这个问题转化为应用支持国际化和本地化的需求。
这个框架的构建是基于Java构建国际化应用和本地化应用的基础类的。下面的关键概念会变得耳熟能详:
Locale:支持国际化的java基础类是Locale。每一个Locale都会展示一个特定的国家和语言种类的选择,和一系列数字和日期的假定。
ResourceBundle:java.util.ResouceBundle类为多个语言种类下支持信息提供了基础工具。想了解更多关于它的信息,请查阅javadoc中的ResourceBundle和你的JDK当前版本中关于国际化的信息。
PropertyResouceBundle:一个ResourceBundle的标准实现,允许你通过使用"name=value"语法初始化properties文件定义资源。这对于在web应用中使用含有信息文本的资源绑定是非常便利的,因为这些信息都是面向文本的。
MessageFormat:java.text.MessageFormat类允许你在运行时用指定的参数来替换消息字符串的一部分。这在一些情况下是非常有用的,如在制造一个语句,但是单词出现的次序和语言种类不同时。在信息中的占位符字符串{0}被第一个运行时参数替换,{1}被第二个参数替换,以此类推。
MessageResouces:框架类org.apache.struts.MessageResources使你相信一系列的资源绑定如同数据库一样,并允许你为特定的Locale请求一些独特的信息替代默认的Locale由服务器本身运行。
请注意i18n在服务端的设定对于向用户展示国际化文本和图片的作用是有限的。支持Locale特定输入方法取决于客户端设备,这通常是浏览器。
对于一个国际化应用,按照JDK文档中国际化文档中的步骤为你的平台绑定创建含有各种语言信息的properties文件,一个例子会进一步说明这些:
假定你的资源文件在包com.mycompany.mypackage下,所以它存储在/com/mycompany/mypackage下。为了创建一个名叫com.mycompany.mypackage.MyApplication的资源绑定,你应该在/com/mycompany/mypackage目录下创建下面的文件:
MyApplication.properties:在服务器上包含默认语种的信息文件,如果你的默认语言是英语,你可能会有像这样的记录:prompt.hello=Hello
MyApplication_XX.properties:含有ISO语言编码是XX的语言的信息文件。像上面展示的法语版本的信息文件,你将可能有这样的记录prompt.hello=Bonjour。你将可以有你所需要的尽可能多的资源信息绑定文件。
当你通过struts-config.xml配置文件配置你的控制器servlet时,其中一项就是你需要为你的应用配置你的基础信息资源绑定,如同上面描述的情形,它将是com.mycompany.mypackage.MyApplication。
<message-resources parameter="com.mycompany.mypackage.MyApplication"/>
最重要的是为你的资源绑定文件找到应用中的类路径。另一种方法是在应用类文件夹下存储MyResources.properties文件。你可以简单的指定MyResources为应用级别的数值。当你使用脚本清理类文件夹下的class文件时,一定要注意不要删除掉它。
如果这样做了,这个有个Ant的任务可以在编译应用的时候将资源绑定文件拷贝到类文件目录中。
<!-- Copy any configuration files --><copy todir="classes"><fileset dir="src/conf"/></copy>
3.表单和FormBean的内部交互
注意:这里的例子用的是JSP和客户标签,然而ActionForm和其它控制器组件是适应任何视图的。这个框架采用可以被servlet解析的任意的视图呈现技术,例如XSLT。
3.1自动表单填充
曾经,大多数的web开发人员使用标准的HTML技术创建表单,例如input标签。用户开始期待交互性应用能有一些表现,并且其中一个是错误的提交方面的,假如用户犯了一个错误,应用应该能够确定哪些需要被修改,而不必在当前表单或页面重新填写其他正确的输入项。
满足这些期待在HTML或者JSP页面上是冗长和繁琐的。例如一个input元素看起来会像这样
<input type="text" name="username" value="<%=loginBean.getUserName()>"/>
这种难以区分使得对编程概念不熟悉的HTML开发人员困惑,并且引起HTML编辑的困难。Struts标签库提供了一个易于理解使用的标签库构建表单,基于客户标签库基础1.1JSP.上面的情形可以使用struts标签库如下表达:
<html:text property="username"/>
不需要明确地引用含有初始值的JavaBean。使用框架提供的标签库,这会被JSP标签自动处理。
HTML表单有时会被用来上传其他文件。大多数浏览器都是通过<input type="file">支持的,它会生成一个文件浏览按钮,但是它却依赖用户来提供文件的来源。框架提供了一种带有"multipart"的表单以区别常规表单。
3.2自动表单验证
除了上面提到的表单和bean的交互外,框架还提供了额外的设置验证接收到的输入数据。为了利用这种机制,你需要在ActionForm当中重写下面的方法:
validate(ActionMapping mapping,HttpServletRequest request)
验证方法会在bean的属性被填充后被控制器servlet调用,但是会在对应的action类execute方法调用之前。验证方法会有如下的返回结果:
1).调用适当的验证方法,没有发现问题:返回一个为null或者长度为0的ActionErrors的对象,并且控制器会继续调用对应的Action类的execute方法。
2).调用适当的验证方法,发现问题:返回一个ActionErrors对象,它包含多个可以在页面展示key的ActionMessage。控制器将会保存这个数组为一个属性被<html:errors>标签使用,并返回到原先的输入表单中。
正如早先提到的,这种特性完全是可选的。默认的validate实现方法返回的是null,并且控制器假定所有的必须的验证都是被action类完成的。
一个通用简便的方法是初步表单验证使用ActionForm的验证方法,然后在Action中进行业务逻辑验证。
Struts验证器,在下一个阶段被覆盖,可以用来非常容易的验证ActionForms。
3.3Struts验证器
配置验证器进行验证是非常容易的。
1.ActionForm bean必须继承ValidatorForm
2.为了客户端验证,表单的JSP页面必须导入<html:javascript>标签
3.你必须像下面一样在一个XML文件中定义验证规则:
<form-validation>
   <formset>
          <form name="logonForm">
                <field property="username" depends="required">
                    <msg name="required" key="error.username"/>
                </field>
          </form> 
   </formset>
</form-validation>
当生成错误信息时,msg元素指向信息资源绑定的可用的key。
4.最后你应该像下面这样在struts-config.xml文件中启用ValidatorPlugin:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" value="/org/apache/struts/validator/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
注意:如果你要求验证的表单属性是java对象原始数据类型的包装类型,例如java.lang.Integer,你必须在设置ActionServlet的convertNull的初始参数为true。设置失败会导致表单必填验证不会被调用,原因是它的默认值是0。
3.4带有Tiles的页面组合
Tiles是一个强大的模板库,它允许你通过各种各样的"tiles"组合来构建视图。这是一个快速的使用指南:
1.创建一个包含你应用通用外观的/layout/layout.jsp文件:
<html><body>
        <tiles:insert attribute="body"/>
</body></html>
2.创建你的/index.jsp作为主页:
<h1>This is my HomePage</h1>
3.创建一个像下面的/WEB-INF/tiles-def.xml文件:
<tiles-definitions>
   <definition name="layout" path="/layout/layout.jsp">
        <put name="body" value=""/>
   </definition>
   <definition name="homepage" extends="layout">
        <put name="body" value="/index.jsp"/>
   </definition>
</tiles-definitions>
4.在struts-config.xml文件中配置TilesPlugin:
<plug-in className="org.apache.struts.tiles.TilesPlugin">
      <set-property property="definitions-config" value="/WEB-INF/tiles-def.xml"/>
</plug-in>
5.在struts-config.xml文件中配置一个Action指向你的首页的tile:
<action path="/index" type="org.apache.struts.actions.ForwardAction" parameter="homepage"/>
TilesPlugin配置了一个指定的请求处理器,这个处理器确定请求的视图是不是一个tile并按照规则处理它。注意:我们创建的首页tile继承了根布局tile,并更改了根布局tile的body属性。Tiles把body属性位置命名的文件插入到主布局中。
4.展现技术框架
框架被多种展现技术支持,并且有大量的扩展使得创建视图组件非常的容易。一些非常流程的展示技术如下所示:
struts taglib
5.其他展现技术
尽管你的应用的视图展现可以基于标准的展现技术完全实现,但是你可能需要使用其他展现技术直接生成响应。
5.1图片生成组件
有一些应用需要动态的生成图片,就像股票网站上的价格图表。两种通用的方法可以满足这种需求:
1.通过含有执行请求生成URL的超级链接。这个请求将会调用图片生成库生成图片,设定适当的内容类型,发送图片的bytes信息到浏览器上,浏览器就像展示静态图片一样展示这些图片信息。
2.通过必需的HTML代码下载一个java Applet,然后通过它生成图片。你可以设置applet适当的初始化参数生成图片,也可以让applet连接到服务器获取这些参数。
5.2生成文本
有些应用需要动态的生成文本或者标记,例如XML文件。如果一个完整的页面已经生成,它可以使用PrintWriter来输出,在Action中这是非常容易使用的。
response.setContentType("text/plain");
PrintWriter witer=response.getWriter();
//use witer to render text
return(null);




0 0
原创粉丝点击