⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 在struts 2_0中国际化(i18n)您的应用程序 - max on java - blogjava.htm

📁 struts2标签的详细解释说明教程
💻 HTM
📖 第 1 页 / 共 5 页
字号:
  style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@ page 
  &nbsp;contentType</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">text/html; 
  charset=UTF-8</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</SPAN><SPAN 
  style="COLOR: #000000"><BR></SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@taglib prefix</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">s</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> uri</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">/struts-tags</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"></SPAN><SPAN 
  style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</SPAN><SPAN 
  style="COLOR: #000000"><BR></SPAN><SPAN 
  style="COLOR: #0000ff">&lt;</SPAN><SPAN 
  style="COLOR: #800000">html</SPAN><SPAN 
  style="COLOR: #0000ff">&gt;</SPAN><SPAN 
  style="COLOR: #000000"><BR></SPAN><SPAN 
  style="COLOR: #0000ff">&lt;</SPAN><SPAN 
  style="COLOR: #800000">head</SPAN><SPAN 
  style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp; 
  &nbsp; </SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN 
  style="COLOR: #800000">title</SPAN><SPAN 
  style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Hello 
  World</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN 
  style="COLOR: #800000">title</SPAN><SPAN 
  style="COLOR: #0000ff">&gt;</SPAN><SPAN 
  style="COLOR: #000000"><BR></SPAN><SPAN 
  style="COLOR: #0000ff">&lt;/</SPAN><SPAN 
  style="COLOR: #800000">head</SPAN><SPAN 
  style="COLOR: #0000ff">&gt;</SPAN><SPAN 
  style="COLOR: #000000"><BR></SPAN><SPAN 
  style="COLOR: #0000ff">&lt;</SPAN><SPAN 
  style="COLOR: #800000">body</SPAN><SPAN 
  style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp; 
  &nbsp; </SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN 
  style="COLOR: #800000">h2</SPAN><SPAN 
  style="COLOR: #0000ff">&gt;&lt;</SPAN><SPAN style="COLOR: #800000">s:text 
  </SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN 
  style="COLOR: #0000ff">="HelloWorld"</SPAN><SPAN 
  style="COLOR: #ff0000"></SPAN><SPAN 
  style="COLOR: #0000ff">/&gt;&lt;/</SPAN><SPAN 
  style="COLOR: #800000">h2</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN 
  style="COLOR: #000000"><BR>&nbsp; &nbsp; </SPAN><SPAN 
  style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">h2</SPAN><SPAN 
  style="COLOR: #0000ff">&gt;&lt;</SPAN><SPAN style="COLOR: #800000">s:property 
  </SPAN><SPAN style="COLOR: #ff0000">value</SPAN><SPAN 
  style="COLOR: #0000ff">="%{getText('HelloWorld')}"</SPAN><SPAN 
  style="COLOR: #ff0000"></SPAN><SPAN 
  style="COLOR: #0000ff">/&gt;&lt;/</SPAN><SPAN 
  style="COLOR: #800000">h2</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN 
  style="COLOR: #000000"><BR></SPAN><SPAN 
  style="COLOR: #0000ff">&lt;/</SPAN><SPAN 
  style="COLOR: #800000">body</SPAN><SPAN 
  style="COLOR: #0000ff">&gt;</SPAN><SPAN 
  style="COLOR: #000000"><BR></SPAN><SPAN 
  style="COLOR: #0000ff">&lt;/</SPAN><SPAN 
  style="COLOR: #800000">html</SPAN><SPAN 
  style="COLOR: #0000ff">&gt;</SPAN></DIV>
  <LI>发布运行应用程序,在浏览器地址栏中输入<A 
  href="http://localhost:8080/Struts2_i18n/HelloWorld.jsp">http://localhost:8080/Struts2_i18n/HelloWorld.jsp</A> 
  ,出现图1所示页面。<BR><IMG alt="图1 中文输出" 
  src="在Struts 2_0中国际化(i18n)您的应用程序 - Max On Java - BlogJava.files/r_imag2.gif"><BR><SPAN 
  style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic">图1 
  中文输出</SPAN> 
  <LI>将浏览器的默认语言改为“英语(美国)”,刷新页面,出现图2所示页面。<BR><IMG alt="图2 英文输出" 
  src="在Struts 2_0中国际化(i18n)您的应用程序 - Max On Java - BlogJava.files/r_imag1.gif"><BR><SPAN 
  style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic">图2 
  英文输出</SPAN> </LI></OL>上面的例子的做法,与Struts 1.x的做法相似,似乎并不能体现Struts 
2.0的优势。不过,我在上面的例子用了两种方法来显示国际化字符串,其输出是相同的。其实,这就是Struts 
2.0的一个优势,因为它默认支持EL,所示我们可以用getText方法来简洁地取得国际化字符串。另外更普遍的情况——在使用UI表单标志时,getText可以用来设置label属性,例如:<BR>
<DIV 
style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN 
style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">s:textfield 
</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN 
style="COLOR: #0000ff">="name"</SPAN><SPAN style="COLOR: #ff0000"> 
label</SPAN><SPAN style="COLOR: #0000ff">="%{getText('UserName')}"</SPAN><SPAN 
style="COLOR: #ff0000"></SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN></DIV>
<H2>资源文件查找顺序</H2>
<P>之所以说Struts 2.0的国际化更灵活是因为它可以能根据不同需要配置和获取资源(properties)文件。在Struts 
2.0中有下面几种方法:</P>
<OL>
  <LI>使用全局的资源文件,方法如上例所示。这适用于遍布于整个应用程序的国际化字符串,它们在不同的包(package)中被引用,如一些比较共用的出错提示; 
  <LI>使用包范围内的资源文件。做法是在包的根目录下新建名的package.properties和package_xx_XX.properties文件。这就适用于在包中不同类访问的资源; 

  <LI>使用Action范围的资源文件。做法为Action的包下新建文件名(除文件扩展名外)与Action类名同样的资源文件。它只能在该Action中访问。如此一来,我们就可以在不同的Action里使用相同的properties名表示不同的值。例如,在ActonOne中title为“动作一”,而同样用title在ActionTwo表示“动作二”,节省一些命名工夫; 

  <LI>使用&lt;s:i18n&gt;标志访问特定路径的properties文件。使用方法请参考我早前的文章《<A 
  class=entrylistItemTitle 
  id=CategoryEntryList1_EntryStoryList_Entries_ctl02_TitleUrl 
  href="http://www.blogjava.net/max/archive/2006/10/18/75857.html">常用的Struts 
  2.0的标志(Tag)介绍</A>》。在您使用这一方法时,请注意&lt;s:i18n&gt;标志的范围。在&lt;s:i18n 
  name="xxxxx"&gt;到&lt;/s:i18n&gt;之间,所有的国际化字符串都会在名为xxxxx资源文件查找,如果找不到,Struts 
  2.0就会输出默认值(国际化字符串的名字)。</LI></OL>
<P>上面我列举了四种配置和访问资源的方法,它们的范围分别是从大到小,而Struts 2.0在查找国际化字符串所遵循的是特定的顺序,如图3所示:</P><IMG 
alt="图3 资源文件查找顺序图" 
src="在Struts 2_0中国际化(i18n)您的应用程序 - Max On Java - BlogJava.files/o_Search.jpg"><BR><SPAN 
style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic">图3 
资源文件查找顺序图</SPAN>
<P>假设我们在某个ChildAction中调用了getText("user.title"),Struts 2.0的将会执行以下的操作: </P>
<OL>
  <LI>查找ChildAction_xx_XX.properties文件或ChildAction.properties; 
  <LI>查找ChildAction实现的接口,查找与接口同名的资源文件MyInterface.properties; 
  <LI>查找ChildAction的父类ParentAction的properties文件,文件名为ParentAction.properties; 
  <LI>判断当前ChildAction是否实现接口ModelDriven。如果是,调用getModel()获得对象,查找与其同名的资源文件; 
  <LI>查找当前包下的package.properties文件; 
  <LI>查找当前包的父包,直到最顶层包; 
  <LI>在值栈(Value Stack)中,查找名为user的属性,转到user类型同名的资源文件,查找键为title的资源; 
  <LI>查找在struts.properties配置的默认的资源文件,参考例1; 
  <LI>输出user.title。</LI></OL>
<H2>参数化国际化字符串</H2>
<P>许多情况下,我们都需要在动行时(runtime)为国际化字符插入一些参数,例如在输入验证提示信息的时候。在Struts 
2.0中,我们通过以下两种方法做到这点:</P>
<OL>
  <LI>在资源文件的国际化字符串中使用OGNL,格式为${表达式},例如:<BR>
  <DIV 
  style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; MARGIN-BOTTOM: 8px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN 
  style="COLOR: #000000">validation.require</SPAN><SPAN 
  style="COLOR: #000000">=</SPAN><SPAN 
  style="MARGIN-BOTTOM: 8px; COLOR: #000000">${getText(fileName)} is 
  required</SPAN></DIV>
  <LI>使用<A 
  href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/text/MessageFormat.html">java.text.MessageFormat</A>中的字符串格式,格式为{ 
  参数序号(从0开始), 格式类形(number | date | time | choice), 格式样式},例如:<BR>
  <DIV 
  style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN 
  style="COLOR: #000000">validation.between</SPAN><SPAN 
  style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">Date must between 
  {</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN 
  style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000"> date, short} and 
  {</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN 
  style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000"> date, 
  short}</SPAN></DIV></LI></OL>在显示这些国际化字符时,同样有两种方法设置参数的值:<BR>
<OL>
  <LI>使用标志的value0、value1...valueN的属性,如:<BR>
  <DIV 
  style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; MARGIN-BOTTOM: 8px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN 
  style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">s:text 
  </SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN 
  style="COLOR: #0000ff">="validation.required"</SPAN><SPAN 
  style="COLOR: #ff0000"> value0</SPAN><SPAN style="COLOR: #0000ff">="User 
  Name"</SPAN><SPAN style="COLOR: #ff0000"></SPAN><SPAN 
  style="COLOR: #0000ff">/&gt;</SPAN></DIV>
  <LI>使用param子元素,这些param将按先后顺序,代入到国际化字符串的参数中,例如:<BR>
  <DIV 
  style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN 
  style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">s:text 
  </SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN 
  style="COLOR: #0000ff">="validation.required"</SPAN><SPAN 
  style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp; 
  &nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN 
  style="COLOR: #800000">s:param </SPAN><SPAN 
  style="COLOR: #ff0000">value</SPAN><SPAN style="COLOR: #0000ff">="User 
  Name"</SPAN><SPAN style="COLOR: #ff0000"></SPAN><SPAN 
  style="COLOR: #0000ff">/&gt;</SPAN><SPAN 
  style="COLOR: #000000"><BR></SPAN><SPAN 
  style="COLOR: #0000ff">&lt;/</SPAN><SPAN 
  style="COLOR: #800000">s:text</SPAN><SPAN 
  style="COLOR: #0000ff">&gt;</SPAN></DIV></LI></OL>
<H2>让用户方便地选择语言</H2>
<P>开发国际化的应用程序时,有一个功能是必不可少的——让用户快捷地选择或切换语言。在Struts 
2.0中,通过ActionContext.getContext().setLocale(Locale 
arg)可以设置用户的默认语言。不过,由于这是一个比较普遍的应用场景(Scenario),所以Struts 
2.0为您提供了一个名i18n的拦截器(Interceptor),并在默认情况下将其注册到拦截器链(Interceptor 
chain)中。它的原理为在执行Action方法前,i18n拦截器查找请求中的一个名为"request_locale"的参数。如果其存在,拦截器就将其作为参数实例化Locale对象,并将其设为用户默认的区域(Locale),最后,将此Locale对象保存在session的名为“WW_TRANS_I18N_LOCALE”的属性中。</P>
<P>下面,我将提供一完整示例演示它的使用方法。</P>
<DIV 
style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG 
src="在Struts 2_0中国际化(i18n)您的应用程序 - Max On Java - BlogJava.files/None.gif" 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -