Struts 框架及标记库


序 经过了两个星期不懈努力,今天终于完成了对 strtus 整体架构及核心标签库的介绍。 从几乎不懂 struts 和 HTML 标签,到可以给别人解决涉及 struts 的一些小问题,这与朋友 的帮助和我的努力是分不开的,但我更希望它能给那些想要学的,正在学的和已经学过的 人带来不同的益处。我知道我是个新手,但我会用百倍的努力继续在这个领域进行深入性 的和扩展性的学习与研究。同时,就象我说的,我们会用实际行动证明我们为你提供的帮 助。 这章适合做参考资料,他不仅包含了对 struts 的整体架构及主要组件的详细和清晰的 介绍,而且对于很多人都关注的 struts 标签库也进行了细致的介绍,可以说它是你手头一 个可以用来进行参考的资料。当你哪里不清楚,你完全可以到这里查询。为了你查询方便, 我做了一个目录。 由于开源软件不断发展,所以这不可能是最后版本,我会不断进行内容的修改和新特 性的添加。比如 strus1.1 的 Nested Tag,但由于个人技术水平和时间等多方面原因,速度 不会太快,这就需要大家的帮助,希望大家共同参加一些资料的整理。 最后,我真心的感谢 jag,banq,steelg,holen,七老爷,还有混血儿,要不是他,我 会更早完成这个资料的,不过他又一次锻炼了我的意志。 我已经尽力避免在文字或代码中出现错误,但是人无完,疏漏总是难免的。如果你在 阅读发现了其中的错误,比如文字的错误或错误的代码,我非常希望你将这些信息反馈给 我,这样会帮助其他人解决遇到的问题,也会不断完善这套资料。我的邮件是: tyrones@cmmail.com QQ:36983608 希望本资料能给你带来帮助! 2002 年 08 月 26 日 午夜 目录 序 …………………………………………………………………………………………………1 目录 …………………………………………………………………………………………………2 Struts 框架 1. struts 压缩包内容………………………………………………………………………3 2. struts 体系结构(模型-视窗-控制器)…………………………………………………3 3. struts 框架的组件………………………………………………………………………4 3.1 struts 配置文件……………………………………………………………………5 3.2 ActionServlet 类……………………………………………………………………7 3.3 ActionMapping 类……………………………………………………………………9 3.4 Action 类……………………………………………………………………………9 3.5 ActionForm 类………………………………………………………………………10 3.6 ActionForward 类……………………………………………………………………11 3.7 错误处理………………………………………………………………………………11 Struts 标记库 4. struts 标记库………………………………………………………………………………13 4.1 Bean 标记………………………………………………………………………………13 4.1.1 Bean 复制标记…………………………………………………………………13 4.1.2 定义脚本变量标记……………………………………………………………13 4.1.3 显示 bean 属性…………………………………………………………………14 4.1.4 消息国际化标记………………………………………………………………15 4.2 逻辑标记………………………………………………………………………………16 4.2.1 条件标记………………………………………………………………………16 4.2.2 重复标记………………………………………………………………………18 4.2.3 转发和重定向标记……………………………………………………………18 4.3 HTML 标记………………………………………………………………………………19 4.3.1 显示表单元素和输入控件……………………………………………………19 4.3.2 显示错误信息的标记…………………………………………………………23 4.3.3 其他 HTML 标记…………………………………………………………………24 4.4 模板标记………………………………………………………………………………24 Struts 框架 struts 框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于 MVC 的 web 应用程序的开发。 本章详细讨论 struts 架构。我们将看到 struts 是如何清晰地区分控制,事务逻辑和外 观,从而简化了开发应用程序过程的。我们还将介绍 struts 提供的类如何使得开发工作更 加简单,这些类包括: 控制程序流程的类 实现和执行程序事务逻辑的类 自定义的标记库使得创建和验证 HTML 表单更加容易 1. Struts 压缩包内容 文件夹 jakarta-struts-1.0.2 包含两个目录,lib 和 webapps。在 lib 目录中有使用 struts 创建应用程序是所需的文件: 文件 描述 jdbc2_0-stdext.jar 包含 JDBC2.0 Optional Package API 类。如果我们要使用 struts 提供的数据资源,就需要将这个文件拷贝到 WEB-INF\lib 下 Struts.jar 包含 struts 中所有的 java 类。同样也需要拷贝到 WEB-INF\lib 下 *.tld 标记库描述器文件,描述了多个 struts 标记库中的自定义标记。 同样要拷贝到 WEB-INF\lib 下 在 webapps 目录下有如下文件: Web 应用程序 描述 Struts-blank.war 一个简单的 web 应用程序 Struts-documentation.war 包含 struts 站点上所有 struts 文档 Struts-example.war Struts 很多特性的示范 Struts-exercisetaglib.war 主要用于对自定义标签库进行增加而使用的 测试页,但也可以示范如何使用 struts 标记 Struts-template.war 包含 struts 模板标记的介绍和范例 Struts-upload.war 一个简单的例子,示范如何使用 struts 框架 上传文件 2.Struts 体系结构 让我们从 MVC 角度观察 struts 框架中的组件 框架中三个部分:模型,视窗和控制器。 模型 在 struts 框架中,模型分为两个部分: 系统的内部状态 可以改变状态的操作(事务逻辑) 内部状态通常由一组 ActinForm JavaBean 表示。根据设计或应用程序复杂度的不同,这 些 Bean 可以是自包含的并具有持续的状态,或只在需要时才获得数据(从某个数据库)。 大型应用程序通常在方法内部封装事务逻辑(操作),这些方法可以被拥有状态信息的 bean 调用。比如购物车 bean,它拥有用户购买商品的信息,可能还有 checkOut()方法用来 检查用户的信用卡,并向仓库发定货信息。 小型程序中,操作可能会被内嵌在 Action 类,它是 struts 框架中控制器角色的一部分。 当逻辑简单时这个方法很适合。 建议用户将事务逻辑(要做什么)与 Action 类所扮演的角色(决定做什么)分开。 视窗 由 JSP 建立,struts 包含扩展自定义标签库,可以简化创建完全国际化用户界面的过程。 控制器 struts 中,基本的控制器组件是 ActionServlet 类中的实例 servelt,实际使用的 servlet 在配置文件中由一组映射(由 ActionMapping 类进行描述)进行定义。 3.Struts 框架中的组件 (由于 ROSE 工具还未能下载,只能找来这幅图,它说明了一定问题,特别是 ActionErrors, 但它并没有将 ActionMapping,JSP 和 Tag Library 包含进来,有时间作完替换) 框架中所使用的组件: ActionServlet 控制器 ActionClass 包含事务逻辑 ActionForm 显示模块数据 ActionMapping 帮助控制器将请求映射到操作 ActionForward 用来指示操作转移的对象 ActionError 用来存储和回收错误 Struts 标记库 可以减轻开发显示层次的工作 下面我们看看各自在框架中所扮演的角色和责任。 3.1 Struts 配置文件 这是将 struts 组件结合在一起的东东:struts-config.xml。默认值 \WEB-INF\struts-config.xml。配置文件可以定义: 全局转发 ActionMapping 类 ActionForm bean JDBC 数据源 配置全局转发 全局转发用来在 JSP 页之间创建逻辑名称映射。转发都可以通过对调用操作映射的实例 来获得,例如: actionMappingInstace.findForward(“logicalName”); 全局转发的例子:(所有的例子我没有进行解释,一是结合表可以理解,二是例子大部分来 自系列四的示例,你应该在作完实验后,再来看一便) 属性 描述 Name 全局转发的名字 Path 与目标 URL 的相对路径 配置 ActionMapping ActionMapping 对象帮助进行框架内部的流程控制,它们可将请求 URI 映射到 Action 类,并且将 Action 类与 ActionForm bean 相关联。ActionServlet 在内部使用这些映射,并 将控制转移到特定 Action 类的实例。所有Action 类使用 perform()方法实现特定应用程序 代码,返回一个 ActionForward 对象,其中包括响应转发的目标资源名称。例如: 属性 描述 Path Action类的相对路径 Name 与本操作关联的Action bean的名称 Type 连接到本映射的Action类的全称(可有包名) Scope ActionForm bean的作用域(请求或会话) Prefix 用来匹配请求参数与bean属性的前缀 Suffix 用来匹配请求参数与bean属性的后缀 attribute 作用域名称。 className ActionMapping对象的类的完全限定名默认的类是 org.apache.struts.action.ActionMapping input 输入表单的路径,指向bean发生输入错误必须返回的控制 unknown 设为true,操作将被作为所有没有定义的ActionMapping 的URI的默认操作 validate 设置为true,则在调用Action对象上的perform()方法前, ActionServlet将调用ActionForm bean的validate()方法 来进行输入检查 通过元素,可以定义资源的逻辑名称,该资源是Action类的响应要转发的目标。 属性 描述 Id ID ClassName ActionForward 类的完全限定名,默认是 org.apache.struts.action.ActionForward Name 操作类访问 ActionForward 时所用的逻辑名 Path 响应转发的目标资源的路径 redirect 若设置为 true,则 ActionServlet 使用 sendRedirect()方法来转发资源 配置 ActionForm Bean ActionServlet 使用 ActionForm 来保存请求的参数,这些 bean 的属性名称与 HTTP 请 求参数中的名称相对应,控制器将请求参数传递到 ActionForm bean 的实例,然后将这个实 例传送到 Action 类。例子: 属性 描述 Id ID className ActionForm bean的完全限定名,默认值是 org.apache.struts.action.ActionFormBean Name 表单bean在相关作用域的名称,这个属性用来 将bean与ActionMapping进行关联 Type 类的完全限定名 配置JDBC数据源 用元素可以定义多个数据源。 属性 描述 Id ID Key Action 类使用这个名称来寻找连接 Type 实现 JDBC 接口的类的名称 下面属性需要元素定义,在框架 1.1 版本中已不在使用,但你可用 元素。例子: 属性 描述 desciption 数据源的描述 autoCommit 数据源创建的连接所使用的默认自动更新数 据库模式 driverClass 数据源所使用的类,用来显示JDBC 驱动程序 接口 loginTimeout 数据库登陆时间的限制,以秒为单位 maxCount 最多能建立的连接数目 minCount 要创建的最少连接数目 password 数据库访问的密码 readOnly 创建只读的连接 User 访问数据库的用户名 url JDBC 的 URL 通过指定关键字名称,Action 类可以访问数据源,比如: javax.sql.DataSource ds = servlet.findDataSource(“conPool”); javax.sql.Connection con = ds.getConnection(); 3.2 ActionServlet 类 框架中的控制器组件是有 org.apache.struts.action.ActionServlet 类实现的,这个 类是 javax.servlet.http.HttpServlet 类的扩展。 Struts controller 基本功能是: 1. 截获用户的 Http 请求 2. 把这个请求映射到相应的 Action 类,如果这是此类收到的第一个请求,将初始化实例并 缓寸。 3. 创建或发现一个 ActionForm bean 实例(看配置文件是否定义),然后将请求过程移植到 bean. 4. 调用 Action 实例的 perform()方法并将 ActioForm bean,Action Mapping 对象,request 和 response 对象传给它。 如:public ActionForword perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) 5.perform 返回一个 ActionForword 对象,此对象连接到相应的 jsp 页面. ActionServlet 配置 我们需要在 web.xml 中声明 ActionServlet,并且将它配置成启动时进行加载。以下为 可以配置的初始化参数: 参数 默认值 描述 application null 应用程序的资源集合的 类 bufferSize 4096 文件上传的缓冲区大小 config /WEB-INF/struts-config.xml 配置文件的位置和名称 content Text/html 默认的内容类型 debug 0 程序调试的级别 detail 0 程序调试细节的级别 factory null 消息资源工厂,用于国际 化中解释消息资源 formBean org.apache.struts.action.ActionFormBean 封装 ActionForm bean 信 息的类的名称 forward org.apache.struts.action.ActionForward 封装 ActionForward 对象 信息的类的名称 locale true 为 true,将在用户会话中 存储一个本地对象 mapping org.apache.struts.action.ActionForward 封装 ActionMapping 信息 的类的名称 maxFileSize 250M 上传文件的最大尺寸 multipartClass org.apache.struts.action.ActionForward 处理多部分请求的类的 名称 noCache False HTTP 标头是否要设置为 禁止缓寸 Null True 设置为 true,对于无效的 信息关键字将返回 null tempDir 作为一个 servlet 参数提供给程序的工作目 录 处理下载文件是使用的 临时工作目录 validate True 是否使用新格式的配置 文件 vallidating True 是否对配置文件进行有 效性分析 大多数情况下,标准的 servlet 就能够满足用户需要。 第一次收到特定请求的 URI 时,ActionServlet 将适当的 Action 类进行实例化,然后 ActionServlet 在 Action 类实例中以 servlet 为变量名存储一个引用。当被实例化后, Action 类会被暂存以备再用。 ActionServlet 也提供一些方法,由Action 类用来访问数据源和转发目标之类的资源。 ActionServlet 方法 ActinServlet 提供了一组能够被 Action 对象使用的方法。 Struts API 的全部信息在 struts-documentation.war 中可以找到。动态的添加或删除, 这些方法只影响应用程序当前的实例: public void addFormBean(ActionFormBean formBean) public void removeFormBean(ActionFormBean formBean) public void addForward(ActionForward actionForward) public void removeForward(ActionForward actionForward) public void addMapping(ActionMapping actionMapping) public void removeMapping(ActionMapping actionMapping) 根据名称查找对象: public ActionFormBean findFormBean(String name) public ActionForward findForward(String name) public ActionMapping findMapping(String name) 用来处理数据源: public void addDataSource(String key , DataSource ds) public DataSource findDataSource(String key) 我们还可以: 使用 destroy()方法结束 ActionServlet 使用 reload()方法从 struts 配置文件将信息重新加载。 3.3 ActionMapping 类 将特定请求映射到特定 Action 的相关信息存储在 ActionMapping 中,ActionServelt 将 ActionMapping 传送到 Action 类的 perform()方法,Action 将使用 ActionMapping 的 findForward()方法,此方法返回一个指定名称的 ActionForward,这样 Action 就完成了本 地转发。若没有找到具体的 ActionForward,就返回一个 null. public ActionForward findForward(String name) 可在映射中动态添加 ActionForward: public void addForward(ActionForward forward) 可返回与映射关联的表单 bean: public String getName() 可返回映射的属性域(会话或请求) public String getScope() 3.4 Action 类 Action 类真正实现应用程序的事务逻辑,它们负责处理请求。在收到请求后, ActionServlet 会: 为这个请求选择适当的 Action 如果需要,创建 Action 的一个实例 调用 Action 的 perform()方法 如果 ActionServlet 不能找到有效的映射,它会调用默认的 Action 类(在配置文件中定 义)。如果找到了 ActionServlet 将适当的 ActionMapping 类转发给 Action,这个 Action 使用 ActionMapping 找到本地转发,然后获得并设置 ActionMapping 属性。根据 servlet 的环境和被覆盖的 perform()方法的签名,ActionServlet 也会传送 ServletRequest 对象或 HttpServletRequest 对象。 所有 Action 类都扩展 org.apache.struts.action.Action 类,并且覆盖类中定义的某 一个 perform()方法。有两个 perform()方法: 处理非 HTTP(一般的)请求: public ActionForward perform(ActionMapping action, AcionForm form, ServletRequest request, ServletResponse response) throws IOException,ServletException 处理 HTTP 请求: public ActionForward perform(ActionMapping action, AcionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException Action 类必须以“线程安全”的方式进行编程,因为控制器会令多个同时发生的请求 共享同一个实例,相应的,在设计 Action 类时就需要注意以下几点: 不能使用实例或静态变量存储特定请求的状态信息,它们会在同一个操作中共享跨越请 求的全局资源 如果要访问的资源(如 JavaBean 和会话变量)在并行访问时需要进行保护,那么访问 就要进行同步 Action 类的方法 除了 perform()方法外,还有以下方法: 可以获得或设置与请求相关联的区域: public Locale getLocale(HttpServletRequest request) public void setLocale(HttpServletRequest request,Locale locale) 为应用程序获得消息资源: public MessageResources getResources() 检查用户是否点击表单上的“取消”键,如果是,将返回 true: public Boolean isCancelled(HttpServletRequest request) 当应用程序发生错误时,Action 类能够使用下面方法存储错误信息: public void saveErrors(HttpServletRequest request,ActionErrors errors) ActionError 实例被用来存储错误信息,这个方法在错误关键字下的请求属性列表中存储 ActionError 对象。通过使用在struts 标记库中定义的自定义标记,JSP页能够显示这些错 误信息,稍后我们就介绍。 3.5 ActionForm 类 框架假设用户在应用程序中为每个表单都创建了一个 ActionForm bean,对于每个在 struts-config.xml 文件中定义的 bean,框架在调用 Action 类的 perform()方法之前会进 行以下操作: 在相关联的关键字下,它检查用于适当类的 bean 实例的用户会话,如果在会话中没有 可用的 bean,它就会自动创建一个新的 bean 并添加到用户的会话中。 对于请求中每个与 bean 属性名称对应的参数,Action 调用相应的设置方法。 当 Action perform()被调用时,最新的 ActionForm bean 传送给它,参数值就可以立 即使用了。 ActionForm 类扩展 org.apache.struts.action.ActionForm 类,程序开发人员创建的 bean 能够包含额外的属性,而且 ActionServlet 可能使用反射(允许从已加载的对象中回 收信息)访问它。 ActionForm 类提供了另一种处理错误的手段,提供两个方法: Public ActionErrors validate(ActionMappin mapping, ServletRequest request) Public ActionErrors validate(ActionMappin mapping, HttpServletRequest request) 你应该在自己的 bean 里覆盖 validate()方法,并在配置文件里设置元素的 validate 为 true。在 ActionServlet 调用 Action 类前,它会调用 validate(),如果返回 的 ActionErrors 不是 null,则 ActinForm 会根据错误关键字将 ActionErrors 存储在请求 属性列表中。 如果返回的不是 null,而且长度大于0,则根据错误关键字将实例存储在请求的属性列 表中,然后 ActionServlet 将响应转发到配置文件元素的 input 属性所指向的目标。 如果需要执行特定的数据有效性检查,最好在 Action 类中进行这个操作,而不是在 ActionForm 类中进行。 方法 reset()可将 bean 的属性恢复到默认值: public void reset(ActionMapping mapping,HttpServletRequest request) public void reset(ActionMapping mapping,ServletRequest request) 典型的 ActionFrom bean 只有属性的设置与读取方法(getXXX),而没有实现事务逻辑 的方法。只有简单的输入检查逻辑,使用的目的是为了存储用户在相关表单中输入的最新数 据,以便可以将同一网页进行再生,同时提供一组错误信息,这样就可以让用户修改不正确 的输入数据。而真正对数据有效性进行检查的是 Action 类或适当的事务逻辑 bean。 3.6 ActionForward 类 目的是控制器将 Action 类的处理结果转发至目的地。 Action 类获得 ActionForward 实例的句柄,然后可用三种方法返回到 ActionServlet, 所以我们可以这样使用 findForward(): ActionServlet 根据名称获取一个全局转发 ActionMappin 实例被传送到 perform()方法,并根据名称找到一个本地转发 另一种是调用下面的一个构造器来创建它们自己的一个实例: public ActionForward() public ActionForward(String path) public ActionForward(String path,Boolean redirect) 3.7 错误处理 struts 提供了两个类来处理错误:ActionErrors 和 ActionError,它们都扩展 org.apache.struts.action。ActionErrors 保存着 ActionError 对象的集合,其中每一个 代表了独立的错误信息。每个ActionError 都包含了关键字,能够映射到资源文件中存储的 错误信息,而这个资源文件是在 ActionServlet 初始化参数中指定的。 ActionError 类 ActionError 类定义了一组重载的构造器来创建错误信息,第一个构造器方法使用一个 字符串作为参数,例如: ActionError error = new ActionError(“error.Invalid”); 实例 error 映射到应用程序资源文件中的一个错误消息: error.invalid=Invalid Number 如果在 JSP 页使用,用户就会看见加粗的 Invalid Number。 另一种使用了 java.text.MessageFormat 类,可在消息中指定替换字符串,例如: error.invalid=Invalid Number{0} 创建一个错误消息: ActionError error = new ActionError(‘error.invalid’,new Double(-1)); JSP 页显示:Invalild Number –1 还有获得特定消息的错误关键字: public String getKey() 还有获得替换字符串数组: public String[] getValues() ActionError 类 ActionError 类从不独立进行错误处理,它们总是被存储在 ActionErrors 对象中。 ActionErrors 对象保存 ActionError 类的集合以及它们特定的属性值,我们可以使用自己 定义的属性值,或是使用 ActionErrors.GLOBAL_ERROR. 下面是典型 Action 类的 perform()中错误处理情况: MyForm form = (MyForm) form; if (number == -1) { ActionErrors errors = new ActionErrors(); ActionError error = new ActionError(“error.Invalid”,new Double(-1)); errors.add(ActionErrors.GLOBAL_ERROR,error); saveErrors(req,errors); String input = mapping.getInput(); Return new ActionForward(input); } ActionErrors 有如下有用方法: 方法 描述 clear() 清除所有错误信息 empty() 如果 ActionErrors 对象是空的,它返回 true get() 返回错误信息。若无参数,所有信息将作为一个 Iterator 对象返回 properties() 返回包含属性名称的 Iterator,这些属性至少有一个错误 size() 返回错误的数目(整型数) Struts 标记库 4.Struts 标记库 JSP 视窗组件所使用的 struts 标记库由四类标记组成: Bean 标记:用来在 JSP 页中管理 bean 逻辑标记:用来在 JSP 页中控制流程 HTML 标记:用来生成 HTML 标记,在表单中显示数据,使用会话 ID 对 URL 进行编程 模板标记:使用动态模板构造普通格式的页 4.1 Bean 标记 这个标记库中包含用于定义新 bean、访问bean 及其属性的标记。Struts框架提供了多 种自定义标记用来在 JSP 页中处理 JavaBean。这些标记被封装在一个普通的标记库中,在 文件 struts-bean.tld 中定义了它的标记库描述器。Bean 标记库将标记定义在四个子类别 中: 创建和复制 bean 的标记 脚本变量定义标记 bean 翻译标记 消息国际化标记 4.1.1 Bean 复制标记 可定义新 bean,可复制现有 bean,还可从现有 bean 复制属性。 标记用来: 定义新字符串常数 将现有的 bean 复制到新定义的 bean 对象 复制现有 bean 的属性来创建新的 bean 标记属性: 属性 描述 Id 新定义的 bean 脚本变量名称,必须设置 Type 定义引入脚本变量的类 Value 为 id 属性定义的脚本变量分配一个新的对象 Name 目标 bean 的名称。若 value 属性没有设置,这个属性就必须设置 property Name 属性定义的 bean 的属性名称,用来定义新的 bean Scope 源 bean 的作用域。若没有设置,搜索范围是从页作用域到应用程序作用域 toScope 目标 bean 的作用域。若没有设置,默认值是页作用域 例如:定义一个 bean: 源 bean 在页作用域中被拷贝大哦请求作用域中的另一个 bean: 4.1.2 定义脚本变量的标记 从多种资源中定义和生成脚本变量,这些资源包括 cookie,请求参数,HTTP 标头等等。 属性如下: 属性 描述 Id 脚本变量和要定义的页作用域属性的名称 Name cookie/标头/参数的名称 multiple 如果这个属性设置了任意一个数值,所有匹配的 cookie 都会被积累并存储 到一个 Cookie[](一个数组)类型的 bean 里。若无设置,指定 cookie 的第 一个值将作为 Cookie 类型的值 Value 如果没有匹配的 cookie 或数值,就返回这个属性指定的默认值 例如: 脚本变量名称是 myCookie,用来创建这个属性的 cookie 的名称是 userName。 脚本变量名称是 myHeader,请求标头的名称是 Accept-Language. 脚本变量名称是 myPatameter,它保存的请求参数的名称也是 myParameter. 标记将对一个资源的响应进行检索,并引入一个脚本变量和字符串类型 的页作用域属性。这个资源可以是一个页,一个 ActionForward 或一个外部 URL。与 的不同是资源的响应被存储到一个页作用域的 bean 中,而不是写入到输出 流。属性如下: 属性 描述 Id 脚本变量和要定义的页作用域属性的名称 Page 一个内部资源 forward 一个 ActionForward Href 要包含的资源的完整 URL 例如: 脚本变量的名称是 myInclude,要检索的响应来自资源 MyJsp?x=1。 标记将检索 web 应用中的资源,并引入一个脚本变量和 InputStream 或字符串类型的页作用域属性。如果在检索资源时发生问题,就会产生一个请求时间异常。 属性如下: 属性 描述 Id 脚本变量和要定义的页作用域属性的名称 Name 资源的相对路径 Input 如果这个属性不存在,资源的类型就是字符串 例如: 脚本变量的名称是 myResource,要检索的资源的名称是 myResource.xml。 4.1.3 显示 Bean 属性 标记库中定义了标记,用来将 bean 的属性输送到封装的 JSP 页写入器。这 个标记与类似,属性如下: 属性 描述 Name 要进行属性显示的 bean 的名称 property 要显示的属性的名称。如果这个属性类有 java.beans.PropertyEditor,getAsText()或 toString 方法会被调用 Scope Bean 的作用域,若没有设置,搜索范围是从页到应用程序作用域 Filter 如果设置 true,属性中的所有特殊 HTML 字符都将被转化为相应的实体引用 Ignore 如果设置 false,当发现属性时会产生一个请求时间异常,否则返回 null 例如: myBean 的属性 myProperty 将会被显示,作用域为请求,如果发现任何 HTML 特殊字符 都将被转化为相应的实体引用。 4.1.4 消息标记和国际化 strtus 框架支持国际化和本地化。用户在他们的计算机中定义自己所在的区域,当web 应用程序需要输出一条消息时,它将引用一个资源文件,在这个文件中所有的消息都使用了 适当的语言。一个应用程序可能提供了很多资源文件,每个文件提供了用不同语言编写的消 息。如果没有找到所选语言的资源文件,就将使用默认的资源文件。 struts 框架对国际化的支持是使用标记,以及使用 java.util 数据包 中定义的 Locale 和 ResourceBundle 类来实现 Java2 平台对这些任务的支持。 Java.text.MessageFormat 类定义的技术可以支持消息的格式。利用此功能,开发人员不需 了解这些类的细节就可进行国际化和设置消息的格式。 用 strtus 实现国际化和本地化: 第一步要定义资源文件的名称,这个文件会包含用默认语言编写的在程序中会出现的所有消 息。这些消息以“关键字-值”的形式存储,如下: error.validation.location = The entered location is invalid 这个文件需要存储在类的路径下,而且它的路径要作为初始化参数传送给 ActionServlet 作为参数进行传递时,路径的格式要符合完整 Java 类的标准命名规范。比 如,如果资源文件存储在 WEB-INF\classes目录中,文件名是 ApplicationResources.properties,那么需要传递的参数值是 ApplicationResources。如 果文件在 WEB-INF\classes\com\test 中,那么参数值就应该是 com.test. ApplicationResources. 为了实现国际化,所有的资源文件必须都存储在基本资源文件所在的目录中。基本资源 文件包含的是用默认地区语言-本地语言编写的消息。如果基本资源文件的名称是 ApplicationResources.properties,那么用其他特定语言编写的资源文件的名称就应该是 ApplicationResources_xx.properties(xx 为 ISO 编码,如英语是 en)。因此这些文件应包 含相同的关键字,但关键字的值是用特定语言编写的。 ActionServlet 的区域初始化参数必须与一个 true 值一起传送,这样 ActionServlet 就会在用户会话中的 Action.LOCALE_KEY 关键字下存储一个特定用户计算机的区域对象。现 在可以运行一个国际化的 web 站点,它可以根据用户计算机上的设置的区域自动以相应的语 言显示。 我们还可以使用特定的字符串来替换部分消息,就象用 java.text.MessageFormat 的方 法一样: error.invalid.number = The number {0} is valid 我们可以把字符串{0}替换成任何我们需要的数字。标签属性如下: 属性 描述 Key 资源文件中定义消息关键字 Locale 用户会话中存储的区域对象的属性名称。若没有设置,默认值是 Action.LOCALE_KEY Bundle 在应用程序上下文中,存储资源对象的属性的名称。如果没有设置这个属性, 默认值是 Action.MESSAGE_KEY arg0 第一个替换参数值 arg1 第二个替换参数值 arg2 第三个替换参数值 arg3 第四个替换参数值 例如:资源文件中定义了一个消息: info.myKey = The numbers entered are {0},{1},{2},{3} 我们可使用下面的消息标记: 这个信息标记输出到 JSP 页会显示为:The numbers entered are 5,6,7,8 4.2 逻辑标记 逻辑库的标记能够用来处理外观逻辑而不需要使用 scriptlet。Struts 逻辑标签库包含 的标记能够有条件地产生输出文本,在对象集合中循环从而重复地产生输出文本,以及应用 程序流程控制。它也提供了一组在JSP 页中处理流程控制的标记。这些标记封装在文件名为 struts-logic.tld 的标记包中。逻辑标记库定义的标记能够执行下列三个功能: 条件逻辑 重复 转发/重定向响应 4.2.1 条件逻辑 struts 有三类条件逻辑。第一类可以比较下列实体与一个常数的大小: cookie 请求参数 bean 或 bean 的参数 请求标头 以下列出了这一类标记: 标记 功能 如果常数与被定义的实体相等,返回 true 如果常数与被定义的实体不相等,返回 true 如果常数大于等于被定义的实体,返回 true 如果常数小于等于被定义的实体,返回 true 如果常数小于被定义的实体,返回 true 如果常数大于被定义的实体,返回 true 这一类的所有标记有相同的属性 属性 描述 Value 要进行比较的常数值 Cookie 要进行比较的 HTTP cookie 的名称 Header 要进行比较的 HTTP 请求标头的名称 parameter 要进行比较的 HTTP 请求参数的名称 Name 如果要进行比较的是 bean 或 bean 的属性,则这个属性代表 bean 的名称 property 要进行比较的 bean 属性的名称 Scope Bean 的作用域,如果没有指定作用域,则它的搜索范围是从页到应用程序 例如: The entered name is SomeName 判断名为”name”的请求参数的值是否是”SomeName”。 The value of bean.Prop is greater than 7 判断在页的作用域中是否有一个名为”bean”的 bean,它有一个 prop 属性,这个属性 的值是否大于 7。如果这个属性能够转化为数值,就进行数值比较,否则就进行字符串比较。 第二类条件标记定义了两个标记: 它们的功能是在计算标记体之前判断特定的项目是否存在。标记的属性和属性值决定了 要进行检查的项目。 属性 描述 Cookie 由这个属性指定的 cookie 将被检查是否存在 Header 由这个属性指定的请求标头将被检查是否存在 parameter 由这个属性指定的请求参数将被检查是否存在 Name 如果没有设置 property 属性,那么有这个属性指定的 bean 将被检查是 否存在。如果设置了,那么 bean 和 bean 属性都将被检查是否存在。 property 检查有 name 属性指定的 bean 中是否存在指定的属性 Scope 如果指定了 bean 的名称,这就是 bean 的作用域。如果没有指定作用域, 搜索的范围从页到应用程序作用域。 Role 检查当前已经确认的用户是否属于特殊的角色 User 检查当前已经确认的用户是否有特定的名称 例如: The bean property bean.prop is present 标记判断在页作用域中是否存在一个名为”bean”的 bean,这个 bean 有一个 prop 属 性。 第三类条件标记比较复杂,这些标记根据模板匹配的结果检查标记体的内容。换句话说,这 些标记判断一个指定项目的值是否是一个特定常数的子字符串: 这些标记允许 JSP 引擎在发现了匹配或是没有发现时计算标记主体。属性如下: 属性 描述 Cookie 要进行比较的 HTTP cookie 的名称 Header 要进行比较的的 HTTP 标头 的名称 parameter 要进行比较的的 HTTP 请求参数的名称 Name 若要对 bean 或 bean 的属性进行比较,这个属性是用户指定 bean 的名称 location 如果设置了这个属性的值,将会在这个指定的位置(索引值)进行匹配 scope 如果对 bean 进行比较,这个属性指定了 bean 的作用域。如果没有设置 这个参数,搜索范围是从页到应用程序作用域 property 要进行比较的 bean 的属性名称 value 要进行比较的常数值 例如: The parameter name is a sub-string of the string xyz from index 1 标记检查名为”name”的请求参数是否是”xyz”的子字符串,但是子字符串必须 从”xyz”的索引位置 1 开始(也就是说子字符串必须是”y”或”yz”)。 4.2.2 重复标记 在逻辑标记库中定义了标记,它能够根据特定集合中元素的数目对标 记体的内容进行重复的检查。集合的类型可以是 java.util.Iterator,java.util.Collection ,java.util.Map 或是一个数组。有三种方法可以定义这个集合: 使用运行时间表达式来返回一个属性集合的集合 将集合定义为 bean,并且使用 name 属性指定存储属性的名称。 使用 name 属性定义一个 bean,并且使用 property 属性定义一个返回集合的 bean 属性。 当前元素的集合会被定义为一个页作用域的 bean。属性如下,所有这些属性都能使用 运行时表达式。 属性 描述 collection 如果没有设置 name 属性,它就指定了要进行重复的集合 Id 页作用域 bean 和脚本变量的名称,它保存着集合中当前元素的句柄 indexed 页作用域 JSP bean 的名称,它包含着每次重复完成后集合的当前索引 Length 重复的最大次数 Name 作为集合的 bean 的名称,或是一个 bean 名称,它由 property 属性定义的 属性,是个集合 Offset 重复开始位置的索引 property 作为集合的 Bean 属性的名称 Scope 如果指定了 bean 名称,这个属性设置 bean 的作用域。若没有设置,搜索 范围从页到应用程序作用域 Type 为当前定义的页作用域 bean 的类型 例如: ” type=”java.lang.Integer” offset=”1” length=”2”> <% =currentint %> 代码将从列表中的第一个元素开始重复两个元素并且能够让当前元素作为页作用域和 java.lang.Integer 类型的脚本变量来使用。也就是说,如果 myList 包含元素 1,2,3,4 等,代码将会打印 1 和 2。 4.2.3 转发和重定向标记 转发标记 标记能够将响应转发给重定向到特定的全局 ActionForward 上。 ActionForward 的类型决定了是使用 PageContext 转发响应,还是使用 sendRedirect 将响 应进行重定向。此标记只有一个”name”属性,用来指定全局 ActionForward 的名称,例如: 重定向标记 标记是一个能够执行 HTTP 重定向的强大工具。根据指定的不同属性, 它能够通过不同的方式实现重定向。它还允许开发人员指定重定向URL 的查询参数。属性如 下: 属性 描述 Forward 映射了资源相对路径的 ActionForward Href 资源的完整 URL Page 资源的相对路径 Name Map 类型的页名称,请求,会话或程序属性的名称,其中包含要附加大哦 重定向 URL(如果没有设置 property 属性)上的“名称-值”参数。或是 具有 Map 类型属性的 bean 名称,其中包含相同的信息(没有设置 property 属性) Property Map 类型的 bean 属性的名称。Bean 的名称由 name 属性指定。 Scope 如果指定了 bean 的名称,这个属性指定搜索bean 的范围。如果没有设置, 搜索范围从页到应用程序作用域 ParamID 定义特定查询参数的名称 ParamName 字符串类型的 bean 的名称,其中包含查询参数的值(如果没有设置 paramProperty 属性);或是一个 bean 的名称,它的属性(在 paramProperty 属性中指定)包含了查询参数值 paramProperty 字符串 bean 属性的名称,其中包含着查询参数的值 ParamScope ParamName 定义的 bean 的搜索范围 使用这个标记时至少要指定 forward,href 或 page 中的一个属性,以便标明将响应重定 向到哪个资源。 4.3 HTML 标记 Struts HTML 标记可以大致地分为以下几个功能: 显示表单元素和输入控件 显示错误信息 显示其他 HTML 元素 4.3.1 显示表单元素和输入控件 struts 将 HTML 表单与为表单操作而定义的 ActionForm bean 紧密联系在一起。表单输 入字段的名称与 ActionForm bean 里定义的属性名称是对应的。当第一次显示表单时,表单 的输入字段是从 ActionForm bean 中移植过来的,当表单被提交时,请求参数将移植到 ActionForm bean 实例。 所有可以在
标记中使用的用来显示 HTML 输入控件的内嵌标记都使用下列属性来 定义 JavaScript 事件处理器。 属性 描述 Onblur 字段失去了焦点 Onchange 字段失去了焦点并且数值被更改了 Onclick 字段被鼠标点击 Ondblclick 字段被鼠标双击 Onfocus 字段接收到输入焦点 Onkeydown 字段拥有焦点并且有键按下 onkeypress 字段拥有焦点并且有键按下并释放 Onkeyup 字段拥有焦点并且有键被释放 onmousedown 鼠标指针指向字段并且点击 onmousemove 鼠标指针指向字段并且在字段内移动 onmouseout 鼠标指针指向控件,但是指针在元素外围移动 onmouseover 鼠标指针没有指向字段,但是指针在元素内部移动 Onmouseup 鼠标指针指向字段,并且释放了鼠标按键 元素中能够被定义的其他一般属性有: 属性 描述 Accesskey 定义访问输入字段的快捷键 Style 定义输入字段的样式 styleClass 定义输入字段的样式表类 Tabindex 输入字段的 tab 顺序 表单标记 标记用来显示 HTML 标记,可以指定 AcitonForm bean 的名称和它的类名。 如果没有设置这些属性,就需要有配置文件来指定ActionMapping 以表明当前输入的是哪个 JSP 页,以及从映射中检索的 bean 名和类。如果在 ActionMapping 指定的作用域中没有找 到指定的名称,就会创建并存储一个新的 bean,否则将使用找到的 bean。 标记能够包含与各种 HTML 输入字段相对应的子标记。 标记属性如下: 属性 描述 Action 与表单相关的操作。在配置中,这个操作也用来标识与表单相关的 ActionForm bean Enctype 表单 HTTP 方法的编码类型 Focus 表单中需要初始化焦点的字段 Method 表单使用的 HTTP 方法 Name 与表单相关的 ActionForm bean 的名称。如果没有设置这个属性,bean 的 名称将会从配置信息中获得 Onreset 表单复位时的 JavaScript 事件句柄 Onsubmit 表单提交时的 JavaScript 事件句柄 Scope 搜索 ActionForm bean 的范围。如果没有设置,将从配置文件中获取 Style 使用的格式 styleClass 这个元素的格式表类 Type ActionForm bean 的完整名称。如果没有设置,将从配置文件获得 例如: 与表单相关的操作路径是 validateEmployee,而表单数据是通过 POST 传递的。对于这 个表单来说,ActionForm bean 的其他信息,如 bean 名称类型,作用域,都是从表单指定 操作的 ActionMapping 中检索得到的: 如果配置文件中包含上述信息,并且请求URI 的*.do 被映射到 ActionServlet,与表单 相关的 ActionForm bean 的名称,类型和作用域分别是 empForm,com.example.EmployeeForm 和 request.这些属性也可以使用标记属性进行显示的定义。 以下标记必须嵌套在标记里 按钮和取消标记 标记显示一个按钮控件;标记显示一个取消按钮。属性如下: 属性 描述 Property 定义在表单被提交时返回到服务器的请求参数的名称 Value 按钮上的标记 复位和提交标记 标记分别能够显示 HTML 复位按钮和提交按钮。 文本和文本区标记 标记分别 HTML 文本框和文本区,属性如下: 属性 描述 Property 定义当表单被提交时送回到服务器的请求参数的名称,或用来确定文本元素 当前值的 bean 的属性名称 Name 属性被查询的 bean 的名称,它决定了文本框和文本区的值。如果没有设置, 将使用与这个内嵌表单相关的 ActionForm 的名称 标记还有以下属性: 属性 描述 Maxlength 能够输入的最大字符数 Size 文本框的大小(字符数) 标记特有的属性如下: 属性 描述 Rows 文本区的行数 Cols 文本区的列数 检查框和复选框标记 标记能够显示检查框控件。标记能够显示 HTML 复选框控 件,请求对象在传递检查框名称时使用的 getParameterValues()调用将返回一个字符串数 组。属性如下: 属性 描述 Name Bean 的名称,其属性会被用来确定检查是否以选中的状态显示。如果没有设 置,将使用与这个内嵌表单相关的 ActionFrom bean 的名称。 Property 检查框的名称,也是决定检查框是否以选中的状态显示的bean 属性名称。在 复选框的情况下,这个属性必须是一个数组。 Value 当检查框被选中时返回到服务器的请求参数的值 例如: 一个名为 married 的检查框,在表单提交时会返回一个”Y”. 文件标记 标记可以显示 HTML 文件控件。属性如下: 属性 描述 Name Bean 的名称,它的属性将确定文件控件中显示的内容。如果没设置,将使用与 内嵌表单相关的 ActionForm bean 的名称 property 这个属性定义了当表单被提交时送回到服务器的请求参数的名称,以及用来确 定文件控件中显示内容的 bean 属性名称 Accept 服务器能够处理的内容类型集。它也将对客户浏览器对话框中的可选文件类型 进行过滤 Value 按钮上的标记,这个按钮能够在本地文件系统中浏览文件 单选钮标记 标记用来显示 HTML 单选钮控件,属性如下: 属性 描述 Name Bean 的名称,其属性会被用来确定单选钮是否以选中的状态显示。如果没有 设置,将使用与这个内嵌表单相关的 ActionFrom bean 的名称。 property 当表单被提交时送回到服务器的请求参数的名称,以及用来确定单选钮是否 以被选中状态进行显示的 bean 属性的名称 Value 当单选钮被选中时返回到服务器的值 隐藏标记 标记能够显示 HTML 隐藏输入元素,属性如下: 属性 描述 Name Bean 的名称,其属性会被用来确定隐藏元素的当前值。如果没有设置,将使 用与这个内嵌表单相关的 ActionFrom bean 的名称。 property 定义了当表单被提交时送回到服务器的请求参数的名称,以及用来确定隐藏 元素当前值的 bean 属性的名称 Value 用来初始化隐藏输入元素的值 密码标记 标记能够显示 HTML 密码控件,属性如下: 属性 描述 maxlength 能够输入的最大字符数 Name Bean 的名称,它的属性将用来确定密码元素的当前值。如果没有设置,将使 用与这个内嵌表单相关的 ActionFrom bean 的名称。 property 定义了当表单被提交时送回到服务器的请求参数的名称,以及用来确定密码 元素当前值的 bean 属性的名称 redisplay 在显示这个字段时,如果相应的bean 属性已经被设置了数据,这个属性决定 了是否显示密码的内容 Size 字段的大小 选择标记 标记能够显示 HTML 选择控件,属性如下: 属性 描述 multiple 表明这个选择控件是否允许进行多选 Name Bean 的名称,它的属性确定了哪个。如果没有设置,将使用与这个内嵌表单 相关的 ActionFrom bean 的名称。 property 定义了当表单被提交时送回到服务器的请求参数的名称,以及用来确定哪个 选项需要被选中的 bean 属性的名称 Size 能够同时显示的选项数目 Value 用来表明需要被选中的选项 选项标记(这个元素需要嵌套在标记里) 标记用来显示 HTML 选项元素集合,属性如下: 属性 描述 collection Bean 集合的名称,这个集合存储在某个作用域的属性中。选项的数目与集 合中元素的数目相同。Property属性能够定义选项值所使用的 bean 属性, 而 labelProperty 属性定义选项标记所使用的 bean 的属性 labelName 用来指定存储于某个作用域的 bean,这个 bean 是一个字符串的集合,能 够定义元素的标记(如果标志与值不相同) labelProperty 与 collection 属性共同使用时,用来定义了存储于某个作用域的 bean, 这个 bean 将返回一个字符串集合,能够用来写入元素的 value 属性 Name 如果这是唯一被指定的属性,它就定义了存储于某个作用域的 bean,这个 bean 将返回一个字符串集合,能够用来写入元素的 value 属性 property 这个属性在与 collection 属性共同使用时,定义了每个要显示选项值的独 立 bean 的 name 属性。如果不是与 collection 属性共同使用,这个属性定 义了由 name 属性指定的 bean 的属性名称(如果有 name 属性),或是定义了 一个 ActionForm bean,这个 bean 将返回一个集合来写入选项的值 我们看一下这个标记的一些例子: 标记假设在某个作用域中有一个名为 optionCollection 的集合,它包含了一些具有 optionValue 属性的独立的 bean,每个属性将作为一个选项的值。每个选项的标志由 bean 的 optionLabel 属性属性进行定义。 标记中 optionValues 代表一个存储在某个作用域中的 bean,它是一个字符串集合,能 够用来写入选项的值,而 optionLabels 代表一个存储在某个作用域中的 bean,它也是一个 字符串集合,能够用来写入选项的标志。 4.3.2 显示错误信息的标记 标记能够与 ActionErrors 结合在一起来显示错误信息。这个标记首先要 从当前区域的资源文件中读取消息关键字 errors.header,然后显示消息的文本。接下去它 会在 ActionErrors 对象(通常作为请求参数而存储在 Action.ERROR_KEY 关键字下)中循环, 读取单个 ActionError 对象的消息关键字,从当前区域的资源文件中读取并格式化相应的消 息,并且显示它们。然后它读取与 errors.footer 关键字相对应的消息并且显示出来。 通过定义 property 属性能够过滤要显示的消息,这个属性的值应该与 ActionErrors 对象中存储 ActionError 对象的关键字对应。属性如下: 属性 描述 Bundle 表示应用程序作用域属性的名称,它包含着消息资源,其默认值 Acion.MESSAGE_KEY Locale 表示会话作用域属性的名称,它存储着用户当前登录的区域信息。其默认值 是 Action.ERROR_KEY Name 表示请求属性的名称,它存储着 ActionErrors 对象。其默认值是 Action.ERROR_KEY property 这个属性指定了 ActionErrors 对象中存储每个独立 ActionError 对象的关键 字,它可以过滤消息 例子: 显示集合中所有的错误。 显示存储在 missing.name 关键字的错误。 4.3.3 其他 HTML 标记 struts HTML 标记还定义了下列标记来显示其他 HTML 元素: : 显示 HTML 元素 : 显示图象标记 : 显示 HTML 链接或锚点 : 创建没有锚点标记的 URI 这些标记的详细内容请参照 struts 文档。 4.4 模板标记 动态模板是模块化 WEB 页布局设计的强大手段。Struts 模板标记库定义了自定义标记 来实现动态模板。 插入标记 标记能够在应用程序的 JSP 页中插入动态模板。这个标记只有一个 template 属性,用来定义模板 JSP 页。要插入到模板的页是有多个标记来 指定的,而这些标记被定义为标记的主体内容。 放置标记 标记是标记内部使用的,用来指定插入到模板的资 源。属性如下: 属性 描述 content 定义要插入的内容,比如一个 JSP 文件或一个 HTML 文件 direct 如果这个设置为 true,由 content 属性指定的内容将直接显示在 JSP 上而 不是作为包含文件 Name 要插入的内容的名称 Role 如果设置了这个属性,只有在当前合法用户具有特定角色时才能进行内容 的插入。 获得标记 在模板 JSP 页中使用标记能够检索由标记插入到 JSP 页的资源。属性如下: 属性 描述 Name 由标记插入的内容的名称 Role 如果设置了这个属性,只有在当前合法用户具有特定角色时才能进行内容 的检索 使用模板标记 首先编写一个模板 JSP 页,它将被所有的 web 页使用: <%@ taglib uri=”/template” prefix=”template” %>
我们将这个文件命名为 template.jsp。这个文件使用标记来获得由 JSP 页使用标记提供的内容,并且将内容在一个 HTML 表格中显示出来。这三个 内容是标题,内容和页脚。典型的内容 JSP 会是这样: <%@ taglib uri=”/template” prefix=”/template” %> 这个应用程序 JSP 页使用 标记将特定内容名称指定的资源放到模板 JSP 页中。如果我们有上百个布局相同的页,但突 然想改变这个模板,我们只需要改变 template.jsp 文件。 待续
还剩24页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

fjxszx_hss

贡献于2011-12-28

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf