(4)Struts2-OGNL表达式与国际化

OGNL表达式与国际化

-掌握国际化的应用
-熟练掌握OGNL的结构
-熟练掌握OGNL在Struts中的使用方式


国际化
    在web项目中,国际化就是web项目支持多国语言,适应当地人的语言要求。比如,新浪微博里就有中文和英文,但新浪微博有一定的人力财力,采用英汉单独分开写的方式。
    一般在构建Struts项目时,可以采用Struts提供的国际化进行项目的开发。

国际化的定义:
    国际化(internationalization)又称为i18N,是设计和制造适应不同区域要求的产品的一种方式,是抹平国家和地区差异化的过程。

国际化的实现思路:  
     转备好多个语言版本的资源文件
     根据当地系统语言决定调用哪个资源文件
     读取对应的资源文件并呈现


Locale对象
     Locale对象封装了语言地区的相关信息
    getCounrty获取国家代码
    getLanguage获取语言代码
   
   
  1. //获取当前的Locale信息
  2. Locale locale = Locale.getDefault(); System.out.println(locale.getCountry()+"\t"+locale.getLanguage());
  3. CN zh


资源文件的要求
    文件名_语言代码_国家代码.properties
resource_zh_CN.properties      中文要进行编码
resource_en_US.properties
   
   
  1. name=\u7528\u6237\u540D
  2. pwd=\u5BC6\u7801\u54C8\u54C8
    
    
  1. name=userName
  2. pwd=password


资源文件调用范围
    全局资源文件
    包级资源文件
    类级资源文件

全局资源文件
    可以在这个项目中共享资源文件,最常用的方式,需要在struts.xml配置constant属性
    
    
  1. <!-- 配置国际化的工具对象 -->
  2. <constant name="struts.custom.i18n.resources" value="resource"></constant>

包级资源文件
     只能在当前包中共享资源文件信息
    命名规则:package_语言代码_国家代码.properties

类级资源文件
    只能在当前类中访问资源文件信息
    命名规则:ActionName_语言代码_国家代码.properties


资源信息的访问
    在JSP页面通过
    <s:text name="key">标签访问
    
    
  1. <form action="login.action" method="post">
  2. <s:text name="name">:</s:text><input name="userName"><br/>
  3. <s:text name="pwd">:</s:text> <input type="password" name="password"><br/>
  4. <input type="submit" value="Login">
  5. </form>
Action通过getText方法访问
getText(String key)
getText(String key,list args)



OGNL
    在JSP中,我们之前通过EL表达式进行服务端数据的呈现

在Struts中,我们又可以使用OGNL表达式进行服务端数据的呈现,并且OGNL的功能远远大于EL表达式的,同时我们也可以两者结合使用。
接下来我们先介绍下什么是OGNL?
    OGNL(Object-Graph Navigation Language)是一种使用灵活的表达式语言,可以存取对象的任意属性,调用对象的方法,遍历对象的整个结构图,实现字段类型的转换等。它使用相同的表达式存取对象的属性。

EL和OGNL的区别

常规OGNL通过根对象访问对象的属性和方法。

Root对象可以由多个对象构成,Context对象只有一个。
通常我们把常用的对象信息写入Context对象中,便于多次访问。


OGNL通过Ognl.getValue(attribute,context,root )方法访问对象的属性和方法

例:
Foo类结构   该类属性有Integer类型,String类型,List集合,Map集合,对象类型等等,提供setter和getter方法
    
    
  1. public class Foo {
  2. private Integer id;
  3. private String name;
  4. private String[] array;
  5. private List<String> list;
  6. private Map<String, String> map;
  7. private User user;
  8. private List<User> userList;
  9. public Integer getId() {
  10. return id;
  11. }
  12. public void setId(Integer id) {
  13. this.id = id;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public String[] getArray() {
  22. return array;
  23. }
  24. public void setArray(String[] array) {
  25. this.array = array;
  26. }
  27. public List<String> getList() {
  28. return list;
  29. }
  30. public void setList(List<String> list) {
  31. this.list = list;
  32. }
  33. public Map<String, String> getMap() {
  34. return map;
  35. }
  36. public void setMap(Map<String, String> map) {
  37. this.map = map;
  38. }
  39. public User getUser() {
  40. return user;
  41. }
  42. public void setUser(User user) {
  43. this.user = user;
  44. }
  45. public List<User> getUserList() {
  46. return userList;
  47. }
  48. public void setUserList(List<User> userList) {
  49. this.userList = userList;
  50. }
  51. }
初始化Foo对象
     
     
  1. //初始化Foo对象
  2. Foo foo = new Foo();
  3. foo.setId(1001);
  4. foo.setName("tom");
  5. String[] array = new String[]{"a","b","c"};
  6. foo.setArray(array);
  7. List<String> list = Arrays.asList("A","B","C");
  8. foo.setList(list);
  9. Map<String, String> map = new HashMap<String, String>();
  10. map.put("keyA", "valueA");
  11. map.put("keyB", "valueB");
  12. map.put("keyC", "valueC");
  13. foo.setMap(map);
  14. User user = new User();
  15. user.setUserName("jack");
  16. user.setPassword("jack123");
  17. foo.setUser(user);
  18. List<User> userList = Arrays.asList(new User("userA", "111"),new User("userB", "222"), new User("userC", "333"));
  19. foo.setUserList(userList);

使用原生的OGNL表达式访问数据
OGNL本质就是一套对象反射的工具
      
      
  1. Object value;
(1)访问基本数据类型
     
     
  1. value = Ognl.getValue("id", foo);
  2. value = Ognl.getValue("userName", user);
(2)访问引用数据类型
      
      
  1. value = Ognl.getValue("user.password", foo);
(3)访问数组或list集合
      
      
  1. value = Ognl.getValue("array[0]", foo);
  2. value = Ognl.getValue("list[1]", foo);
  3. value = Ognl.getValue("userList[0].userName", foo);
(4)访问map集合
       
       
  1. value = Ognl.getValue("map.keyC", foo);

(5)运算
        
        
  1. value = Ognl.getValue("id+1", foo);
  2. value = Ognl.getValue("id+name", foo);
  3. value = Ognl.getValue("name=='tom'", foo);
(6)调用方法
         
         
  1. value = Ognl.getValue("name.length()", foo);
  2. value = Ognl.getValue("list.indexOf(\"B\")", foo);
(7)创建集合
          
          
  1. value = Ognl.getValue("{'a','b','c'}", null);
  2. value = Ognl.getValue("#{'a':'A','b':'B'}", null);
  3. System.out.println(value.getClass());
  4. 第一个是ArrayList
  5. 第二个是LinkedHashMap


在Context中访问数据
Context必须是map集合
初始化:
           
           
  1. Map<String, Object> context = new HashMap<String, Object>();
  2. context.put("name", "tony");
  3. context.put("user", new User("lucy", "112233"));
  4. context.put("actionName", "loginAction");
  5. context.put("foo", foo);

第一个参数表示获取数据的表达式,第二个参数是获取数据的上下文对象,第三个参数表示root对象
默认情况下,表达式直接获取root对象的数据,所以我们需要通过     #    来访问上下文的数据
            
            
  1. value = Ognl.getValue("#actionName", context, foo);

              
              
  1. //表示获取foo对象中user属性的userName
  2. value = Ognl.getValue("user.userName", context, foo);

               
               
  1. //表示获取contxt中键为user的对象的属性userName
  2. value = Ognl.getValue("#user.userName", context, foo);


Struts2中对OGNL进行了相应的改动,主要体现在将多个root对象封装成valueStack对象,该对象为栈结构,请求的对象将会被存入栈顶,请求结束后将对象从栈顶移除,并且提供request、session、application、parameters这五个与valueStack并级的对象。
在Struts2中,OGNL访问的context是ActionContext对象,位于ActionContext中的root对象是valueStack, request、session、application、parameters是属于context中的子节点。

Strust2的OGNL的使用
    Struts2的OGNL需要结合struts2标签来使用,主要通过
        #    直接访问根上下文中的对象
        $    资源文件或配置文件中访问OGNL
        %    将字符串作为OGNL表达式进行计算













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值