MyEclipse6Java开发中文教程 <param name="location>/HelloWorld jsp </param> </resulte 甚至,最后还可以省略掉 param元素,称为最简单的缩写方式(这在 Struts2自带的示 例应用中大量存在) <result/ HelloWorld jsp</result> 不但对于单个的 result定义可以使用简写形式,对于多个也同样能够使用,例如下面的: <result name="input>/Login jsp</result> <result name="success">/success. jsp</result> 就可以缩写为: <result name=" input">/ Login jsp</result> <result/success jsp</result> 另外,还有一种结果类型用的比较多,那就是重定向,定的写法是 type="redirect-action">Menus/result 最后,类似于 Struts1里面的 GlobalFowards,Stus2也支持将某些通用的 Result 定义成为全局的,即 Global results <global-results> <result name="error>/Error jsps/result <result name="invalid. token"/Error jsp</result> </global-results> 最后,我们来到表示层的JSP页面 HelloWorld. jsp,可以看到 Action类的属性已经放 入了 request对象中,这样我们即可以通过 Struts的标签 property来访问,也可以通过EL 表达式来读取。对于实际开发,我们强烈建议读者在能用EL表达式和JSTL的时候就用它 而抛弃框架自带的那些非标准和容易变动的自定义标签库。为什么呢?举个简单的例子,假 设我们以前的项目全是用 Struts1的标签库做的,现在想把它改用 Struts2来实现,你可以 想想有多大的工作量啊,所有用到Suts1标签的都得费劲脑汁找到Sus2下的对应物。 但是呢,如果当时就采用了EL和JsTL,现在你就只需要改一部分标签就可以了。这就是 直提倡的面向标准和尽量独立于框架编程的好处,可维护性和移植性是远远好于绑定某个 特定标签库的,开发不能只看眼前,要尽量多考虑以后的扩展和维护。好了,我们本段要强 调的就是Acon类的属性可以配合EL表达式来开发,无须我们自己再亲自编写类似于 request setAttribute0这样的代码了,框架本身已经做好了大部分的工作,将我们和底层的 Servlet类库隔离开来。 123.3使用国际化消息 其实在 Struts1中就支持国际化的消息显示,例如当网站分别被运行在中英文环境下的 浏览器访问时,会使用不同的资源文件来显示中文或者英文的界面,但是那时候的支持相对 来说比较麻烦。而在 Struts2中,国际化消息支持要简单的多。我们仍以上文的项目 struts2heo为基础,加入国际化支持功能 首先我们修改JSP文件,使其能显示国际化的消息,修改后的 HelloWorld. jsp源代码 清单如下 刘长炯著
MyEclipse 6 Java 开发中文教程 16 刘长炯著 <result> <param name="location">/HelloWorld.jsp </param> </result> 。甚至,最后还可以省略掉 param 元素,称为最简单的缩写方式(这在 Struts 2 自带的示 例应用中大量存在): <result>/ HelloWorld.jsp</result> 。 不但对于单个的 result 定义可以使用简写形式,对于多个也同样能够使用,例如下面的: <result name="input">/Login.jsp</result> <result name="success">/success.jsp</result> 就可以缩写为: <result name="input">/Login.jsp</result> <result>/success.jsp</result> 。 另外,还有一种结果类型用的比较多,那就是重定向,它的写法是:<result type="redirect-action">Menu</result>。 最后,类似于 Struts 1 里面的 GlobalFowards,Struts 2 也支持将某些通用的 Result 定义成为全局的,即 Global Results: <global-results> <result name="error">/Error.jsp</result> <result name="invalid.token">/Error.jsp</result> </global-results> 。 最后,我们来到表示层的 JSP 页面 HelloWorld.jsp,可以看到 Action 类的属性已经放 入了 request 对象中,这样我们即可以通过 Struts 的标签 property 来访问,也可以通过 EL 表达式来读取。对于实际开发,我们强烈建议读者在能用 EL 表达式和 JSTL 的时候就用它, 而抛弃框架自带的那些非标准和容易变动的自定义标签库。为什么呢?举个简单的例子,假 设我们以前的项目全是用 Struts 1 的标签库做的,现在想把它改用 Struts 2 来实现,你可以 想想有多大的工作量啊,所有用到 Struts 1 标签的都得费劲脑汁找到 Struts 2 下的对应物。 但是呢,如果当时就采用了 EL 和 JSTL,现在你就只需要改一部分标签就可以了。这就是 一直提倡的面向标准和尽量独立于框架编程的好处,可维护性和移植性是远远好于绑定某个 特定标签库的,开发不能只看眼前,要尽量多考虑以后的扩展和维护。好了,我们本段要强 调的就是 Action 类的属性可以配合 EL 表达式来开发,无须我们自己再亲自编写类似于 request.setAttribute()这样的代码了,框架本身已经做好了大部分的工作,将我们和底层的 Servlet 类库隔离开来。 12.3.3 使用国际化消息 其实在 Struts 1 中就支持国际化的消息显示,例如当网站分别被运行在中英文环境下的 浏览器访问时,会使用不同的资源文件来显示中文或者英文的界面,但是那时候的支持相对 来说比较麻烦。而在 Struts 2 中,国际化消息支持要简单的多。我们仍以上文的项目 struts2hello 为基础,加入国际化支持功能。 首先我们修改 JSP 文件,使其能显示国际化的消息,修改后的 HelloWorld.jsp 源代码 清单如下:
MyEclipse6Java开发中文教程 8@ page contentType="text/html; charset=GBK"8> <号@tag1 ib pref主x="s"uri="/ struts-tags"号> <html> <head> <title><s: text name="HelloWorld. message></title> </head> <body> <h2><s: property value="message"/></h2> s(message) </body> </html> 属性的取值 HelloWorld. message则是对应的属性文件的主键。 现在我们需要在Sc下的 example包下新建一个属性文件,名为 package properties 先在 Package Explorer视图中选择sc下的 example包,接着点击右键选择菜单New> File,然后在文件名中输入 package, properties,接着在打开的编辑器中键入以下内容: HelloWorld. message= struts 2 is up and running 此时重新发布项目后,启动1mat服务器,接着在正浏览器键入地址 http://ocalhost:8080/struts2hello/he!lloWorldaction并按下回车键后,即可看到浏览器的标 题显示: Struts2 is up and running…。这说明Suts2会自动读取这个文件中的内容并把 它作为传递给JSP页面来显示 如果要显示简体中文的消息怎么办呢?那就再同样的位置再新建一份文件,名为 package zh CN properties,内容如下 HelloWorld. message= struts 2 \u542f\u52a8 \u5e76\u8fd0\u884c 。右侧这段文字是Java支持的转义 Unicode字符,它对应的汉字是:Suts2启动并运行。 可是怎么从汉字得到这段转义字符呢?答案是使用JDK的bin目录下带的一个命令行的工 具叫 native2 ascll. exe。现在大家可以选择 Windows的菜单开始>运行,在弹出的对话框 中输入cmd,之质点击确定按钮,启动命令行。如果您己经设置好了系统的PATH变量 可以键入 native2asci,否则呢,就键入c:ydk1.6 oVbinvnative2asci,之后按下回车,就可 以运行这个王具了。这个工具到底如何使用呢?很简单,大家在上面键入汉字,之后按下回 车键,然后对应的转义字符就显示出来了。这个过程如下所示: C: \Documents and SettingslBean Soft>c: ljdk1.6.0\bin native2ascil Struts2启动并运行 Struts 2 \u542fu52a8\u 5e 76lu8fdO\u884c 。可是转义后的字符怎么复制出来呢?在这个命令行窗口上点击右键,选择菜单标记,之后 用鼠标拖住不放选中字符Sus2W542u52a8u5e76u8fu0u884c,使之颜色反白,然后 呢,按下键盘上的回车键(即 Enter键),就能把它复制到 Windows的剪贴板上了,之后再 回到 MyEclipse的编辑器窗口,按下快捷键ctrl+V粘贴就可以了。之后再次重新发布并 运行,在浏览器中访问,就可以看到标题显示成了中文。如果大家用了一些英文的操作系统 或者设置某些浏览器的地区选择为英文,这时候再访问呢,也就能看到对应的英文提示消息 了,这样,就实现了消息的国际化。 刘长炯著
MyEclipse 6 Java 开发中文教程 17 刘长炯著 <%@ page contentType="text/html; charset=GBK" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title><s:text name="HelloWorld.message"/></title> </head> <body> <h2><s:property value="message"/></h2> ${message} </body> </html> 。代码中粗斜体的部分就是一个国际化的标题,text 标签用来显示国际化消息,而 name 属性的取值 HelloWorld.message 则是对应的属性文件的主键。 现在我们需要在 src 下的 example 包下新建一个属性文件,名为 package.properties。 先在 Package Explorer 视图中选择 src 下的 example 包,接着点击右键选择菜单 New > File,然后在文件名中输入 package.properties,接着在打开的编辑器中键入以下内容: HelloWorld.message= Struts 2 is up and running ... 。此时重新发布项目后,启动 Tomcat 服务器,接着在 IE 浏览器键入地址 http://localhost:8080/struts2hello/HelloWorld.action并按下回车键后,即可看到浏览器的标 题显示:Struts 2 is up and running ...。这说明Struts 2 会自动读取这个文件中的内容并把 它作为传递给JSP页面来显示。 如果要显示简体中文的消息怎么办呢?那就再同样的位置再新建一份文件,名为 package_zh_CN.properties,内容如下: HelloWorld.message= Struts 2 \u542f\u52a8\u5e76\u8fd0\u884c 。右侧这段文字是 Java 支持的转义 Unicode 字符,它对应的汉字是:Struts 2 启动并运行。 可是怎么从汉字得到这段转义字符呢?答案是使用 JDK 的 bin 目录下带的一个命令行的工 具叫 native2ascii.exe。现在大家可以选择 Windows 的菜单 开始 > 运行,在弹出的对话框 中输入 cmd,之后点击确定按钮,启动命令行。如果您已经设置好了系统的 PATH 变量, 可以键入 native2ascii,否则呢,就键入 c:\jdk1.6.0\bin\native2ascii,之后按下回车,就可 以运行这个工具了。这个工具到底如何使用呢?很简单,大家在上面键入汉字,之后按下回 车键,然后对应的转义字符就显示出来了。这个过程如下所示: C:\Documents and Settings\BeanSoft>c:\jdk1.6.0\bin\native2ascii Struts 2 启动并运行 Struts 2 \u542f\u52a8\u5e76\u8fd0\u884c 。可是转义后的字符怎么复制出来呢?在这个命令行窗口上点击右键,选择菜单标记,之后 用鼠标拖住不放选中字符 Struts 2 \u542f\u52a8\u5e76\u8fd0\u884c,使之颜色反白,然后 呢,按下键盘上的回车键(即 Enter 键),就能把它复制到 Windows 的剪贴板上了,之后再 回到 MyEclipse 的编辑器窗口,按下快捷键 Ctrl + V 粘贴就可以了。之后再次重新发布并 运行,在浏览器中访问,就可以看到标题显示成了中文。如果大家用了一些英文的操作系统 或者设置某些浏览器的地区选择为英文,这时候再访问呢,也就能看到对应的英文提示消息 了,这样,就实现了消息的国际化
MyEclipse6Java开发中文教程 那么在 Action类中能不能使用这个国际化的资源文件呢?答案是:只要继承自 Action Support类就可以,它提供了一个 get Text( String key)的方法,可以让我们方便的读 取国际化的消息文件。其实它提供了一系列的方法来支持读取国际化消息文件,例如 com. opensymphony. work2 Action Support getText( String, String)等等多个重载过的方法。 不过不讲那么多,我们来看看经过改写的 HelloworldAction. java的源代码清单: package example import com opensymphony xwork2. ActionSupport public class HelloWorld extends ActionSupport I public String execute() throws Exception setMessage("你好! struts2!") System. out. printin(getText(HelloWorld. message"); return suCcEss private string message; public string getMessage () return message public void setMessage(String message) this message message 。好了,重新发布并运行,在浏览器中访问,就可以看到 MyEclipse的 Console视图中显 示出来一行汉字: Struts2启动并运行 这说明成功的读取了国际化的消息文件。可以看到除了创建国际化资源文件挺麻烦外,其 它过程还是很简单的。不过读者可以使用一些工具来很容易的创建国际化资源文件,例如 些 Resouce Bundle编辑的 Eclipse插件,或者使用一些单独的图形界面的工具。请浏览本 章的参考资料节来获得更多信息 那么,如果我们打算在页面中显示国际化消息的时候带参数,那又该如何呢?首先,我 们在文件 package_zh_CN properties中新加入一行带有参数的国际化消息文本 Helloworld. welcome=\u6b22\u8fce\u4f60 (0) 它对应的原始字符串是:欢迎你但0}。如果需要更多参数,依次写入(1}{2}等等,以大括号 扩起来的数字作为占位符,接着在JSP页面加入下面的代码 <s: text name="HelloWorld. welcome <s: param>张三</s: param> </s: text> 运行后,页面将会显示:欧迎你张彐如果还有其它参数呢(例如还有{等等),就继 续加入更多的<s; paran>子标签。 Action类中呢,则可以使用 getText( String key,Stig参 数1)等方法来调用,例如这里可以使用方法:geex( Helloworld we/come","张三)。如果 是很多参数呢,可以使用另一个方法: getText( String key,List参数列表。关于国际化和 Resouce Bundle的更多内容,请参考本章结束的参考资料一节。 刘长炯著
MyEclipse 6 Java 开发中文教程 18 刘长炯著 那么在 Action 类中能不能使用这个国际化的资源文件呢?答案是:只要继承自 ActionSupport 类就可以,它提供了一个 getText(String key)的方法,可以让我们方便的读 取国际化的消息文件。其实它提供了一系列的方法来支持读取国际化消息文件,例如 com.opensymphony.xwork2.ActionSupport.getText(String, String)等等多个重载过的方法。 不过不讲那么多,我们来看看经过改写的 HelloWorldAction.java 的源代码清单: package example; import com.opensymphony.xwork2.ActionSupport; public class HelloWorld extends ActionSupport { public String execute() throws Exception { setMessage("你好!Struts 2!"); System.out.println(getText("HelloWorld.message")); return SUCCESS; } private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } 。好了,重新发布并运行,在浏览器中访问,就可以看到 MyEclipse 的 Console 视图中显 示出来一行汉字: Struts 2 启动并运行 。这说明成功的读取了国际化的消息文件。可以看到除了创建国际化资源文件挺麻烦外,其 它过程还是很简单的。不过读者可以使用一些工具来很容易的创建国际化资源文件,例如一 些 ResouceBundle 编辑的 Eclipse 插件,或者使用一些单独的图形界面的工具。请浏览本 章的参考资料一节来获得更多信息。 那么,如果我们打算在页面中显示国际化消息的时候带参数,那又该如何呢?首先,我 们在文件 package_zh_CN.properties 中新加入一行带有参数的国际化消息文本: HelloWorld.welcome=\u6b22\u8fce\u4f60 {0} 它对应的原始字符串是:欢迎你 {0}。如果需要更多参数,依次写入{1},{2}等等,以大括号 扩起来的数字作为占位符,接着在 JSP 页面加入下面的代码: <s:text name="HelloWorld.welcome"> <s:param>张三</s:param> </s:text> 。运行后,页面将会显示:欢迎你 张三。如果还有其它参数呢(例如还有{1}等等),就继 续加入更多的<s:param>子标签。Action 类中呢,则可以使用 getText(String key,String 参 数 1)等方法来调用,例如这里可以使用方法:getText("HelloWorld.welcome",”张三”)。如果 是很多参数呢,可以使用另一个方法:getText(String key,List 参数列表)。关于国际化和 ResouceBundle 的更多内容,请参考本章结束的参考资料一节
MyEclipse6Java开发中文教程 Struts2的国际化除了显示文字以外,还可以加在表单,表单验证等许多场合,在后面 我们还会继续讨论这个问题。 1234基于PoJo的 Action开发 如1231节后半部分所述,Acon类可以选择继承自 Action Support类或者实现 Action接口。然而, Struts2还支持POJO形式的也就是普通Java类的 Action,开发人员 只要在编写的类中提供编写 public java. lang, String execute( throws java, lang Exception这 个方法就可以了,无需继承或者实现其它任何接口,这一点和JSF是非常像的。这样大大 的方便了开发人员,从而使 Action类更加的易于测试和独立于框架本身,便于以后的重用 和迁移。 那么现在呢,我们就将上面的 HelloWorld的 Action例子用POJO的方式改写。首先 新建Java类文件 example. HelloPOJO。选择菜单Fie>New> Class,或者点击工具栏上 的G,按钮,在打开的新建类的对话框中输入 Package为 example,Name为 HelloPojo, 点击 Finish按钮后即可将此类创建。现在我们将其代码修改为如下所示 public class HelloPOJO public String execute() throws Exception setMes sage("你好! Struts2PoJo!"); private string messags return message,Sage( public string getMes public void setMessage(string message) this, message messagei 可以看到这个类没有继承自任何特定的类或者实现任何接口,只是一个普通的Java类而 已。我们给这个类加入了一个名为 message的属性,并在业务方法 execute0执行了设置属 性 message的值为字符串"你好!Suts2POJo!"的操作,之后就返回一个字符 串 success",它相当于一个导航地址,指示了表示层所在的位置。 接下来呢,就是在 struts. xm中加入一个acon定义,如下代码清单中粗斜体部分所 < xml vers coding=UTF-8?> <I DOCTYPE struts PuBLIC -//Apache Software Foundation//DTD Struts Configuration 2.0//EN http://struts.apacheorg/dtds/struts-2.0.dtd" 刘长炯著
MyEclipse 6 Java 开发中文教程 19 刘长炯著 Struts 2 的国际化除了显示文字以外,还可以加在表单,表单验证等许多场合,在后面 我们还会继续讨论这个问题。 12.3.4 基于 POJO 的 Action 开发 如 12.3.1 一节后半部分所述,Action 类可以选择继承自 ActionSupport 类或者实现 Action 接口。然而,Struts 2 还支持 POJO 形式的也就是普通 Java 类的 Action,开发人员 只要在编写的类中提供编写public java.lang.String execute() throws java.lang.Exception这 个方法就可以了,无需继承或者实现其它任何接口,这一点和 JSF 是非常像的。这样大大 的方便了开发人员,从而使 Action 类更加的易于测试和独立于框架本身,便于以后的重用 和迁移。 那么现在呢,我们就将上面的 HelloWorld 的 Action 例子用 POJO 的方式改写。首先, 新建 Java 类文件 example.HelloPOJO。选择菜单 File > New > Class,或者点击工具栏上 的 按钮,在打开的新建类的对话框中,输入 Package 为 example,Name 为 HelloPOJO, 点击 Finish 按钮后即可将此类创建。现在我们将其代码修改为如下所示: package example; public class HelloPOJO { public String execute() throws Exception { setMessage("你好!Struts 2 POJO!"); return "success"; } private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } 。可以看到这个类没有继承自任何特定的类或者实现任何接口,只是一个普通的 Java 类而 已。我们给这个类加入了一个名为 message 的属性,并在业务方法 execute()执行了设置属 性 message 的值为字符串"你好!Struts 2 POJO!"的操作,之后就返回一个字符 串”success”,它相当于一个导航地址,指示了表示层所在的位置。 接下来呢,就是在 struts.xml 中加入一个 action 定义,如下代码清单中粗斜体部分所 示: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
MyEclipse6Java开发中文教程 <package name="default" extends="struts-default !-在这里添加 Action定义 <action name="HelloPOJo"class="example. HelloPOJO"> action> </struts> 新加入的 action的name为 HelloPojo,它的类是我们刚刚编写的 example. HelloPOJO, 同时它显示的结果页面是:He| oPOJO. jsp。 好了,大家可以仿照上面1231一节介绍的过程来创建 HelloPoJo. jsp,其源码为 8g page contentType="text/html; charset=GBK"8> <html> <head> <tit1e>POJo示例</tit </head> <body> <h2>s(message)</h2> </html> 这个页面就是从请求的属性中使用EL表达式将 message属性的值读取出来,而它同样 还是由框架从Acon类中读取然后放入 request对象的。在这里为了展示PoJO+EL表达 式开发,我们没有使用任何 Struts2特定的类或者标记库 最后,将项目重新发布后运行,打开网络浏览器,键入如下的地址来进行测试 http://localhost:8o80/strutshello/HelloPoJoaction。如果你看到页面上出现了一行粗字: 你好! Struts2PoJo! 那么我们的POJO应用就大功告成了 注意:需要提示一下大家的是,如果这时候你企图在JSP页面中使用text标签来显示 国际化消息,会发现无法读取,而我们的 Action类中也自然无法读取国际化消息文件了, 这时因为我们的 Action类中没有这样的功能。这种情况下,你必须继承自 Action Support 123.5自定义 Action方法和映射通配符 1.自定义 Action方法 虽然 Action类定义了一个接口,里面有一个方法 execute(O,然而这却并不是必须的 开发人员完全可以自己定义入口方法的名字,还可以轻易的将多个业务方法合并到一个 Action类中,这给与开发人员极大的灵活性和自由度。开发人员只需要在配置文件的 action 定义中添加属性 method,让它的值为类中存在的方法名,即可在访问此地址时执行对应的 方法。下面我们就在上面的例子的基础上来展示这个过程。首先让我们仿照上面1231 刘长炯著
MyEclipse 6 Java 开发中文教程 20 刘长炯著 <struts> <package name="default" extends="struts-default" > <!-- 在这里添加Action定义 --> <action name="HelloPOJO" class="example.HelloPOJO"> <result>/HelloPOJO.jsp</result> </action> </package> </struts> 。新加入的 action 的 name 为 HelloPOJO,它的类是我们刚刚编写的 example.HelloPOJO, 同时它显示的结果页面是:/HelloPOJO.jsp。 好了,大家可以仿照上面 12.3.1 一节介绍的过程来创建 HelloPOJO.jsp,其源码为: <%@ page contentType="text/html; charset=GBK" %> <html> <head> <title>POJO 示例</title> </head> <body> <h2>${message}</h2> </body> </html> 。这个页面就是从请求的属性中使用 EL 表达式将 message 属性的值读取出来,而它同样 还是由框架从 Action 类中读取然后放入 request 对象的。在这里为了展示 POJO+EL 表达 式开发,我们没有使用任何 Struts 2 特定的类或者标记库。 最后,将项目重新发布后运行,打开网络浏览器,键入如下的地址来进行测试: http://localhost:8080/struts2hello/HelloPOJO.action。如果你看到页面上出现了一行粗字: 你好!Struts 2 POJO! 那么我们的 POJO 应用就大功告成了。 注意:需要提示一下大家的是,如果这时候你企图在 JSP 页面中使用 text 标签来显示 国际化消息,会发现无法读取,而我们的 Action 类中也自然无法读取国际化消息文件了, 这时因为我们的 Action 类中没有这样的功能。这种情况下,你必须继承自 ActionSupport 类。 12.3.5 自定义 Action 方法和映射通配符 1. 自定义 Action 方法 虽然 Action 类定义了一个接口,里面有一个方法 execute(),然而这却并不是必须的。 开发人员完全可以自己定义入口方法的名字,还可以轻易的将多个业务方法合并到一个 Action 类中,这给与开发人员极大的灵活性和自由度。开发人员只需要在配置文件的 action 定义中添加属性 method,让它的值为类中存在的方法名,即可在访问此地址时执行对应的 方法。下面我们就在上面的例子的基础上来展示这个过程。首先让我们仿照上面 12.3.1 一