Struts Series(7) - 国际化,OGNL表达式语言,标签

国际化

Servlet中的国际化

  1. 写资源文件
    基础名.properties 【默认的语言环境的配置】
    基础名_语言简称_国家简称.properties
  2. 读取资源文件,再使用
    程序:ResourceBundle
    Jsp: jstl提供的格式化与国际化标签库。

Struts中的国际化

  1. 写资源文件 (同servlet)
  2. 读资源文件
    程序:ResourceBundle (同servlet)
    JSP:
    1)jstl(同servlet)
    2)struts标签获取资源文件内容

区别:
Struts2加载资源文件更加简单,通过常量加载即可,再在jsp页面直接使用。

1.写资源文件

Msg.properties 默认的语言环境; 找不到配置就找它
Msg_en_US.properties 美国

2.加载

<constant name="struts.custom.i18n.resources" value="cn.itcast.config.msg"></constant>

3.使用: 标签name值直接写配置文件中的key

<s:text name="title"></s:text>

另外一点,
(推荐)加载资源文件通过常量加载
还可以在页面加载, 这样用:

<s:i18n name="cn.itcast.config.msg">
    <s:text>  <!--标签必须放到标签体中。-->
</s:i18n>

不利于SEO优化,少用。


OGNL表达式

即对象图导航语言。Struts2框架使用OGNL作为默认的表达式语言。

OGNL优势

1、支持对象方法调用,如xxx.doSomeSpecial();
2、支持类静态的方法调用和值访问,表达式的格式:@[类全名(包括包路径)]@[方法名 | 值名] ,例如:@java.lang.String@format('foo %s', 'bar')@tutorial.MyConstant@APP_NAME;
3、支持赋值操作和表达式串联,如price=100, discount=0.8,calculatePrice(),这个表达式会返回80;
4、访问OGNL上下文(OGNL context)和ActionContext;
5、操作集合对象。

总结:

OGNL 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了 java.utils.Map 的接口.即ognlContext对象。

分析:

Struts框架默认就支持Ognl表达式语言。(struts必须引用的包:ognl.jar)
作用:页面取值用。

El表达式语言,用于页面取值,jsp页面取值的标准。(默认直接可以使用) (应用范围更广。)

Ognl表达式语言, struts标签默认支持的表达式语言。必须配置struts标签用,不能离开struts标签直接用。

ognlContext对象

ognlContext对象是OGNL表达式语言的核心。
源码类:public class OgnlContext extends Object implements Map{..}

硬编码了解ognlContext对象的用法:

import org.junit.Test;

import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;

public class OgnlDemo1 {
    /**
     * 使用OGNL表达式取值,如果取非根元素的值用#号
     * @throws OgnlException
     */
    @Test
    public void testOgnl() throws OgnlException{
        //创建ognl上下文对象
        OgnlContext context = new OgnlContext();
        //放入数据
        User user = new User();
        user.setId(1000);
        user.setName("jack");
        //非根元素中放入数据,取值的时候表达式要用"#"
        context.put("user", user);
        //获取数据(map)
        //先构建一个ognl表达式 再解析表达式
        Object ognl = Ognl.parseExpression("#user.name");
        Object value = Ognl.getValue(ognl, context,context.getRoot());
        System.out.println(value);
    }
    /**
     * 根元素取值不用加#
     * @throws OgnlException
     */
    @Test
    public void testOgnl2() throws OgnlException{
        //创建ognl上下文对象
        OgnlContext context = new OgnlContext();
        //放入数据
        User user = new User();
        user.setId(1000);
        user.setName("jack");
        //向根元素中放入数据
        context.setRoot(user);
        //获取数据(map)
        //先构建一个ognl表达式 再解析表达式
        Object ognl = Ognl.parseExpression("name");
        Object value = Ognl.getValue(ognl, context,context.getRoot());
        System.out.println(value);
    }
    /**
     * ognl对静态方法调用的支持
     * @throws OgnlException
     */
    @Test
    public void testOgnl3() throws OgnlException{
        OgnlContext context = new OgnlContext();
        Object expression = Ognl.parseExpression("@Math@floor(10.9)");
        //由于Math类在开发中比较常用 因此也可以"@@floor(10.9)"省略Math类
        Object value = Ognl.getValue(expression, context,context.getRoot());
        System.out.println(value);

    }
}

ValueStack对象

即值栈对象
是整个struts数据存储的核心,或者叫中转站
用户每次访问struts的action都会创建一个action对象,值栈对象,actionContext对象,然后把Action放入值栈中,最后再把值栈对象放入request中,传入jsp页面。
开发者只需要通过ActionContext对象就可以访问Struts的其他的关键对象。ActionContext是给开发者用的,便于使用。

OgnlContext与ValueStack对象的关系?

一个值栈(ValueStack)对象包括一个根元素(list栈)以及OgnlContext对象(map栈)。根元素储存action对象以及全局属性,map栈存储映射的数据(域数据)。
ActionContext ac1 = ActionContext.getContext();
ValueStack vs = ac1.getValueStack();

值栈对象中包含了root和Context对象
而Context对象又引用了root对象
利用<s:debug>标签可以很方便的查看ValueStack内容以及层级关系。

ValueStack对象(1)
root,根元素数据,list栈操作方式和结构
通过push方法设置的对象
Map对象【通过vs.set(…)】
Action对象(全局存到根元素中)
其他代理对象

放到request中的数据都不会被存入context中,同时再次维护一个map(request)。需要取值的时候以#request.key的形式取。

ValueStack对象(2)
Context,非根元素数据,map数据
root=CompoundRoot
数据(Map)
keyvalue(new Map)
requestkeyvalue
request_datarequest_data
request_datarequest_data

值栈对象中包括根元素、request元素、session元素、application元素、attr、parameters。

对象包含的对象取值方法
值栈对象根元素直接写表达式
..request#+表达式
..session#+表达式
..application#+表达式
..attr#+表达式
..parameters#+表达式

Struts标签

Struts标签取值,就是用了ognl表达式语言。
java:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class OgnlDemo3 extends ActionSupport {

    @Override
    //测试迭代标签
    public String execute() throws Exception {

        List<User> list = new ArrayList<User>();
        Map<Integer, User> map = new HashMap<Integer, User>();

        //初始化
        for(int i = 1; i < 11; i ++){
            User user = new User(i,"jack"+i);
            list.add(user);
            map.put(user.getId(), user);

        }
        //保存到Request中 取值要加#
        ActionContext.getContext().getContextMap().put("list", list);
        ActionContext.getContext().getContextMap().put("map", map);

        return super.execute();
    }
}

jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>OGNL</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <style type="text/css">
        .odd{
            background-color:red;
        }
        .even{
            background-color:blue;
        }
    </style>

  </head>

  <body>
    OGNL.jsp <br>
    1.list迭代<br/>
    <table border="1">
    <tr>
        <td>编号</td>
        <td>名称</td>
    </tr>
    <s:iterator var="user" value="#request.list" status="st">
    <tr class=<s:property value="#st.even?'even':'odd'"/>>
        <td><s:property value="#user.id"/></td>
        <td><s:property value="#user.name"/></td>
    </tr>
    </s:iterator>
    </table>
     <br>1.list迭代<br/>
    <table border="1">
    <tr>
        <td>编号</td>
        <td>名称</td>
    </tr>
    <s:iterator var="en" value="#request.map" status="st">
    <tr class=<s:property value="#st.even?'even':'odd'"/>>
        <td><s:property value="#en.key"/></td>
        <td><s:property value="#en.value.name"/></td>
    </tr>
    </s:iterator>
    </table>
  </body>
</html>

OGNL表达式动态构建集合(无需action支持)
jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>OGNL</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <style type="text/css">
        .odd{
            background-color:red;
        }
        .even{
            background-color:blue;
        }
    </style>

  </head>

  <body>
    OGNL.jsp <br>
   一。 构建list集合<br/>

    <!-- ognl表达式可以取值,也可以动态构建集合 -->
    <s:iterator var="str" value="{'a','b'}">
        <s:property value="#str"/>
    </s:iterator>
    <br>二。构建Map集合<br>
    <s:iterator var="en" value="#{'cn':'China','usa': 'America'}">
        <s:property value="#en.key"/>
        <s:property value="#en.value"/><br>
    </s:iterator>
  </body>
</html>

其余的标签遇到时候再说。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值