Struts2 学习进阶

c6f7

贡献于2013-12-24

字数:0 关键词: Struts2 Web框架

Struts2 学习进阶 ——序言 最近开始学习 Struts2,为记录 Struts2 的学习过程,特写下《Struts2 学习进阶》,在该系列 文章中,开头的几篇为翻译 struts2 自带教程的文章,根据在学习过程中的一些问题会有所调整。 一. 环境说明 1. Struts 版本:2.0.8 下载地址:http://struts.apache.org/download.cgi 笔者下载的是 struts-2.0.8-all 2. JDK 版本:JDK1.5 3. Tomat 版本:5.5.28 4. MySql 版本:5.0 5. Eclipse 版本:3.2 6. MyEclipse 版本:5.1.1 除无特别说明,笔者的程序都基于以上环境。 二. 其它说明 1. 在建立 Struts2 的 Web 工程中,需将 struts-2.0.8\lib 下的各包放入 web 工程的 lib 目录下; 2. 该学习进阶文档为作者自学时学习记录,与大家共享之,也愿各位同仁提出宝贵意见; 3. 有疑问可留言或发 Email 至:xiexingxing1121@126.com。 望与大家同进步。 Struts2 学习进阶(基础篇二)——Hello World 说明:本文翻译自 struts-2.0.8-all\struts-2.0.8\docs\docs\hello-world.html,并根据笔者在 学习过程中的实践增加了部分内容。 当你提交一个 HTML 表单到这个框架中的时候,输入并不是被发送到服务页,而是被发送到你 提供的 Java 类,这些类被称为 Action。在这些 Action 执行完后,选择某一个资源来呈现返回 结果,这个资源一般是页面,但也可以是 PDF 文件,或者是 Excel 文件,亦或是 Java applet 窗口。 假设你想要创建一个“Hello World”的例子来呈现欢迎信息,在你准备好开发环境后,为了创建 一个“Hello World”的例子,你需要做如下三件事情: 1. 创建一个 jsp 页面来呈现欢迎信息; 2. 创建一个 Action 类来创建信息; 3. 在配置文件中配置 action 和页面的映射关系。 注意:为了创建这个组件,我们将工作流分成几乎无人不晓的三部分:视图、模型和控制器。分 离这三部分的原因是当系统变得越来月复杂的时候,我们能够更好的管理。 一. 准备工作 建立 web 工程,其中工程名为 tutorial,在 WebRoot 下引入 struts2 的 lib 下的如下 4 个包: commons-logging-1.1.jar freemarker-2.3.8.jar ognl-2.6.11.jar struts2-core-2.0.8.jar xwork-2.0.3.jar 在 web.xml 文件中增加 struts2 的 FilterDispatcher,修改后的 web.xml 如下: tutorial struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* index.html 二. 代码 首先,我们需要一个 jsp 页面来呈现信息,HelloWorld.jsp 页面代码如下所示: <%@ taglib prefix="s" uri="/struts-tags" %> Hello World!

接着,我们需要一个 Action 类来创建信息,代码如下: package tutorial; import com.opensymphony.xwork2.ActionSupport; public class HelloWorld extends ActionSupport { public static final String MESSAGE = "Struts is up and running "; public String execute() throws Exception { setMessage(MESSAGE); return SUCCESS; } private String message; public void setMessage(String message){ this.message = message; } public String getMessage() { return message; } } 第三步,我们需要在配置文件中进行相应配置来将两者联系起来。让我们编辑 src 下的 struts.x ml 文件,该文件内容如下: /HelloWorld.jsp 代码已经完成,让我们来尝试运行它。部署该应用程序并打开 http://localhost:8080/tutorial/ HelloWorld.action,我们可以看到标题栏为:Hello World,并且显示“Struts is up and run ning!”的页面呈现在我们面前。 三. 代码是如何工作的? 你的浏览器向 Web 服务器发送了的 http://localhost:8080/tutorial/HelloWorld.actio n(注: tutorial 为部署在 Tomcat 中的的项目名称)的 URL 请求后,服务器做了如下工作: 1. 容器接收到了 Web 服务器对资源 HelloWorld.action 的请求,根据 web.xml 中的配置, 服务器将包含有.action 后缀的请求转到 org.apache.struts2.dispatcher.FilterDispatcher 类进 行处理。这个 FilterDispatcher 是框架的一个进入点; 2. 框架在 struts.xml 配置文件中找到名为 HelloWorld 的 action 对应的类。框架初始化该 A ction 并且执行该 Action 类的 execute 方法; 3. execute 方法将信息放入 message 变量中,并返回成功。框架检查配置以查看当返回成功 时对应的页面。框架告诉容器来获得请求返回的结果页面 HelloWorld.jsp; 4. 在 HelloWorld.jsp 执行完后,标签调用 HelloWorld 的 Action 类中的 getMessage 方法来获得 message 的值,并将合并了值的页面呈现给用户; 5. 一个纯粹的 HTML 页面显示在用户的浏览器上。 四. 测试 Action 测试 Action 很简单,以下是上述 HelloWorld 的 Action 类的测试类的代码: package tutorial; im port junit.fram ework.TestCase; im port com .opensymphony .xwork2.Action; im port com .opensymphony .xwork2.ActionSupport; public class HelloWorldTest extends TestCase { public void testHelloWorld() throws Exception { HelloWorld hello_world = new HelloWorld(); String result = hello_world.execute(); assertTrue("Expected a success result!", ActionSupport.SUCCESS.equals(result)); assertTrue("Expected the default message!", HelloWorld.MESSAGE.equals(hello_world.getMessage())); } } 五. 需要记住的东西 本框架利用 Action 来处理 HTML 的表单以及其余请求。Action 返回一个结果的名字字符串, 例如 SUCCESS、ERROR 以及 INPUT 等,从 struts.xml 中获取映射信息。一个给定的结果字 符串将选择一个页面或其他资源(图片或 PDF)来返回给用户。 当一个 jsp 被载入的时候,通常有一些动态变化的元素需要 Action 来载入。为了更加容易的显 示动态数据,本框架提供了一些可以跟 HTML 配合使用的标签。 六. 问题汇总 对于出现启动失败,例如 Cannot locate the chosen ObjectFactory implementation: spring 等错误的朋友,请仔细检查你引入的包。关于需引入的包,请参见第一节(准备工作)。也希望 遇到其余问题的朋友留言或发 Email 给我,在此进行汇总。 Struts2 学习进阶(基础篇三)——使用 Struts2 的标签 说明:本文大部分内容翻译自 struts-2.0.8-all\struts-2.0.8\docs\docs\using-tags.html,并将 struts2 的标签作为附录补充,标签尚有部分未补充完。 在上篇(Hello World 篇)中,我们呈现了一个简单的欢迎界面。在本篇中,我们将创建链接 到应用其他 Action 的链接。 Web 应用程序与传统的 Web 站点有所不同,在 Web 应用程序中我们可以创建动态的返回。为 了更容易的在页面上获得动态数据,本框架提供了一些标签集。其中有些标签模拟了标准的 HT ML 标签,但是提供了一些额外功能。还有一些框架提供了非标准的、但非常有用的控制功能 。 Struts 标签的一个使用是创建一个到另外的 Web 资源的访问链接,特别是到本地的其他资源的 链接。 说明:虽然 HTML 为创建超链接提供了简单的标签,HTML 标签常常需要我们包括一些冗余的 信息。并且 HTML 标签不能很容易的得到本框架的动态数据。 一. 链接标签 在 Web 应用程序中的一个常用的功能是链接到其他页面,现在让我们为前面章节的欢迎界面添 加到其他 Action 的链接。 二. 代码 显示注册与登录的 jsp 的代码如下: <%@ taglib prefix="s" uri="/struts-tags" %> Welcome " rel="styleshee t" type="text/css"/>

Commands

运行效果如下: 另一个常用的功能是使用链接来改变语言,在前章的 HelloWorld 页面中,让我们改变用户的语 言,并根据对应的应用程序资源来呈现信息。代码如下:

Languages

  • en English
  • es Espanol
运行效果如下: 一. 代码是如何工作的? 上述例子中的“%{url}”将会被 s:url 标签来求得对应的值。在 Welcome 和 HelloWorld 页中,我 们使用了两种不同的链接标签。我们可以创建如下标签: l 资源链接 l 直接的链接 l 带参数的链接 下面让我们分别看一下它们的使用: 1. 资源链接 首先在 jsp 的 HEA D 元素中,我们使用 url 标签来将资源引入到页面中,代码如下: " rel="stylesheet" type="text/css"/> 注意:引用时绝对的。我们可以移动该页面到其他路经而不用担心相对路径。 2.直接链接 我们可以使用链接标签来定向到 Action,实例代码如下:
  • ">Register
  • 当链接运作的时候,链接标签能够自动追加正确的扩展,因此我们不需要在应用程序中嵌入。 这个标签也将会用会话 id 来编码链接的 URL,因此 Java 的会话在请求之间能够保持。 3.带有参数的链接 在上述的有关改变语言的 HelloWorld 页中,我们可以使用带有参数信息的 url 标签来创建带有 参数的链接,该段代码如下: en English param 标签将会在 Welcome 的 Action 的 url 后增加信息:“?request_locale=en”。这个标签接 着将“url”引用注入到超链接中。 说明:通过增加 param 标签能够增加任意数量的标签。 二. 通配符映射 在上述例子的 Welcome 页面中,除了链接之外尚未添加任何内容,我们不需要添加 Action 类。 但是,我们仍然需要添加一个映射,以便我们可以使用 action URI(如果我们向映射到 action, 而不是页面,我们在后面也可以很容易的添加 Action 类),映射代码如下: /tutorial/Welcome.jsp 当我们创建应用程序的时候,我们常常需要直接链接到页页面,为了使原型更加容易,我们可 以将 Welcome 的进入改为通配符,修改后的映射如下: /tutorial/{1}.jsp 这是代码是如何工作的呢? 如果找不到映射,本框架将会做如下工作: l 将“Welcome”映射为星号 l 将“Welcome”代替 result 中对应的“{1}” 同样的,如果在映射文件中找不到“Login”的映射,将会映射到“/tutorial /Login.jsp”页面。 说明:通配符映射能够使得你能够创建你自己的规约,以便你能够避免冗余的配置。 三. 数据输入表单 大多数应用程序都使用一些数据进入表单。Struts 标签使得输入表单更加容易,代码如下: <%@ taglib prefix="s" uri="/struts-tags" %> Login 执行效果如下: 代码是如何工作的呢? l JSP 标签在页面顶部引入了 Struts 的标签库 l Struts 标签:textfield、password 和 submit,每一个都写出了正确的 Lable 和控制类型 四. 需要记住的东西 编写 web 应用程序的最难的一部分是编写页面。本框架通过提供一系列的 Struts 标签使得编写 页面更加容易。Struts 标签能够获得框架提供的动态数据。标签减少了用来创建页面所需做的工 作。 附录一 ——标签使用指南 一. 通用标签 通用标签被用来在页面执行的时候,来控制执行流。这些标签同样允许数据不是从 Action 或者 值栈中提取,例如本地化、JavaBeans、包括额外的 URL 或 action 执行。 l 控制类标签提供了控制流,例如 if,else 和 iterator l 数据类标签允许数据操作或创建,例如 bean、push 和 i18n 控制类标签有 if、elseIf、 else、append、generator、iterator、merge、sort、subset。 数据类标签有 a、action、bean、date、debug、i18n、include、param、push、set、text、u rl、property。 分别介绍如下: 1. 控制类标签 1)if、elseif 和 else 描述:执行基本的控制流,if能单独使用,也可与 else、elseif 标签搭配使用。 参数: 名称 必选 默认值 求值 类型 描述 id 否 是 String id 用来引用元素。对于 UI 或者 form 标签,它的 意义等同于 HTML 的 id 属性 test 是 是 Boolean 用来决定标签体师是否显示的表达式 使用举例:
    Will Not Be Executed
    Will Be Executed
    Will Not Be Executed
    2)append 该标签的工作是追加迭代器来, 例如,如果有三个迭代器(每个迭代器有三个元素)需要追加,下面展示了这个追加迭代器是如 何排列的。 首先是进入第一个迭代器的第一个元素; 第二步是进入第一个迭代器的第二个元素; 第三步是进入第一个迭代器的第三个元素; 第四步是进入第二个迭代器的第一个元素; 第五步是进入第二个迭代器的第二个元素; 第六步是进入第二个迭代器的第三个元素; 第七步是进入第三个迭代器的第一个元素; 第八步是进入第三个迭代器的第二个元素; 第九步是进入第三个迭代器的第三个元素。 参数: 名称 必选 默认值 求值 类型 描述 id 否 是 String 如果提供了该 id 的值,将会具有追加迭代器存储 到堆栈上下文中的合成结果 使用举例: Action 类的代码: public class AppendIteratorTagAction extends ActionSupport { private List myList1; private List myList2; private List myList3; public String execute() throws Exception { myList1 = new ArrayList(); myList1.add("1"); myList1.add("2"); myList1.add("3"); myList2 = new ArrayList(); myList2.add("a"); myList2.add("b"); myList2.add("c"); myList3 = new ArrayList(); myList3.add("A"); myList3.add("B"); myList3.add("C"); return "done"; } public List getMyList1() { return myList1; } public List getMyList2() { return myList2; } public List getMyList3() { return myList3; } jsp 页面的代码: 3)generator 描述:创建一个基于提供的值的迭代器。 注意:产生的迭代器将常常被推入堆栈顶部,而在标签结束的时候被推出。 参数: 名称 必选 默认值 求值 类型 描述 converter 否 是 org.apache.struts2.uti l.IteratorGenerator.Co nverter 将从值中分析的字符串转换为一个对 象的转换器 count 否 是 Integer 在迭代器中的最大值 id 否 是 String 如果提供了 id,它将会用来存储产生 的迭代器到页面上下文 separator 是 是 String 分隔符用来将迭代器中的值分开 val 是 是 String 用来解析成迭代器的源 举例: 例 1:
       例一:   产生一个简单的迭代器               
    这里产生了一个迭代器,并且使用 iterator 标签将它打印出来 例二:
       产生一个带有 count 属性的迭代器               
    这里产生了一个迭代器,但是只有其中的三个元素是可用的,这三个分别是 aaa、 bbb 和 ccc 例三:
       产生一个带有 id 属性的迭代器      <%    Iterator i = (Iterator) pageContext.getAttribute("myAtt");    while(i.hasNext()) {        String s = (String) i.next(); %>        <%=s%> 
    <% } %>
    产生了一个迭代器,并且将它存入页面上下文的指定的 id(myAtt)属性中。 例四:
       带有 converter 属性的 generator 标签               
    public class GeneratorTagAction extends ActionSupport { .... public Converter getMyConverter() { return new Converter() { public Object convert(String value) throws Exception { return "converter-"+value; } }; } ... }
    产生的这个迭代器,它的每个元素由提供的转换器获得。在这个转换器中,只是 为每个元素增加了“converter-”。 this converter, it simply add "converter-" to each entries. 4)iterator 描述:迭代器将会迭代值。一个可迭代的值可以是 java.util.Collection,也可以是 java.util.Ite rator。 参数: 名称 必选 默认值 求值 类型 描述 id 否 是 String id 用来引用元素。对于 UI 和表单标签,它与 HT ML 的 id 标签相当 status 否 否 是 Boolean 如果该值被指定,一个迭代状态的实例将会在每一 个迭代中被推入堆栈中 value 否 是 String 用来进行迭代的迭代源,否则对象本身将会被放入 新的产生的列表中 举例: 下面的例子取回在值栈中的当前对象的 getDays()所返回的值,标签打印出当前 迭代器的值,代码如下:

    day is:

    在下面的例子中使用 Bean 标签并且将它存入 ActionContext 中。iterator 标签将会从 Action Context 中取回对象而后调用它的 getDays()方法。状态属性常常用来创建 IteratorStatus 对象, 在这个例子中,它的 odd()方法用来改变行的颜色。

    Days of the week
    下个例子将进一步展示 status 属性的使用,使用通过 OGNL 从 action 类取得的 DAO,成员的 迭代以及它们的使用(在安全的上下文中),last()方法中指明了当当前的对象是迭代器的最后 一个可用的对象,如果不是,我们需要使用逗号来分隔用户,代码如下: odd even"> , 下一个例子在一个 action collection 上迭代,并且将每一个迭代的值传给另一个 action。这里 的诀窍在于使用”[0]”。它获得当前的值并且将值传入 edit action。使用”[0]”与使用具有相同的效果(但是,后者,在 param 标签内部不起作用)。代码如下所示: 下例使用 iterator 标签来模拟一个简单的循环,循环了 5 次,代码如下: 5)merge 描述:它是 MergeIterator 标签的组件,它的工作是合并迭代器和对合并后的迭代器的后续调 用,它将使得每一个合并的迭代器有机会展示它的元素,接着下一个调用将会允许下一个迭代器 来展示它的元素。一旦最后一个迭代器已展示完它的所有元素,第一个迭代器又能够开始展示它 的元素(除非元素已经用尽)。 从内部来说,任务将委托给 MergeIteratorFilter 去做。 下面展示了 3 个列表的合并,其中每个列表有 3 个元素,步骤如下: 1. 展示第一个列表的第一个元素; 2. 展示第二个列表的第一个元素; 3. 展示第三个列表的第一个元素; 4. 展示第一个列表的第二个元素; 5. 展示第二个列表的第二个元素; 6. 展示第三个列表的第二个元素; 7. 展示第一个列表的第三个元素; 8. 展示第二个列表的第三个元素; 9. 展示第三个列表的第三个元素; 参数: 名称 必选 默认值 求值 类型 描述 id 否 是 String 合并后的迭代器的值将会存储在堆栈上下文的 id 举例: Action 类代码: public class MergeIteratorTagAction extends ActionSupport { private List myList1; private List myList2; private List myList3; public List getMyList1() { return myList1; } public List getMyList2() { return myList2; } public List getMyList3() { return myList3; } public String execute() throws Exception { myList1 = new ArrayList(); myList1.add("1"); myList1.add("2"); myList1.add("3"); myList2 = new ArrayList(); myList2.add("a"); myList2.add("b"); myList2.add("c"); myList3 = new ArrayList(); myList3.add("A"); myList3.add("B"); myList3.add("C"); return "done"; } } jsp 页代码: 二. UI 标签 三. 主题与模板标签 四. 标签引用 五. Ajax 标签 六. 标签语法 标签被设计用来显示动态的数据。为了创建输入域来显示属性“postalCode”,我们需要将“pos talCode”传给 textfield 标签。 下面创建了一个动态的输入域: 如果在值栈中存在“postalCode”属性,它的值将会被放入该输入域中。当输入被提交到框架之 后,它的值将会被放置到“postalCode”属性中。 有时候,我们想要传动态的数据到标签中。例如,我们可能需要用输入域来显示一个 label, 我们可能想要从应用程序的 message 资源中。相应地,框架将会解析在标签属性中的表达式。 因此在运行时我们能够合并动态的数据到标签的属性中。表达式是像“%{…}”这样的。任何一个 在其中嵌入的文本被作为表达式来计算。 使用一个表达式来设置 label 的例子: 表达式语言(OGNL)使得我们能够调用方法和计算属性。getText()方法由 ActionSupport(大 多数 Action 的基类)提供。我们可以调用任何一个表达式提供的方法,包括 getText 方法。 非 String 型的属性 HTTP 协议是基于文本的,但是有一些标签时非 String 类型的,例如 bool 和 int。为了能够 直接使用非 String 型的属性,本框架将所有的非 String 类型的属性作为一个表达式处理,在这 种情况下,你不需要使用任何转义符(但是,如果你使用了转义符,框架也会将其跳过)。 计算 boolean 型的例子: 一旦 multiple 属性跟一个 boolean 属性对应起来,框架不会将它作为一个 String 来解释,这 个值将会被作为一个表达式来计算并且自动地将其转换为 boolean 值。 因为很容易忘记哪个属性是 String,哪个属性是非 String 型的,你仍然可以使用转义符。 计算 boolean 值(带有转义符的): 带有属性的: 既带有转义符又带有属性的: 值是一个对象 更通常的情况是,属性值是自动放入的,因为 name 属性通常告诉框架哪个属性来调用方法来 set 值。但是,如果需要直接设置值,建议那个值是 Object 型而不是 String 型。 注意:因为值是非 String 型的,无论传入什么,都是将他作为表达式来处理——而不是一个字 面的 String。 可能导致错误的例子: 如果 textfield 被传入 “CA”,本框架将会名字为 getCa 的属性。通常情况下,这不是我们的本 意,我们想要做的是传送一个字符串。在表达式语言中,文字需要被置为单引号之间。 以正确的方式传入一个文字值: 另一种方法是使用 value=”‟CA‟”,但是在这种情况下,推荐使用表达式符号。 标签属性使用如下三种规则计算: 1. 所有的 String 属性都被解析成“%{…}”符号; 2. 所有的非 String 属性没有被解析,而是直接按照表达式来算; 3. 规则 2 的异常情况是非 String 型的属性使用转义符号“{%{}”,符号被作为多余的符号被 忽略,而只是计算内容。 表示式语言符号 1.在 Freemarker、Velocity 或者 JSTL 的表达式语言的 JavaBean 对象的标准文本

    Username: ${user.username}

    2.在值栈中的一个 username 属性 3. 引用值栈中的属性的另一种方式 es Espanol 4. 在 Session Context 中获得 user 对象的 userName 属性 5. 在一个静态 map 中,像("username","trillian")一样 Struts2 学习进阶(基础篇四)——编写 Action 说明:本文翻译自 struts-2.0.8-all\struts-2.0.8\docs\docs\coding-actions.html 在使用 Struts2 标签这一章节中,我们实现了登录表单,在编写 Action 章节中,我们解释登 录表单,并且根据不同的情况返回不同的结果码。 如果你已经编码完成,你可以用如下链接打开登录的 Action: http://localhost:8080/tutorial/Logon.action 并且输入一个合适的用户名和密码。因为你没有给这个 Action 任何的行为,映射重新显示 了默认的 Logon.jsp 页面。 让我们新增一个 Action 类来使得登录表单更加有意思。 一. 代码 像例子中所示的,我们能够检查用户名和密码的值。如果其中一者或两者都为空,返回输入 页面,否则,返回 SUCCESS 对应的页面,Logon.java 对应的代码如下: package tutorial; import com.opensymphony.xwork2.ActionSupport; public class Logon extends ActionSupport { public String execute() throws Exception { if (isInvalid(getUsername())) return INPUT; if (isInvalid(getPassword())) return INPUT; return SUCCESS; } private boolean isInvalid(String value) { return (value == null || value.length() == 0); } private String username; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } private String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } 二。代码是如何工作的? 框架自动为我们的 username 和 password 属性完成组装功能。我们所需要做的就是核对是否 其中有属性为空。 三. 需要记住的东西 在 web 应用程序中,Action 做了重量级的工作。Action 与数据库系统和业务规则引擎相互 作用,以便我们能够把一些简单的 HTML 变成复杂的、动态的 web 体验。 在做了这些工作之后,Action 返回了一个结果码来指明框架下一步应该做什么工作。通常, 下一步是跳转到成功结果页面,但在某些情况下,我们需要跳转到错误结果页。还在某一些 情况下,Action 不用担心产生的回应,仅仅决定哪些逻辑结果需要在下一步呈现。 Struts2 学习进阶(基础篇五)——选择结果 说明:本文翻译自 struts 自带的 doc,路经为:struts-2.0.8-all\struts-2.0.8\docs\docs\sel ecting-results.html 在编写 Action 这一章节中,我们创建了一个 Logon 类来测试输入。在本章中,我们将使这个 测试的结果起作用。 一. 选择一个“Input”结果 在一个 Action 执行一个请求后,一个提供用来作为这个请求回应的结果被选择。这个结果可 以简单的定向到一个 HTML 页面、一个 JSP 页面、一个 FreeMaker 或一个 Velocity 模板、或 者这个结果可能构造一个 PDF 或某些更加复杂的输出(例如 JasperReports)。在一个 action 映射中可能有多个可选的结果。为了指明那一个被选择,Action 类返回一个与正确结果相对应 的名字。 二. 代码 struts.xml 的代码如下所示: Menu /tutorial/Logon.jsp 三. 代码是如何工作的? 1. 如果你在表单中输入 username 和 password 属性,Logon Action 将会返回“success”; 2. 如果你其中一者或两者都没有输入值,Logon Action 将返回“input”,框架将会使用 Logo n.jsp 作为回应。 在 Hello World 章节中,我们的结果使用了默认的类型:Dispatcher。Dispatcher 定向到另 外的 web 资源。其它种类的视图能够被用来指明不同的结果类型。 Logon 映射为 success(默认的返回值)使用了一种不同的返回类型。“redirect-action”使用 Action 的名字作为参数,接着使客户端定向到一个新的 action。 四. 使用一个 Stub 页 当我们开发 web 应用程序的时候,我们常常需要进行 forward 引用——我们需要引用到一个 我们还没有开始写的 action。例如,在文章的第一部分中,下一步是跳转到“Menu”页面。如果 我们成功登录,我们就没有地方去了,因为“Menu”尚不存在。 解决这种问题的方法是创建一个 Stub“Menu”页。 Menu.jsp 的代码如下: Missing Feature

    This feature is under construction. Please try again in the next interation.

    这段代码是如何工作的呢? 1. 当登录 class 返回“Menu”时,框架将会将其与通配符映射对应起来; 2. 框架现在将会返回一个 stub 的“Menu.jsp”。 说明:如果你没有使用通配符,另一种注入一个丢失页面的方法就是指定一个元素。 五. 包括一个缺失页面 如果你页到页的建造一个应用程序,建立一个标准的缺失页面时对应的标准页面是非常必要 的。Menu.jsp 的代码如下: <%@ taglib prefix="s" uri="/struts-tags" %> 这段代码是如何工作的呢? 当需要展现 Menu.jsp 的时候,它将会包括标准的 Missing.jsp 的内容。 六. 需要记住的东西 本框架提供多种返回类型。一个 Action 能够通过名字选择正确的返回结果,而不用知道到底 是哪一种返回类型。 Struts2 学习进阶(基础篇六)——验证输入值 说明:该文翻译自 struts-2.0.8\docs\docs\validating-input.html。 在编写 Action 这一章节中,我们通过几行 java 代码来验证 username 和 password。当然, 在大型的应用程序中,这将是个很耗时的工作,即使这几行 java 代码也可能变成维护的重大负 担。 令人高兴的是,本框架提供了一个验证框架,这个验证框架能够对输入数据进行后台验证。 一. 代码 验证能够通过 XML 文档来描述,或者使用注解(annotations)。XML 文档的名称以 Actio n 的名字为开头,以“-validation”作为文件名后缀。当我们想要验证 Logon Action 的时候,我 们文件名可以命名为 Logon-validation.xml。Logon-validation.xml 的代码如下: Username is required Password is required 在 Logon.java 后我们创建一个 Logon-validation.xml 文件。并将上述粘贴到该文件中。 页面第一次显示的时候,我们不想引发验证。我们需要在被告诉有输入不正确前有机会输入 数据。通过验证的一种方式是找到一个 ActionSupport 基类提供的特定的“input”方法。为了这 样做,我们需要编辑 Welcome 页面和 Logon 的映射。 Welcome.jsp 的修改代码如下:
  • ">Sign On
  • ">Sign On
  • struts.xml 的修改代码如下: 二. 代码是如何工作的? 为了打开 Logon 表单,Welcome 页面涉及了 Logon_input。 1. 框架将这个引用于 Logon_*映射相匹配起来; 2. “method={1}”属性被“method=input”替换; 3. 框架调用了 Logon Action 类的 input 方法; 4. 因为“input”在一个特殊的方法的列表中,所以验证框架将不会调用; 5. 默认的 input 方法返回一个“input”作为返回结果; 6. 框架展现“Logon.jsp”来作为回应结果,没有带有任何的验证信息。 为了提交 Logon 表单,Login 页面引用了 Logon。 1. 框架为目标 Action——Logon 提供验证; 2. 找到 Logon-validation.xml 文件,框架为该类创建了一个验证对象,这个验证对象基于 X ML 文件; 3. 验证器对输入的数据产生作用; 4. 如果验证失败,错误信息被添加到内部序列中; 5. 当所有的验证器都已经执行后,如果框架发现有错误信息产生,它寻找“input”结果对应的 页面,而不调用 Action 类; 6. 如果通过验证,调用 Action 的方法,返回“success”对应的结果。 三. 需要记住的东西 框架提供了一个验证框架。一个输入域可以绑定一个验证器集合。如果验证失败,框架将会 返回输入信息页,并显示错误信息。为了通过验证,一个特殊的“input”方法将被调用,来代替 默认的“execute”方法。 Struts 学习进阶(基础篇七)——本地化输出 说明:本文翻译自:struts-2.0.8\docs\docs\validating-input.html 在验证输入这一小节中,我们使用验证框架来验证提交到表单的数据。在“本地化输出”这一 节中,我们将验证信息移到消息资源文件中。 当创建 web 应用程序的时候,我们发现我们在多个页面中常常使用一些相同的消息或字段标 签。如果我们的系统由不同语言的用户使用时,我们也想要本地化消息。 一. 本地化验证信息和属性值 让我们增加一个消息资源文件,并且在其中加入验证信息和字段标签。 1.代码 本框架将消息资源与类联系起来。为了为 Logon action 增加一个消息资源,我们需要将消 息资源文件命名为 Logon.properties,并且在 Logon Action 后设置它的 classpath。但是,大 多数人发现为某一个类使用一个单独的资源文件时间和低效率的工作。很多人更喜欢为一整个类 包增加一个消息资源文件。为了做到这样,我们可以简单的为某个包增加一个 paacage.propert ies 文件。例如。我们为 tutorial 包增加一个资源文件 tutorial/package.properties。该文件内 容如下: requiredstring = $\{getText(fieldName)} is required. password = Password username = User Name 我们还需要改变一下验证器和 Logon 页面。 Logon-validation.xml 修改的地方: Username is required Password is required Logon,jsp 修改的地方如下: 2. 代码是如何工作的? 1)“key”属性告诉验证器为一个消息资源捆绑验证; 2) 在资源捆绑中,表达式:${getText(fieldName)}告诉框架在资源文件中查找字段名。这 种方式下我们能够为所有的非空验证使用相同的默认信息; 3)相似地,在文本域中,表达式:%{getText(„password‟)}告诉框架在资源文件中寻找“pas sword”。 二. 本地化其余的信息 其余的页面元素也能够被本地化。例如,我们需要在资源文件中增加“Hello World”和“Missi ng page”这两个消息。 1. 代码 tutorial/package.properties: # ... HelloWorld.message = Struts is up and running ... Missing.message = This feature is under construction. Please try agai n in the next interation. 这对 HelloWorld 是可运行的,因为 Hello World 已经存在于包中。但是它对于默认的 Miss ing action 是不可用的,除非你将我们的基类加入到 tutorial 包中。 TutorialSupport.java 的代码如下: package tutorial; import com.opensymphony.xwork2.ActionSupport; public class TutorialSupport extends ActionSupport {} 并且还需要更新一下 struts.xml 默认的通配符映射,如下: /{1}.jsp 现在,我们可以更新 HelloWorld.jsp 和 Missing.jsp 来查找信息。 Missing.jsp 的代码如下: This feature is under construction. Please try again in the next interation. 在 HelloWorld 的情况下,我们从 Action 类设置消息。让我们更新一下 class,使用资源文件 来代替它。HelloWorld 的代码如下: package tutorial; public class HelloWorld extends ExampleSupport { public static final String MESSAGE = "HelloWorld.message"; public String execute() throws Exception { setMessage(getText(MESSAGE)); return SUCCESS; } // } 2. 代码是如何工作的? 1)对于 Missing.jsp,我们使用 text 标签来查找资源文件中的消息; 2) 在 HelloWorld 中,我们在 Action 类中使用 getText()方法来获得消息; 3) 在 HelloWorld.jsp 中,只是显示由 Action 类设置的消息,所以不要做任何改变。 三. 需要记住的东西 框架支持国际化。为了本地化应用,我们增加了资源文件,并且更新某些元素或标签来应用 资源文件中的资源而不是静态的文本。 Struts2 学习进阶(实例篇一)——struts2-blank-2.0.8 实例学习 说明:本文经过笔者对 struts2.0.8 自带的实例 struts2-blank-2.0.8 学习而写,对该例子进行了 部分修改,希望对广大象要学习 struts2 的朋友有所帮助。 一. 实例说明 本例是 Struts2 的简单实例,通过本工程的学习,我们将会对 struts2 的表单以及表单验证有一 个初步的认识、了解 struts2 的配置以及初探 Struts2 的本地化输出。 二. 编码准备 1. 包的引入 在 MyEclipse 或 NetBeans 中建立 web 工程,将所需的包放入 WebRoot/lib 目录中,本实例所 需的包有: commons-logging-1.1.jar freemarker-2.3.8.jar ognl-2.6.11.jar struts2-core-2.0.8.jar xwork-2.0.3.jar 这些包在 struts-2.0.8-all\struts-2.0.8\lib 目录下都可以找到,请读者自行下载。 2. web.xm l 的配置 要使 struts 能正常工作,需修改 web.xml 的内容,为其增加 struts2 的 FilterDispatcher,修改 后的 web.xml 的内容如下: Struts Blank struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* index.html 3. 建立源码目录和 jsp 存放目录 在 src 目录下建立 example 文件夹,用于存放本实例的 java 文件等。在 WebRoot 文件夹下建 立子文件夹 example,用于存放本工程的 jsp 文件。 三. 编码 1. Welcome.jsp 和 Login.jsp 的编写 首先我们建立 Welcome.jsp,该文件包含两个链接,点击“登录”链接后跳转到登录信息输入页面, 点击“注册”按钮跳转到注册页,为了学习 struts2 配置中的通配符使用,我们暂不实现注册功能。 Welcome.jsp 的代码如下: <%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> 欢迎界面 " rel="stylesheet" type="text/css"/>

    导航

    在该页面的顶部,我们需要将 struts2 的标签库引入,语句为:<%@ taglib prefix="s" uri="/ struts-tags" %> 在该页面,主要用到 struts2 的标签,该页面主要用到该标签的两个属性,分别为 value 和 action,其中 action 属性表示用 action 来产生 url,而 value 表示使用的目标值。在页面上 点击“查看源文件”按钮,可看到生成的语句分别变为: 由此可知使用该标签时,struts2 会自动为我们带上下文路径,对于加了属性 action 的 标签,后面会自动带上“.action”作为后缀。 点击“登录”链接后,跳转到 Login.jsp 页面,该页包含一个登录表单,让用户输入用户名和密码 信息,用户点击提交按钮,跳转到指定的 Action——Login 进行处理。Login.jsp 的内容如下: <%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> 登录 该页用到 Struts2 的表单标签的 action 属性表示表单提交后跳转的 action 的名称,此处为 Login,该标签最终将生 成 HTML 的 form; 标签类同于 HTML 的,其中 name 表示属性域的名称,lab el 表示其前的提示名; 标签类同于 HTML 的,其 name 和 label 类同于< s:textfield>,在此略。 2. 配置文件 struts.xm l 和 example.xml 在上述 jsp 页面,我们需跳转到两个 Action 地址,需在 struts2 的配置文件中配置,因当工程变 大时,一个庞大的 struts2 的配置极难维护,建议按包路径分开配置文件,所以本实例除了 stru ts.xml 配置文件外,还新增了一个额外的配置文件 example.xml。该文件在 struts.xml 中引用。 struts.xml 放在 src 目录下,该文件的内容如下: 可看到该文件通过将 example.xml 也作为 st ruts2 的配置文件。 接下来,让我们看看 example.xml 的配置: /example/Login.jsp Menu /example/{1}.jsp 3. Login 和 Exam pleSupport 类以及验证配置类 Login-validation.xml 的编写 在配置文件 example.xml 中,定义了两个 Action,下面我们用代码来实现这两个 Action 首先让我们来看看 ExampleSupport 这个 Action,这个 Action 不做任何操作,集成自 ActionS upport,是本工程的各 Action 类的基类,该类的代码如下: package example; import com.opensymphony.xwork2.ActionSupport; public class ExampleSupport extends ActionSupport { } 接着让我们来看看 Login 这个 Action,该类继承自 ExampleSupport 类,该 Action 需实现的业 务逻辑如下: 1) 当用户名(username)或密码(password)有一者或两者为空时,登录不成功,跳转 到登录信息输入页面; 2) 当用户名(username)和密码(password)都不为空时,登录成功,跳转到主菜单页。 对于用户名和密码的验证,我们可以先考虑在 Login 类中用代码实现的方式,此时该类的代码 如下: package example; public class Login extends ExampleSupport { public String execute() throws Exception { if (isInvalid(getUsername())) return INPUT; if (isInvalid(getPassword())) return INPUT; return SUCCESS; } private boolean isInvalid(String value) { return (value == null || value.length() == 0); } private String username; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } private String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } 当工程变得愈发复杂时,这一小段一小段验证代码将会变得难以维护,出于此 原因,我们可以考虑采用 struts2 提供的验证机制来实现。在 src 目录下建立实 现验证的 xml 文件 Login-validation.xml,为 Login Action 中的 username 和 p assword 属性增加非空验证,验证配置如下: 当验证未通过时,将不会进入 Login Action 中的 execute 方法,此时可删除掉 Login 这个 Acti on 中的验证内容,该类的 execute 方法直接跳转到 SUCCESS 即可,修改后的代码略。 4. 本地化输出——资源文件 package.properties 为了本地化的输出验证错误信息,我们可以将参数信息和错误信息放入资源文件中,资源文件 p ackage.properties 位于 src/example 目录下,内容如下: requiredstring = ${getText(fieldName)}不能为空. password = 密码 username = 用户名 Missing.message = 该部分尚未构建,请稍候访问... 在 src/example 目下下建立对应的中文资源文件 package_zh_CN.properties,为了避免中文乱 码问题,我们编写一个批处理文件 code.bat 来对 package.properties 进行编码处理,主要用到 native2ascii 命令,其内容如下: del package_zh_CN.properties copy package.properties package_zh_CN.properties.gbk native2ascii -encoding GBK package_zh_CN.properties.gbk package_zh_CN.properties del package_zh_CN.properties.gbk del *.bak 运行该批处理文件,可在 package_zh_CN.properties 中可看到编码后的资源文件信息,如下 : requiredstring = ${getText(fieldName)}\u4e0d\u80fd\u4e3a\u7a7a. password = \u5bc6\u7801 username = \u7528\u6237\u540d Missing.message = \u8be5\u90e8\u5206\u5c1a\u672a\u6784\u5efa\uff0c\u8bf7\u7a0d\ u5019\u8bbf\u95ee... 5. Register.jsp 和 Missing.jsp 的编写 在 2 中的 example.xml 中,我们配置了通配符映射,在 Welcome.jsp 中,我们使用 ">注册 其中的 Register 在 example 中找不到相关映射,于是在用户点击“注册”按钮时,将映射到通配 符所映射的 Action:example. ExampleSupport.而后跳转到 Register.jsp 页面,其代码如下: <%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> 该页面包含 Missing.jsp 页面,其代码如下: <%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> 未构建页面

    四.总结 到此为止,我们的实例已构建完,可通过浏览器访问:http://localhost:8080/struts2-blank-2. 0.8/example/Welcome.jsp 看到我们的劳动成果。下面总结一下我们在该实例中学到的东西。 1. 常用的一些标签的使用 在本实例中,我们学习了以及的使用。 2. 表单数据的验证 本文描述了一个简单的表单的数据非空验证。 3. 本地化输出错误提示信息 在验证失败时,用资源文件来输出错误提示信息。 4.Strut2 配置文件中通配符的使用 对于某些地址,我们可以使用在 struts2 的配置通配符来使其映射到某个 Action 中去。

    下载文档,方便阅读与编辑

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

    需要 5 金币 [ 分享文档获得金币 ] 0 人已下载

    下载文档

    相关文档