The NoteBook of EricKong

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

#

shell与export命令
用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序。运行shell脚本程序时,系统将创建一个子shell。此时,系统中将有两个shell,一个是登录时系统启动的shell,另一个是系统为运行脚本程序创建的shell。当一个脚本程序运行完毕,它的脚本shell将终止,可以返回到执行该脚本之前的shell。从这种意义上来说,用户可以有许多 shell,每个shell都是由某个shell(称为父shell)派生的。
在子 shell中定义的变量只在该子shell内有效。如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他shell中被改变,可以使用export命令对已定义的变量进行输出。 export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。
[例]在本例中,变量myfile是在dispfile脚本程序中定义的。然后用export命令将变量myfile输出至任何子shell,例如当执行printfile脚本程序时产生的子shell。
dispfile脚本程序清单:
/**************begin dispfile**************/
myfile=”List”
export myfile
echo “Displaying $myfile”
pr –t –n $myfile
printfile
/**************end dispfile***************/
 
printfile脚本程序清单:
/**************begin printfile**************/
echo “Printing $myfile”
lpr $myfile&
/**************end printfile**************/
$dispfile
Displaying List
1 screen
2 modem
3 paper
Printing List
$

而source执行脚本就可以再父sh生效是由于这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。

 

 

 

【转载】Linux Source命令及脚本的执行方式解析

 

当我修改了/etc/profile文件,我想让它立刻生效,而不用重新登录;这时就想到用source命令,如:source /etc/profile
对source进行了学习,并且用它与sh 执行脚本进行了对比,现在总结一下。

source命令:
source命令也称为“点命令”,也就是一个点符号(.),是bash的内部命令。
功能:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句
source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
用法:
source filename 或 . filename
source命令(从 C Shell 而来)是bash shell的内置命令;点命令(.),就是个点符号(从Bourne Shell而来)是source的另一名称。

source filename 与 sh filename 及./filename执行脚本的区别在那里呢?
1.当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所有"."是用来表示当前目录的。
2.sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。
3.source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。


举例说明:
1.新建一个test.sh脚本,内容为:A=1
2.然后使其可执行chmod +x test.sh
3.运行sh test.sh后,echo $A,显示为空,因为A=1并未传回给当前shell
4.运行./test.sh后,也是一样的效果
5.运行source test.sh 或者 . test.sh,然后echo $A,则会显示1,说明A=1的变量在当前shell中

 

posted @ 2012-12-12 20:31 Eric_jiang 阅读(13153) | 评论 (0)编辑 收藏

ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互,而浏览器出于安全考虑,不允许js代码进行跨域操作,所以就诞生了很多跨域的解决方案。当本域和子域间进行访问时最简单的就是设置document.domain,当不同域的访问,大概有下列方法:
1.web端代理的方式,即用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网站的指定页面,由该页面代替用户页面完成交互,从而返回合适的结果。
2.iframe,解决方案就是用window.location对象的hash属性,利用JS改变hash值网页不会刷新,可以这样实现通过JS访问hash值来做到通信,大体就是AB网站各嵌入一个对方网站的iframe,然后通过连续不断的监听hash值的变化来进行通信。比如A网站通过改变B网站iframe的hash后,B网站监听到hash的变化后就进行处理,这种方式需要开发者可以控制两个网站的代码。
3.通过script标签来请求,原理就是在本域内的A内生成一个JS标签,它的SRC指向请求的另外一个域的某个页面B,这个src里面通常会加一个A页面定义好的回调函数,B返回数据即可,可以直接返回调用这个回调函数,这种跨域的通信方式被称为JSONP,此方案存在的缺陷是, script的src属性完成该调用时采取的方式时get方式,如果请求时传递的字符串过大时,可能会无法正常运行。
4.window.name,window.name是一种解决跨域数据传输的新技术,通过在iframe中加载一个跨域的HTML文件,并且在HTML文件中设置window.name的值为需要传给接受者的数据,接收者就可以取得到window.name的值并且返回,比较关键的是同源策略的影响对location的控制不受限制,所以需要加载一个代理的页面来让发送页面读取window.name.
5.使用flash,原理是JavaScript将数据提交给本域下的 Flash,通过 Flash 中转去访问其他域的接口,只需要其他域的根目录下有一个crossdomain.xml文件,文件中设置允许所有域名或允许本域访问即可。
了解更多,请看:
posted @ 2012-12-12 20:11 Eric_jiang 阅读(543) | 评论 (0)编辑 收藏

Group social work comprises a number of various practices and techniques aimed at facilitating individual growth and development in a social setting. An example of group work would be anti-violence trainings for perpetrators of domestic violence. In this setting, offenders have the ability to examine their feelings, histories, and behaviors in a nonthreatening environment. Group work is important because human beings are social and relational by nature. Thus, we are able to learn about ourselves in the context of a group more easily than in isolation. Group encounters allow us to incorporate the insights and perspectives of others into our own pool of resources. Also, group work can be perceived as less invasive than one-on-one social work. Participants may be more likely to open themselves up in the context of a group.
posted @ 2012-12-11 21:20 Eric_jiang 阅读(439) | 评论 (1)编辑 收藏

 

切诊是指医生用手指触按病人的动脉搏动,以探查脉象,从而了解病情的一种诊断方法。

    切脉的部位可分为遍诊法、三部诊法、寸口诊法三种,其中常用的是寸口诊法和腹诊。寸口位于两手腕后桡动脉搏起动处,分为寸、关、尺三部。掌后高骨处为关,关前为寸,关后为尺。寸口脉可分候脏腑之气,左寸候心,小肠;左关候肝、胆;左尺候肾、膀胱;右寸候肺,右关候脾、胃;右尺候肾。

    切脉应注意时间、姿势、指法。时间应选在清晨病人未活动时,若病人活动,应休息15分钟左右再进行脉诊。病人可坐位或卧位,手臂伸平,手心向上,使手臂与心脏接近于同一水平。切诊时,三指要同时切脉,用力要平衡,由轻到重,分为浮取、中取、沉取三种指力。诊脉时间应不少于1分钟。

    健康人脉象应为一次呼吸跳4次,寸关尺三部有脉,脉不浮不沉,和缓有力,尺脉沉取应有力。常见病脉有浮脉、沉脉、迟脉、数脉、虚脉、实脉、滑脉、洪脉、细脉、弦脉等。

    浮脉:轻按可得,重按则减。主病:表证由于外感病邪停留于表时,卫气抗邪,脉气鼓动于外,故脉位浅显。浮而有力为表实;浮而无力为表虚。内伤久病因阴血衰少,阳气不足,虚阳外浮,脉浮大无力为危证。

    沉脉:轻按不得,重按乃得。主病:里证。有力为里实,无力为里虚。邪郁于里,气血阻滞阳气不畅,脉沉有力为里实;脏腑虚弱,阳虚气陷,脉气鼓动无力,则脉沉无力。

    迟脉:脉搏缓慢,(每分钟脉搏在60次以下)。主病:寒证。有力为实寒,无力为虚寒。寒则凝滞,气血运行缓慢,脉迟而有力为实寒证。阳气虚损,无力运行气血,脉迟而无力,为虚寒证。

    数脉:脉搏急促,(每分钟脉搏在90次以上)。主病:热证。有力为实热,无力为虚热。外感热病初起,脏腑热盛,邪热鼓动,血行加速,脉快有力为实热。阴虚火旺,津血不足,虚热内生,脉快而无力为虚热。

    虚脉:寸关尺三部脉皆无力。重按空虚。主病:虚证:多为气血两虚,气血不足,难以鼓动脉搏,故按之空虚。

    实脉:寸关尺三部脉皆有力。主病:实证:邪气亢盛而正气充足,正邪相搏,气血充盈脉道,搏动有力。

    滑脉:按之流利,圆滑如按滚珠。多见于青壮年气血充实。妊娠妇女滑脉是气血旺盛养胎之现象。均属生理现象。

    洪脉:脉大而有力,如波涛汹涌,来盛去衰。主病:热盛。内热盛脉道扩张,脉形宽大,因热盛邪灼,气盛血涌,使脉有大起大落。

    细脉:脉按之细小如线,起落明显。主病:虚证,多见于阴虚、血虚证。又主湿病。阴血亏虚不能充盈脉道,或湿邪阻压脉道,脉细小。

    弦脉:端直而长,挺然指下,如按琴弦。主肝胆病、痛证、痰饮。气机不利,肝失疏泄,脉道拘急而显弦脉。病则气乱或痰饮内停,致使气机输转不利,出现弦脉。

脘腹是人体的重要部位,脐上属胃,脐下属肠,大腹属脾,脐腹属肾,少腹属肝。通过手指的触摸、按压可了解局部的冷热、软硬、胀满、肿块及压痛等情况,有助于了解脏腑的病情。一般以触摸、按压虚里穴(心夹搏动处)诊断病况。

    虚损病证:跳动明显,按之搏指。

    肺气虚证:跳动散漫而数

    肝气郁滞:两胁胀痛,痛处按此连彼。

    肝虚:胁痛喜按,胁下按之空虚无力。

    瘀血:胁下肿块,刺痛拒按,痛处不移。

    肝癌:胁下肿块,按之表面凹凸不平,则应警惕肝癌。

    肝气犯胃:胃部胀痛,按之旁及两胁。

    胃寒:胃痛骤烈,疼痛拒按,发冷怯寒。

    气虚:胃腹痛经久不愈,按之痛缓或痛止。

    虚:腹痛喜暖喜按,按腹软无力。

    实:腹痛胀满拒按,按腹充实,叩之声音重浊,或按之有包块不移者。

posted @ 2012-11-25 21:09 Eric_jiang 阅读(615) | 评论 (1)编辑 收藏

【参数详解】
  1) R 强制外部重定向,后面可以代301或302跳转。
  2) F 禁用URL,返回403HTTP状态码。
  3) G 强制URL为GONE,返回410HTTP状态码。
  4) P 强制使用代理转发。
  5) L 表明当前规则是最后一条规则,停止分析以后规则的重写。
  6) N 重新从第一条规则开始运行重写过程。
  7) C 与下一条规则关联。
  8) T=MIME-type(force MIME type) 强制MIME类型。
  9) NS 只用于不是内部子请求。
  10) NC 不区分大小写。
  11) QSA 追加请求字符串。
  12) NE 不在输出转义特殊字符
posted @ 2012-11-08 16:34 Eric_jiang 阅读(256) | 评论 (0)编辑 收藏

@Test public void Testregexp(){
        //Pattern p = Pattern.compile("^((\\d{2}(([02468][048])|([13579][26]))[\\/\\/\\s]?((((0?"+"[13578])|(1[02]))[\\/\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))" +"|(((0?[469])|(11))[\\/\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|" +"(0?2[\\/\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][12"+"35679])|([13579][01345789]))[\\/\\/\\s]?((((0?[13578])|(1[02]))" +"[\\/\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))" +"[\\/\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\/\\/\\s]?((0?[" +"1-9])|(1[0-9])|(2[0-8]))))))");
        Pattern p = Pattern.compile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\-\\s]?((((0?" +"[13578])|(1[02]))[\\-\\-\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))" +"|(((0?[469])|(11))[\\-\\-\\s]?((0?[1-9])|([1-2][0-9])|(30)))|" +"(0?2[\\-\\-\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][12" +"35679])|([13579][01345789]))[\\-\\-\\s]?((((0?[13578])|(1[02]))" +"[\\-\\-\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))" +"[\\-\\-\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\-\\s]?((0?[" +"1-9])|(1[0-9])|(2[0-8]))))))");
       
        String s = "2003-02-20";
          System.out.println(s + " " + p.matcher(s).matches());
 
          s = "2004/02/29";
          System.out.println(s + " " + p.matcher(s).matches());
 
          s = "2004/04/31";
          System.out.println(s + " " + p.matcher(s).matches());
 
          s = "2004/04/30";
          System.out.println(s + " " + p.matcher(s).matches());
 
          s = "2004/04/30";
          System.out.println(s + " " + p.matcher(s).matches());
 
          s = "2004/09/30";
          System.out.println(s + " " + p.matcher(s).matches());
 
    }
以上运行结果:
2003-02-20 true
2004/02/29 false
2004/04/31 false
2004/04/30 false
2004/04/30 false
2004/09/30 false

@Test public void Testexp(){
       
          Pattern p = Pattern.compile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$");
 
          String s = "2003-02-29 23:59:59";
          System.out.println(s + " " + p.matcher(s).matches());
 
          s = "2004-02-29 23:59:59";
          System.out.println(s + " " + p.matcher(s).matches());
 
          s = "2004-04-31 0:59:59";
          System.out.println(s + " " + p.matcher(s).matches());
 
          s = "2004-04-30 01:11:0";
          System.out.println(s + " " + p.matcher(s).matches());
 
          s = "2004-04-30 0:0:0";
          System.out.println(s + " " + p.matcher(s).matches());
 
          s = "2004-04-30 00:00:59";
          System.out.println(s + " " + p.matcher(s).matches());
    }
以上运行结果:
2003-02-29 23:59:59 false
2004-02-29 23:59:59 true
2004-04-31 0:59:59 false
2004-04-30 01:11:0 true
2004-04-30 0:0:0 true
2004-04-30 00:00:59 true

posted @ 2012-10-03 15:31 Eric_jiang 阅读(1181) | 评论 (0)编辑 收藏

posted @ 2012-09-03 10:03 Eric_jiang 阅读(935) | 评论 (3)编辑 收藏

一、什么是OGNL,有什么特点?

OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。OGNL有如下特点:

1、支持对象方法调用,形式如:objName.methodName();

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表达式

OGNL要结合struts标签来使用。由于比较灵活,也容易把人给弄晕,尤其是“%”、“#”、“$”这三个符号的使用。由于$广泛应用于EL中,这里重点写%和#符号的用法。

1、“#”符号有三种用途:

(1)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:

parameters
包含当前HTTP请求参数的Map
#parameters.id[0]作用相当于request.getParameter("id")

request
包含当前HttpServletRequest的属性(attribute)的Map
#request.userName相当于request.getAttribute("userName")

session
包含当前HttpSession的属性(attribute)的Map
#session.userName相当于session.getAttribute("userName")

application
包含当前应用的ServletContext的属性(attribute)的Map
#application.userName相当于application.getAttribute("userName")


注:attr 用于按request > session > application顺序访问其属性(attribute),#attr.userName相当于按顺序在以上三个范围(scope)内读取 userName属性,直到找到为止。用于过滤和投影(projecting)集合,如books.{?#this.price<100};构造 Map,如#{'foo1':'bar1', 'foo2':'bar2'}。

(2)、用于过滤和投影(projecting)集合,如: books.{?#this.price>35}

books.{?#this.price>35}

(3)、构造Map,如: #{'foo1':'bar1', 'foo2':'bar2'}

#{'foo1':'bar1', 'foo2':'bar2'}这种方式常用在给radio或select、checkbox等标签赋值上。如果要在页面中取一个map的值可以这样写:

<s:property value="#myMap['foo1']"/>

<s:property value="#myMap['foo1']"/>

2、“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。很有点类似javascript里面的eval_r()功能,例如:

var oDiv = eval_r("document.all.div"+index)

var oDiv = eval_r("document.all.div"+index)

当index变量为1时,语句就会被当作var oDiv = document.all.div1
var oDiv = document.all.div1来执行。%{}就是起这个作用。举例:

<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/> 第1行

<s:property value="#myMap['key1']"/> 第2行

<s:url value="#myMap['key1']" />    第3行

<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/> 第4行

<s:property value="#myMap['key1']"/> 第5行

<s:url value="#myMap['key1']"/> 第6行

上面的代码第2行会在页面上输出“value1”,而第3行则会输出"#myMap['key1']"这么一个字符串。如果将第3行改写成这样:

<s:url value="%{#myMap['key1']}"/>

<s:url value="%{#myMap['key1']}"/>

则输出为“value1”。





这说明struts2里不同的标签对ognl的表达式的理解是不一样的。如果当有的标签“看不懂”类似“#myMap['key1']”的语句时,就要用%{}来把这括进去,“翻译”一下了。

3、“$”有两种用途

(1)、在国际化资源文件中,引用OGNL表达式。

(2)、在Struts 2配置文件中,引用OGNL表达式:

<action name="saveUser" class="userAction" method="save">

<result type="redirect">listUser.action?msg=${msg}</result>

</action>

<action name="saveUser" class="userAction" method="save">

<result type="redirect">listUser.action?msg=${msg}</result>

</action>
posted @ 2012-09-02 21:12 Eric_jiang 阅读(1320) | 评论 (2)编辑 收藏

Struts2的国际化
资源文件的命名:basename_language_country.properties
JAVA国际化
如果系统同时存在资源文件、类文件,系统将以类文件为主,而不会调用资源文件。
对于简体中文的Locale,ResourceBundle搜索资源的顺序是:
(1)baseName_zh_CN.class
(2)baseName_zh_CN.properties
(3)baseName_zh.class
(4)baseName_zh.properties
(5)baseName.class
(6)baseName.properties

 
Struts2的国际化入门

Struts2国际化是建立在Java国际化的基础上的,一样是通过提供不同国家/语言环境的消息资源,然后通过ResourceBundle
加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息--整个过程与JAVA程序的国家化完全相同,只是
Struts2框架对JAVA程序国际化进行了进一步封装,从而简化了应用程序的国际化。
Struts2需要国际化的部分
类型转换:
数据校验:
验证框架xml配置文件的国际化:RegisterAction-validation.xml文件<message key="username.xml.invalid"/>

JSP页面的国际化:<s:text name="addUser"/>

Action的国际化:利用ActionSupport类提供的getText()方法.

 

Struts2中加载全局资源文件

struts.xml
<constant name="struts.custom.i18n.resources" value="baseName"/>

struts.properties
struts.custom.i18n.resources=baseName


访问国际化消息

Struts2访问国际化消息主要有如下三种方式:
(1)JSP页面:<s:text name="key"/>
(2)Action类中:使用ActionSupport类的getText方法。
(3)表单元素的Label里:为表单元素指定一个key属性

输出带占位符的国际化消息

Struts2中提供了如下两种方式来填充消息字符串中的占位符

(1)JSP页面,在<s:text.../>标签中使用多个<s:param.../>标签来填充消息中的占位符。
(2)Action中,在调用getText方法时使用getText(String aTextName,List args)或getText(String key, String[] args)方法来填充占位符。
除此之外,Struts2还提供了对占位符的一种替代方式,这种方式允许在国际化消息资源文件中使用表达式,对于这种方式,则可避免在使用国际化消息时还需要为占位符传入参数

值。

如下在消息资源中使用表达式
succTip=${username}, 欢迎, 您已经登录!
在上面的消息资源中,通过使用表达式,可以从ValueStack中取出该username属性值,自动填充到该消息资源中。

加载资源文件的方式
(1)加载全局资源文件: <constant name="struts.custom.i18n.resources" value="baseName"/>
(2)包范围资源文件 :为Struts2指定包范围资源文件的方法是,在包的根路径下建立多个文件名为package_language_country.properties的文件,一旦建立了
   这个系列的国际化资源文件,应用中处于该包下的所有Action都可以访问该资源文件。需要注意的是上面的包范围资源文件的baseName就是package,不是Action所在的包名。
(3)Action范围资源文件:在Action类文件所在的路径建立多个文件名为ActionName_language_country.properties的文件。
(4)临时指定资源文件:<s:i18n.../>标签的name属性指定临时的国际化资源文件

加载资源文件的顺序
Action中加载资源文件,假设我们在某个ChildAction中调用了getText("user.title"),Struts 2.0的将会执行以下的操作:
(1)优先加载系统中保存在ChildAction的类文件相同位置,且baseName为ChildAction的系列资源文件。
(2)如果在(1)中找不到指定key对应的消息,且ChildAction有父类ParentAction,则加载系统中保存在ParentAction的类文件相同位置,且
   baseName为ParentAction的系列资源文件。
(3)如果在(2)中找不到指定key对应的消息,且ChildAction有实现接口IChildAction,则加载系统中保存在IChildAction的类文件相同位置,且
   baseName为IChildAction的系列资源文件。
(4)如果在(3)中找不到指定key对应的消息,且ChildAction有实现接口ModelDriven(即使用模型驱动模式),则对于getModel()方法返回的model对象,
   重新执行第(1)步操作。
(5)如果在(4)中找不到指定key对应的消息,则查找当前包下baseName为package的系列资源文件。
(6)如果在(5)中找不到指定key对应的消息,则沿着当前包上溯,直到最顶层包来查找baseName为package的系列资源文件。
(7)如果在(6)中找不到指定key对应的消息,则查找struts.custom.i18n.resources常量指定baseName的系列资源文件。
(8)如果经过上面的步骤一直找不到key对应的消息,将直接输出该key的字符串值。


对于在JSP中访问国际化消息,则简单的多,他们又可以分为两种形式:
(1)对于使用<s:i18n.../>标签作为父标签的<s:text.../>标签、表单标签的形式:
   a、将从<s:i18n.../>标签指定的国际化资源文件中加载指定key对应的消息。
   b、如果在a中找不到指定key对应的消息,则查找struts.custom.i18n.resources常量指定baseName的系列资源文件。
   c、如果经过上面步骤一直找不到该key对应的消息,将直接输出该key的字符串值。

(2)如果<s:text.../>标签、表单标签没有使用<s:i18n.../>标签作为父标签:
    直接加载struts.custom.i18n.resources常量指定baseName的系列资源文件。如果找不到该key对应的消息,将直接输出该key的字符串值。

 

允许用户自行选择程序语言

Struts2国际化的运行机制
    在Struts2中,可以通过ActionContext.getContext().setLocale(Locale arg)设置用户的默认语言。
为了简化设置用户默认语言环境,Struts2提供了一个名为i18n的拦截器(Interceptor),并且将其注册在默认的拦截器中(defaultStack)。
    i18n拦截器在执行Action方法前,自动查找请求中一个名为request_locale的参数。如果该参数存在,拦截器就将其作为参数,转换成Locale对象,
并将其设为用户默认的Locale(代表国家/语言环境)。
 除此之外,i18n拦截器还会将上面生成的Locale对象保存在用户Session的名为WW_TRANS_I18N_LOCALE的属性中。一旦用户Session中存在一个名为
WW_TRANS_I18N_LOCALE的属性,则该属性指定的Locale将会作为浏览者的默认Locale。
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<script. type="text/javascript">
function langSelecter_onChanged()
{
 document.getElementById("langForm").submit();
}
</script>
<%-- 设置SESSION_LOCALE为用户session中的WW_TRANS_I18N_LOCALE属性值 --%>
<s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"/>
<%-- 使用lee.Locales创建locales实例 --%>
<s:bean id="locales" name="lee.Locales">
 <%-- 为locales实例传入current参数值,如果SESSION_LOCALE为空,则返回ValueStack中locale属性值(即用户浏览器设置的Locale) --%>
 <s:param name="current" value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"/>
</s:bean>

<%-- 让用户选择语言的表单 --%>
<form. action="<s:url/>" id="langForm"
    style="background-color:#bbbbbb; padding-top: 4px; padding-bottom: 4px;">
    <s:text name="languag"/>
 <s:select label="Language" list="#locales.locales" listKey="value" listValue="key"
        value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"
        name="request_locale" id="langSelecter"
        nchange="langSelecter_onChanged()" theme="simple"/>
</form>

在其他页面中包含该页面:

<s:include value="selectlanguage.jsp"/>
在struts.xml文件中增加Action通配符的配置:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
 <constant name="struts.custom.i18n.resources" value="messageResource"/>
 <constant name="struts.i18n.encoding" value="GBK"/>
    <package name="lee" extends="struts-default">
  <!-- 使用通配符定义Action的name -->
  <action name="*">
   <!-- 将请求转发给/WEB-INF/jsp/路径下同名的JSP页面 -->
   <result>/WEB-INF/jsp/{1}.jsp</result>
  </action>
    </package>
</struts>

posted @ 2012-09-01 23:16 Eric_jiang 阅读(269) | 评论 (0)编辑 收藏

     摘要: 如何使用struts2拦截器,或者自定义拦截器。特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器): <interceptor-ref name="checkbox">  <param name="uncheckedValue"&...  阅读全文
posted @ 2012-08-31 15:59 Eric_jiang 阅读(300) | 评论 (0)编辑 收藏

仅列出标题
共57页: First 上一页 26 27 28 29 30 31 32 33 34 下一页 Last