今日的课程内容是JavaWEB国际化和EL表达式,EL表达式在之前的课程中有使用过,但并未深入。今日的内容整体上比较轻松,当我看到JavaWEB国际化时,还以为内容很多。国际化吗!以为在某些编写操作上有什么国际化的特殊要求?呵呵,其实我们的编写方式本身就已经是国际化的了。这里的国际化是指WEB应用国际化,跟桌面应用国际化没什么区别。EL表达式使用起来到是方便许多。
今日每位同学的学习效果整体上感觉不错!可能是学习完了WEB基础,学习高级部分都相对容易些吧!不过方老师为了让大家吸收的好,对课程内容进行了调整,没有讲基础时那么紧缩,拿出了些时间给学生们做练习。明天就开始讲数据库了,之后就是JSP自定义标签,等这些讲完了,终于可以进行高级开发了!学习基础是枯燥的,学习应用才有乐趣。这是正常现象,比如我在学校时特别不喜欢学习语文,学习完不知做什么用。话我说的不差劲!直到参加工作时,发现写作是很重要的,这时我开始喜欢上了语文。哎,枯燥的教育好烦!我与其为此而烦,还不如为此做些事情!
国际化开发就是,为了应对不同国家用户。将软件的语言,数据,使用习惯等,适合相应的国家。
我们在实际的软件使用中,桌面软件的语言设置选项也比较常见,这就是国际化。WEB被广泛应用后,一些国际化的网站也有针对不同国家访问的本地语言。
一个合格的国际化软件,必须对程序中固定使用的文本元素,例如:菜单、提示信息、错误信息等以用户本地使用的语言进行显示。也必须对程序中的一些动态信息以用户本地语言进行显示,例如:日期时间、货币等。
WEB应用的国际化实现方式与桌面软件的国际化实现方式类同。但是JAVA将应用做的比较完美,JAVA提供的类可以方便软件国际化的工作。下面让我们看一下桌面软件国际化的实现原理。
将桌面软件国际化,比如将菜单国际化显示:
1. 编写一个配置文件(*.ini)。
2. 在配置文件中设置节点名为国家或语言的名字,比如“中文简体”、“中文繁体”、“English”…。
3. 在各语言节点中添加配置项,各节点的配置项名称必须相同,比如在“中文简体”中添加“open=文件”节点,在“中文繁体”节点中添加“open=打開”,在“Englis”节点中添加“open=open”。
4. 软件在启动时,根据用户选择的语言,去对应的节点下读取指定的配置项,并使用配置项的值做为菜单显示。
上面就是桌面软件国际化的实现过程。接下来让我们看一下WEB应用中,国际化的实现方法。
将WEB应用国际化,比如将登录页面国际化:
1. 根据WEB应用面向的重点区域,编写相应的的配置文件(*.properties)。比如中国的配置文件“login_zh.properties”、美国的配置文件“login_en.properties”。注意:配置文件的命名,必须是“文件名+语言代码.properties”。
2. 所有的配置文件必须使用相同的键名称,比如“name=用户名”、“name=name”。
3. JAVA提供了一个类ResourceBundle,专门用于读取这种用于特定语言环境的资源。调用ResourceBundle.getBundle方法时,我们只需要传递参数一“配置文件所在WEB应用下的目录+login”和参数二本地信息(Locale)即可!ResourceBundle类会自动根据Locale信息中的语言代码,去读取指定的配置文件。
4. 在登录页面,使用ResourceBundleobj.getString(“键名称”),读取相应该的值并显示到页面上。
可见JAVA将应用做的如此完美,将配置文件分开这样有助于减小文件的大小。并且ResourceBundle会自动根据Locale设置的信息,去读取相应的配置文件。
以上我们说的都是对静态数据的国际化,那动态数据应该如何实现国际化呢?动态数据,比如数值,货币,时间,日期等数据。JAVA对此也做了相应的工作,处理时间有DateFormat类,处理数值有NumberFormat类。关于这两个类的使用,我也不做练习了十分简单,查看JDK文档,已经说明的很详细了。
动态文本(MessageFormat),用于处理一个字符串包含了多个与国际化相关的数据。看下面的代码:
import java.text.MessageFormat;
import java.util.Date;
public class MessageFormatTest {
public static void main(String[] args) {
//比如有这样一片段文字:在2009年11月28日我来到了北京,我买的是打折机票,票价¥330.00。
String str = "在{0,date,long}我来到了北京,我买的是打折机票,票价{1, number, currency}。";
Object[] reargs = {new Date(), 330};
MessageFormat mf = new MessageFormat(str);
StringBuffer sb = new StringBuffer();
System.out.println(mf.format(reargs));
}
}
|
与DateFormat和 NumberFormat相比,MessageFormat使用起来复杂一点。但功能比较强大,对于它的国际化应用,我还不明朗。在学习框架时,我想可能会明朗些吧!
下午重点学习EL表达式,使用上并不复杂。只过JAVA应用总是搞出来这么多名堂,其实就是为了简化开发。这也是可以理解的!
EL——ExpressionLanguage,它是用于替换JSP页面中的脚本表达式。之前也有提到过,在JSP页面中使用脚本表达式进行数据显示是一件痛苦的事。若想使用EL表达式,WEB服务器必须支持Servlet2.4/JSP2.0技术。EL都有哪些功能呢?比如${标识符},EL拿到标识符后会到自己的隐式对象中去查找,如果隐式对象中不存在,则到page域、request域、session域、application域中去查找。
举例:${abcd},abcd不是EL的隐式对象。但它在request域中(request.setAttribute (“abcd”,”hi”);),所以会调用pageContext.findAttribute方法进行查找,${abcd}代表的就是request.getAttribute(“abcd”);,EL都具有哪些隐式对象呢?
pageContext、pageScope、requestScope、sessionScope、applicationScope,param、paramValues、header、headerValues、cookie、initParam。这些都是Servlet中相关的作用域对象,比如${requestScope.abcd}就是获取request中的abcd属性。既然${abcd}与${requestScope.abcd}有什么区别,使用${abcd}不是更简单吗?咱们来看一下这种情况:request.setAttribute(“abcd”,”hiRequest”); session.setAttribute(“abcd”,”hiSession”);,${abcd},获取的是request中的abcd,如果request中没有abcd它获取的就是session的abcd。这下明白了吧!如果两个域中具有相同的属性,那么些时EL的隐式对象就发挥了作用。EL中的隐式对象完全可以操作相应域的数据。
EL也具有基本的运算处理能力:算术运算、逻辑运算和关系运算。在此就不一一列举了!
在EL中也可以编写自己的函数:
1. 编写一个类,定义静态方法:
public class MyEl {
public static String getMessage(){
return "HI,我是EL自定义函数!!!";
}
}
|
2. 在WEB-INF目录中添加一个*.tld配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>/SimpleTagLibrary</uri>
<function>
<name>print</name>
<function-class>cn.itcast.cc.el.MyEl</function-class>
<function-signature>java.lang.String getMessage()</function-signature>
</function>
</taglib>
|
3. 在要调用本函数的JSP页面中添加引用:
%@taglib prefix="cc" uri="/SimpleTagLibrary" %
|
4.调用方法:${cc:print()}
上面就是编写自定义EL函数的过程,Apache组织为EL提供了一些比较常用的函数。比如文件处理函数,方老师说这一点要注意,以后不需要在Servlet中把处理好的文本传递给页面,可以在页面中直接使用Apache提供的函数来方便快捷的处理文本。
Apache提供的EL常用函数在Standard.jar包中的“org.apache.taglibs.standard.functions.Functions”包中。UIR是http://localhost:8080/jsp/jstl/functions。