国际化
Servlet中的国际化
- 写资源文件
基础名.properties 【默认的语言环境的配置】
基础名_语言简称_国家简称.properties
- 读取资源文件,再使用
程序:ResourceBundle
Jsp: jstl提供的格式化与国际化标签库。
Struts中的国际化
- 写资源文件 (同servlet)
- 读资源文件
程序: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) |
key | value(new Map) |
---|
request | key | value |
---|---|---|
request_data | request_data | |
request_data | request_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>
其余的标签遇到时候再说。