然后还需要在strust.xml中增加如下配置:
注意:name是固定值,而value来自于这个资源文件的基名。 最后在login.jsp中增加如下内容:
测试app级别资源文件
这样便完成了app级别的资源文件配置,随后发布测试。
说明:action级的资源文件优先级别最高,app最低。Pack级别的资源文件可作用于同一个包,app级别的资源文件可作用于当前项目。
补充:在jsp页面中直接访问某个资源文件,struts2为我们提供了i18n标签,使用此标签我们可以在类路径下直接从某个资源文件中获取国际化数据,而无需任何配置:
而如果要访问的资源文件在类路径的某个包下(如action或package级别的资源文件),可以这样访问:
我们建立ReadResourceFileTest类,代码如下:
package com.asm;
import java.util.Locale;
import java.util.ResourceBundle; public class ReadResourceFileTest { }
补充:在Action类(必须继承自ActionSupport)中获取资源文件的值的方法,可以使用如下代码: String value = this.getText(\资源文件的键名\);
//获取资源文件的对应的值。如果想给资源文件中的占位符赋值,可以使用getText的重载方法。 ActionContext.getContext().put(\,value);//存放在request范围,供jsp获取此值
public static void main(String[] args) { }
ResourceBundle rb=ResourceBundle.getBundle(\, System.out.println(rb.getString(\));
Locale.US);
5.选择使用资源文件
其实在我们成功访问到login.jsp页面后,只要在地址栏中增加参数request_locale=en_US便可以正确切换到登录页面为英文。当然我们可以再链接根据此参数写这个资源文件的链接。当然我们也可借助一个新Action来实现,操作步骤如下:在login.jsp中增加如下代码:
change.action对应的配置为:
46
ChangeLangAction的主要代码如下:
package com.asm;
public class ChangeLangAction extends ActionSupport { }
public String execute() throws Exception { }
return SUCCESS;
以上是第一种方法,特别要注意,由于使用了不同Action,所以要资源文件这时只有pack级别和app级别的才起作用,所以这时还应把action级别的资源文件内容增加到app级别的资源文件中去。下面使用第二种方法,原理基本和上面一样,只需在此ChangeLangAction中增加一个新的字段String lang及相应的get/set方法,再增加一个新的方法changeLang,代码如下:
public String changeLang() throws Exception {
Locale locale = null; System.out.println(lang); if (lang.equals(\)) { }
ActionContext.getContext().setLocale(locale); I18N_LOCALE\, locale);
}
return SUCCESS;
ServletActionContext.getRequest().getSession().setAttribute(\
// 显示中文
locale = Locale.CHINA;
System.out.println(\ + lang+locale); // 显示英文
locale = Locale.US;
} else {
配置内容为:
在login.jsp中对应的链接为:
这样操作后,当我们成功访问到login.jsp后,便可以点击链接来随意切换访问英文或中文页面。
八、验证机制
注意:要想实现校验,action必须继承自ActionSupport类。 1.基于手工编码的校验
我们建立struts2validate项目 ,其中reg.jsp页面主要代码如下:
注册页面
47
写真实年龄\headerKey=\/>
说明:
public class AgeAction extends ActionSupport {
private Map
ageMap = new HashMap();
for (int i = 1; i <= 120; i++) { }
ageMap.put(new Integer(i), i + \);
...省略ageMap的get/set方法 }
Reg action的配置如下:
根据配置,我们来看它的对应Action: RegAndLoginAction,代码如下: package com.asm;
public class RegAndLoginAction extends ActionSupport {
private User user;
public String reg() throws Exception {
if (user.getUsername() == null || user.getUsername().equals(\)) { this.addFieldError(\, \用户名不能为空\);
} else if (!Pattern.matches(\,
this.addFieldError(\, \用户名只能是以字母开头,后面可以跟字
user.getUsername())) {
母、数字或下滑线,长度只能是4-15位\); } else if (user.getPassword() == null || user.getPassword().equals(\)) {
this.addFieldError(\, \密码不能为空\);
} else if (!user.getPassword().equals(user.getPassword2())) {
48
this.addFieldError(\, \两次输入的密码不一致,请重新输入\); } else if (user.getAge() < 16) {
this.addFieldError(\, \未满16岁,不能注册\); }
if (this.hasFieldErrors()) { }
System.out.println(\); return SUCCESS;
return LOGIN;
}
...省略user的get/set方法 }
说明:当reg.jsp提交给此Action对应的reg方法处理时,它会调用addFieldError把错误信息加到FiledError中去,关于这点,我们可以在前台reg.jsp页面中用
public class RegAndLogin2Action extends ActionSupport {
private User user; @Override
public void validate() {
System.out.println(\校验的统一出口,对所有方法进行校验:这里可以放一些公共的验证\); }
public void validateReg() { ...省略,对reg方法进行验证 }
public void validateLogin() { ...省略,对login方法进行验证 }
public String reg() throws Exception { }
public String login() throws Exception { }
49
System.out.println(\); return SUCCESS;
System.out.println(\); return SUCCESS;
...省略user的get/set方法 }
说明:当reg.jsp提交给此Action对应的reg方法处理时,它会首先调用此reg方法专属的验证方法
valiadteReg(注意取名规则:validate+方法名<首字母大写>),此方法验证完成后,会调用validate方法,此方法完成后才会调用reg方法。因此一般情况下,我们会把一些公共的验证放在validate方法中,而这些所有的验证方法也只进行验证处理,并把错误信息封装到fieldError字段中(或者其它字段)。reg这些真正执行的方法只进行一些其它处理(比如把注册信息写进数据库)。测试时需要修改把前面的配置注释掉,写上下面的配置:
说明:配置中有一个input result的配置,因为带有validate的方法进行验证时,如果验证失败,会返回input所对应的result结果集。 简析校验流程:
(1)类型转换器请求参数执行类型转换,并把转换后的值赋给action中属性。 (2)如果在执行类型转换过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里,不管类型转换是否出现异常都会进入第(3)步。 (3)系统通过反射技术调用action中的validateXxx()方法 (4)再调用action中的validate()方法
(5)经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合size大于0),系统自动将请求转发至名为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。
注意:经过以上过程的分析,可以知道如果类型转换失败,也会到input视图。 2.基于XML配置形式的校验
新建struts2validateXML项目,在此项目中,基本的代码和上面的struts2validate项目相似,只是在上一个项目中我们在Action的具体方法中进行了验证处理,现在先修改RegAndLoginAction的代码如下:
package com.asm;
public class RegAndLoginAction extends ActionSupport {
public String login() throws Exception { }
System.out.println(\); return SUCCESS;
public String reg() throws Exception { }
return SUCCESS;
System.out.println(\); private User user;
...省略user的get/set方法 }
下面我们在action所在的包下建立一个对此Action进行校验的xml文件,文件名为:
50