posts - 78, comments - 34, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
 

         今日的课程内容是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) {

      

       //比如有这样一片段文字:在20091128我来到了北京,我买的是打折机票,票价¥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都具有哪些隐式对象呢?

pageContextpageScoperequestScopesessionScopeapplicationScopeparamparamValuesheaderheaderValuescookieinitParam。这些都是Servlet中相关的作用域对象,比如${requestScope.abcd}就是获取request中的abcd属性。既然${abcd}${requestScope.abcd}有什么区别,使用${abcd}不是更简单吗?咱们来看一下这种情况:request.setAttribute(“abcd”,”hiRequest”); session.setAttribute(“abcd”,”hiSession”);${abcd},获取的是request中的abcd,如果request中没有abcd它获取的就是sessionabcd。这下明白了吧!如果两个域中具有相同的属性,那么些时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”包中。UIRhttp://localhost:8080/jsp/jstl/functions

        


评论

# re: 2009-11-28 传智播客 java web——国际化、EL表达式  回复  更多评论   

2012-10-08 20:02 by breaknull
每天写一次日记心得真是一件特别好的事!!

只有注册用户登录后才能发表评论。


网站导航: