import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import sun.util.ResourceBundleEnumeration;
public class ReadBundle {
/**
* @param selectName,bundleName
* @return
*/
public List getKeys(String selectName,String bundleName){
//切忌不要忘记ArrayList的初始化.否则问题严重大了..这是一个惨痛的教训.
ArrayList keys = new ArrayList();
//根据提供的bundleName创建一个ResourceBundle
System.out.println(bundleName);
ResourceBundle bundle = ResourceBundle.getBundle("com.bookshop.struts." + bundleName);
//将bundle中的keys通过方法getKeys()给取出来,放到一个枚举类型的表里.
ResourceBundleEnumeration keyList = (ResourceBundleEnumeration)bundle.getKeys();//获取bundle中所有的键值.
//创建一个局部变量key,用于暂存bundle中的一个key.
String key = null;
/*
* 遍历键值表,找出键值对应value与selectName相同,或selectName是value子串的key.添加到keys里
*/
while(keyList.hasMoreElements()){
//逐个取出枚举表中的key值.
key = (String)keyList.nextElement() ;
//用bundle的getString()方法得到key对应的value./
/*
* 因为在资源文件里,存储方式是 key<-->value 即 键<-->值 对.
*/
// System.out.println(key);
String value = bundle.getString(key);
//判断,如果根据key得出来的value 中包含给出的待选名字,或者正好等于给定的待选名字.那么,就把此key添加到keys表里,备返回.
if( (value.contains(selectName)) || (value.equalsIgnoreCase(selectName)) ){
System.out.println(key);
keys.add(key);
}
}
return keys;//返回所需的键值表.
}
/*
* 判断该执行哪一个bundle来获取keys表.
*
*/
/**
* @return keys
*/
public List judgeBundle(Locale locale , String selectName){
List keys = null;
String language = locale.getCountry();
// System.out.println(language);
// switch(language){
// case "zh-cn" : keys = getKeys(selectName,"");break;
// default: keys = getKeys(selectName,"");
// }
if(language.equals("") || language == null){
keys = getKeys(selectName,"ApplicationResources_en");
}
else if(language.equalsIgnoreCase("cn") || language.equalsIgnoreCase("zh")){
keys = getKeys(selectName,"ApplicationResources_zh_CN");
}
else if(language.equalsIgnoreCase("en")){
keys = getKeys(selectName,"ApplicationResources_en");
}
else{
keys = getKeys(selectName,"ApplicationResources_en");
}
return keys;
}
}
因为这个国际化,是通过资源文件实现,即数据库只存储 一串英文符号代码,具体的内容在资源文件里实现。比如,数据库里有一个bookName字段,那么在数据库表里,可能存储的是bookName,而在资源文件里得如下配置:bookName=Thingking in java(英文资源文件)bookName=java编程思想(中文资源文件)。。。等等。在页面上写<bean:message name="book" property="bookName" />(假如bookName是一个名为book的javabean的一个字段)。这样,在按名字查询的时候,就得到资源文件里匹配,而不是到数据库里。上面写的那个类就是读取资源文件的,然后根据value寻找key。
找到key以后,就找到要查询的东东了。
但是,有个地方没想好。就是,分页查询的时候,这个不能一次查询n条记录,而是一次性全部查询,当数据量大的时候,可能第一次查询会很慢。 我想了一个办法,还没有试行。就是,自己写一个读取文件的类,在读取了n条符合条件的记录后,将第n条记录的下一行行号记录下来,下一页查询的时候,从记录的行号继续往下查询。不过,我在文件这方面学的不精,是以没写出来。
请大家指正。