国际化与ajax

国际化与ajax

国际化(I18N)

l  软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据。

l  国际化又称为 i18n:internationalization

l  软件实现国际化,需具备哪些特征:

l  对于程序中固定使用的文本元素,例如菜单栏、导航条等中使用的文本元素、或错误提示信息,状态信息等,需要根据来访者的地区和国家,选择不同语言的文本为之服务。

l  对于程序动态产生的数据,例如(日期,货币等),软件应能根据当前所在的国家或地区的文化习惯进行显示。

 

将软件中使用文本信息,保存properties属性文件中(key=value)

为不同国家编写不同properties属性文件,许多国家properties文件 组成一个资源包

 

ResourceBundle 会根据来访者国家不同,而自动读取不同properties文件

 

资源包中所有properties文件必须具有相同基名basename, 在basename后可以通过_拼接国家和语言信息 例如:basename_语言_国家.properties

myproperties_zh.properties 中文的配置文件 这里zh就是语言

myproperties_en.properties 英文的配置文件 这里en就是语言

myproperties_zh_CN.properties 中国中文配置文件 这里zh语言 CN国家

myproperties.properties 没有国家和语言信息,默认资源文件,如果来访者的国家和语言的资源文件没有找到,就会读取默认资源文件

  • Ø 资源文件书写格式

l  资源文件的内容通常采用“关键字=值”的形式,软件根据关键字检索值显示在页面上。一个资源包中的所有资源文件的关键字必须相同,值则为相应国家的文字。

l  并且资源文件中采用的是properties格式文件,所以文件中的所有字符都必须是ASCII字码,对于像中文这样的非ACSII字符,须先进行编码。(java提供了一个native2ascII命令用于编码)。属性文件是不能保存中文的

 

固定文本的国际化

         1、加载src下properties文件

ResourceBundle bundle = ResourceBundle.getBundle(basename);

2、读取properties文件中内容

String value = bundle.getString(key);

* 也可以在ResourceBundle.getBundle时 传入一个代表国家和地区Locale对象

* ResourceBundle bundle = ResourceBundle.getBundle("info", Locale.CHINA); 指定读取中国配置文件

 

优先级:指定Locale > 系统默认区域和语言 > 资源包默认的

 

  • Ø 示例  登录页面国际化

 

使用fmt 国际化标签 实现国际化登陆页面

1、将jstl的jar复制 WEB-INF/lib

2、引用fmt标签库 <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

设置locale

<fmt:setLocale value="${param.locale}"/>

创建ResourceBundle

<fmt:setBundle basename="info" var="bundle" scope="page"/>

显示message

<fmt:message bundle="${bundle}" key="login.info" />

<fmt:message bundle="${bundle}" key="login.username" />

 

日期格式化

l  DateFormat 类可以将一个日期/时间对象格式化为表示某个国家地区的日期/时间字符串。

 

l  DateFormat 类除了可按国家地区格式化输出日期外,它还定义了一些用于描述日期/时间的显示模式的 int 型的常量,包括FULL, LONG, MEDIUM, DEFAULT, SHORT,实例化DateFormat对象时,可以使用这些常量,控制日期/时间的显示长度

l  实例化DateFormat类有九种方式,以下三种为带参形式,下面列出的三种方式也可以分别不带参,或只带显示样式的参数。

l  getDateInstance(int style, Locale aLocale):以指定的日期显示模式和本地信息来获得DateFormat实例对象,该实例对象不处理时间值部分。

l  getTimeInstance(int style, Locale aLocale):以指定的时间显示模式和本地信息来获得DateFormat实例对象,该实例对象不处理日期值部分。

l  getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale):以单独指定的日期显示模式、时间显示模式和本地信息来获得DateFormat实例对象。

 

数字格式化

 

l 实例化NumberFormat类时,可以使用locale对象作为参数,也可以不使用,下面列出的是使用参数的。

l getNumberInstance(Locale locale):以参数locale对象所标识的本地信息来获得具有多种用途的NumberFormat实例对象

l getIntegerInstance(Locale locale):以参数locale对象所标识的本地信息来获得处理整数的NumberFormat实例对象

l getCurrencyInstance(Locale locale):以参数locale对象所标识的本地信息来获得处理货币的NumberFormat实例对象

l getPercentInstance(Locale locale):以参数locale对象所标识的本地信息来获得处理百分比数值的NumberFormat实例对象

 

练习

l  请创建一个date对象,并把date对象中表示日期部分的时间值,以及表示时间部分的时间值,分别以short、long模式进行格式化输出(国家设置为中国)。

 

l  请将时间值:09-11-28 上午10时25分39秒 CST,反向解析成一个date对象。

 

l  请将整数198,输出为货币形式:$198,并将$198反向解析成整数198。

 

l  请将0.78654321,输出百分比格式,保留两位小数

 

动态文本国际化

允许信息中 将动态数据 抽取出来,使用{0} {1} {2} 占位符进行占位,达到动态生成效果

 

1) MessageFormat.format(pattern,args); 采用默认Locale进行国际化

2) MessageFormat formater = new MessageFormat(pattern,locale); // 执行国家

   formater.format(args); 采用指定Locale进行国际化

 

占位符国际化复杂写法:{0,类型,样式}

 

类型为number 样式 integer、currency、percent

类型为date 样式 full long medium short

类型为timer 样式 full long medium short

 

Ajax

ajax介绍

AJAX : 异步 javascript和 XML

AJAX :带来用户体验改变,是web优化一种主要手段

 

AJAX = DHTML (HTML、CSS、JavaScript ) + XMLHttpRequest 对象

 

传统web交互模型,浏览器直接将请求发送给服务器,服务器回送响应,直接发给浏览器, Ajax交互模型,浏览器首先将请求 发送 Ajax引擎(以XMLHttpRequest为核心),AJax引擎再将请求发送给 服务器,服务器回送响应先发给Ajax引擎,再由引擎传给浏览器显示

 

1、同步交互模式,客户端提交请求,等待,在响应回到客户端前,客户端无法进行其他操作

2、异步交互模型,客户端将请求提交给Ajax引擎,客户端可以继续操作,由Ajax引擎来完成与服务武器端通信,当响应回来后,Ajax引擎会更新客户页面,在客户端提交请求后,用户可以继续操作,而无需等待 。

 

Google : suggest建议、邮件定时保存、map地图

ajax快速入门

1.创建XMLHttpRequest对象

2.将状态触发器绑定到一个函数

3.使用open方法建立与服务器的连接

4.向服务器端发送数据

5.在回调函数中对返回数据进行处理

 

XMLHttpRequest

方法: open send

属性:

onreadystatechange :状态回调函数

responseText/responseXML :服务器的响应字符串

status:服务器返回的HTTP状态码

statusText:  服务器返回的HTTP状态信息 

readyState :对象状态

 

客户端向服务器提交数据

1、get方式发送数据

xmlHttp.open("GET","url?key=value"); // 参数已经在url上

xmlHttp.send(null);

2、post方式发送数据

xmlHttp.open("POST","url"); // 不需要写参数

xmlHttp.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded"); // post发送参数前,需要设置编码格式

xmlHttp.send("name=xxx&pwd=xxx"); // 发送post数据

 

回调函数编写

                                     if(xmlHttp.readyState == 4){

                                               // 判断数据是否正确

                                               if(xmlHttp.status == 200){

                                                        // 响应有效

                                                        ...

                                               }

                                     }

 

 

针对Ajax 不同三种服务器响应数据类型,进行编程

1、 HTML片段的响应数据

将返回HTML片段 通过 innerHTML 属性,插入指定元素内部

ajax案例

1通过离焦发送Ajax请求,验证用户名是否存在

 

var xmlHttp = createXMLHttpRequest();

xmlHttp.onreadystatechange = function(){

    if(xmlHttp.readyState ==4 ){

         if(xmlHttp.status == 200){

             ...                                                                      

        }

    }

};

xmlHttp.open("GET","checkUsername?username="+username);

xmlHttp.send(null);

 

2通过链接 获得table数据

显示 --- 返回HTML片段

* 通过product.jsp 生成 HTML片段,返回客户端,客户端Ajax引擎接收,通过innerHTML 将tbale元素 嵌入到页面内部

Json介绍

返回JSON格式数据

去掉多余 HTML标签元素,只返回有效数据部分,是一种更优的方案

 

什么是json, 是一种javascript轻量级数据交互格式,主要应用于Ajax编程

 

格式一: {key:value,key:value,key:value } 键值对直接用 , 分开,键值之间用 :

键 本身必须是字符串常量

{name : '张三'}

{'name':'张三'}

 

是等价的

值 加不加引号,是有区别的,不加引号是变量,加引号常量字符串

 

格式二: [值1, 值2 ,值3 ] 数组结构

 

组合后复杂格式

[{name:'aaa'}, {name:'bbb'}, {name:ccc}] 表示三个对象数组

 

JSON应用场景: AJAX请求参数 和响应数据 

json-lib使用

是 java类库 ,支持 javabean map list array 转换 json格式字符串, 支持将json字符串转换 javabean对象

 

导入jar包(6个)

 

1) 转换数组 、List集合 到json格式字符串  - 使用JSONArray

                String[] arr = {"sada","fdssd","dfsd","sadas"};

                   JSONArray jsonArray =  JSONArray.fromObject(arr);

                   System.out.println(jsonArray.toString());

 

2) 将JavaBean/Map解析成JSON串:-  使用JSONObject

                   Product p1 = new Product();

                   p1.setName("三星手机");

                   p1.setPrice(3999);

                  

                   JSONObject jsonObject = JSONObject.fromObject(p1);

                   System.out.println(jsonObject);

 

3) 通过JsonConfig对象 配置对象哪些属性不参与转换

                   JsonConfig jsonConfig = new JsonConfig();

                   jsonConfig.setExcludes(new String[]{"price"});

                  

                   JSONObject jsonObject = JSONObject.fromObject(p1, jsonConfig);

                   System.out.println(jsonObject);

 

l  重写练习二  返回结果数据是json格式数据

* 客户端获得json格式字符串后,转换为 javascript对象  ------- eval("("+jsonstr+")");

基于xml返回数据Ajax省市联动

XML结果数据生成

 

问题:服务器端如何将java对象,生成XML格式数据 ?  需要第三方类库支持 XStream

 

XStream is a simple library to serialize objects to XML and back again.

 

如果实现 对象 --- xml  只需要 xstream-1.3.1.jar

如果实现 xml ---- 对象 需要 xstream-1.3.1.jar 、xpp3_min-1.1.4c.jar

 

将 xstream-1.3.1.jar 、xpp3_min-1.1.4c.jar 复制工程lib 目录下

 

核心方法

xSteam.alias(name,Class); 将类型解析或者序列化 定义一个别名

toXML(obj) 将对象序列化XML

fromXML(inputStream/xml片段)  将xml信息解析对象

 

提供便捷注解

@XStreamAlias(别名) 对类和变量设置别名

@XStreamAsAttribute  设置变量生成属性

@XStreamOmitField  设置变量 不生成到XML

@XStreamImplicit(itemFieldName = “hobbies”) 设置集合类型变量 别名

 

使注解生效

xStream.autodetectAnnotations(true);

 

使用 xmlHttp.responseXML 接收解析成为 document对象

 

posted @ 2017-11-12 11:20  Nevada  阅读(448)  评论(0)    收藏  举报