failTip=对不起,您不能登录! succTip=欢迎,${0},您已经登录! viewLink=查看作者李刚已出版的图书 bookPageTitle=作者李刚已出版的图书 bookName=书名: user=用户名 pass=密 码 login=登录
因为该资源文件中包含了非西欧字符,因此必须使用native2ascii命令来处理该文件。将上面文件保存在WEB-INF/classes路径下,文件名为“messageResouce.properties”。保存该文件后,必须使用native2ascii命令来处理该文件,处理该文件的命令格式为:
native2ascii messageResouce.properties messageResouce_zh_CN.properties
上面命令将包含非西欧字符的资源文件处理成标准的ASCII格式,处理完成后生成了一份新文件:messageResouce _zh_CN.properties文件。这个文件的文件名符合资源文件的命名格式,资源文件的文件名命名格式为:
basename_语言代码_国家代码.properties
当请求来自简体中文的语言环境时,系统将自动使用这种资源文件中的内容输出。
注意 对于包含非西欧字符的资源文件,一定要使用native2assii命令来处理该文件,否则将看到一堆乱码。 除此之外,还应该提供如下英文语言环境的资源文件。 loginPage=Login Page errorPage=Error Page succPage=Welcome Page failTip=Sorry,You can't log in!
succTip=welcome,{0},you has logged in! viewLink=View LiGang\\'s Books bookPageTitle=LiGang\\'s Books bookName=BookName: user=User Name pass=User Pass login=Login
将上面资源文件保存在WEB-INF/classes路径下,文件名为“messageResouce_en_ US.properties”。当请求来自美国时,系统自动使用这份资源文件的内容输出。
2.7.2 加载资源文件
Struts 2支持在JSP页面中临时加载资源文件,也支持通过全局属性来加载资源文件。通过全局属性加载资源文件更简单,本应用使用全局属性加载Struts 2国际化资源文件。
加载资源文件可以通过struts.properties文件来定义,本应用的struts.properties文件仅有如下一行代码:
//定义Struts 2的资源文件的baseName是messageResource struts.custom.i18n.resources=messageResource
在struts.properties文件中增加上面的代码定义后,表明该应用使用的资源文件的baseName为“messageResouce”——这与我们前面保存资源文件的baseName是一致的。
Struts 2默认加载WEB-INF/classes下的资源文件,在上一节中,我们就是将资源文件保存在该路径下的。如果将该资源文件保存在WEB-INF/classes的子目录下,例如保存在WEB-INF/classes/lee路径下,则需要修改struts.properties中的定义如下:
//定义Struts 2的资源文件的baseName是messageResource,且文件放在WEB-INF/
classes/lee路径下
struts.custom.i18n.resources=lee.messageResource
2.7.3 输出国际化信息
为了让程序可以显示国际化信息,则需要在JSP页面中输出key,而不是直接输出字符串常量。
Struts 2提供了如下两种方式来输出国际化信息:
— — 因此,我们再次修改表现层的JSP页面,使用国际化标签输出国际化信息。修改后的showBook.jsp页面代码如下: <%@ page language=\contentType=\charset=GBK\<%@taglib prefix=%uri=\
我们发现,上面的JSP页面不再包含任何直接字符串,而是全部通过 再次在浏览器浏览该页面,将看到与图2.7相同的界面。 重新设置浏览者所在的语言/区域选项,设置语言/区域选项请先进入“控制面板”,在控制面板中单击“区域和语言选项”,进入如图2.9所示的对话框。 如果我们选择“英语(美国)”选项,然后单击“确定”按钮,将设置本地的语言环境为美国英语。 再次向服务器请求login.jsp页面,将看到如图2.10所示的页面。 图2.9 设置语言/区域选项 图2.10 程序国际化的效果 如果我们使用FireFox浏览器来浏览该页面时,发现依然显示中文界面——这是因为FireFox的语言环境并不受Windows系统的控制。为了让FireFox也使用美国英语环境,单击FireFox浏览器菜单栏中的“工具”菜单,选择“选项”菜单项,将出现“选项”对话框,单击“高级”按钮,将看到如图2.11所示的界面。 在如图2.11所示的对话框中单击“选择”按钮,将出现“语言和字符编码”对话框,在该对话框下面的下拉列表框中选择“英语/美国 [en-us]”选项,如图2.12所示,然后单击下拉框右边的“添加”按钮,将添加了“英语/美国”的语言环境。并在该对话框上面的列表框中选择“英语/美国 [en-us]”,然后单击“上移”按钮,将该选项移至最上面,让整个页面优先使用英语/美国的环境。 图2.11 设置FireFox的语言环境 图2.12 设置FireFox的语言环境为英语/美国 再次使用FireFox浏览器浏览login.jsp页面,将看到该页面变成了英文界面。 2.8 增加数据校验 在上面应用中,即使浏览者输入任何用户名、密码,系统也会处理用户请求。在我们整个HelloWorld应用中,这种空用户名、空密码的情况不会引起太大的问题。但如果数据需要保存到数据库,或者需要根据用户输入的用户名、密码查询数据,这些空输入可能引起异常。 为了避免用户的输入引起底层异常,通常我们会在进行业务逻辑操作之前,先执行基本的数据校验。 2.8.1 继承ActionSupport ActionSupport类是一个工具类,它已经实现了Action接口。除此之外,它还实现了Validateable接口,提供了数据校验功能。通过继承该ActionSupport类,可以简化Struts 2的Action开发。 在Validatable接口中定义了一个validate()方法,重写该方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式负责输出。 为了让Struts 2增加输入数据校验的功能,改写程序中的LoginAction,增加重写validate方法。修改后的LoginAction类代码如下: //Struts 2的Action类就是一个普通的Java类 public class LoginAction { //下面是Action内用于封装用户请求参数的两个属性 private String username; private String password; //username属性对应的getter方法 public String getUsername() { return username; } //username属性对应的setter方法 public void setUsername(String username) {