web应用程序jsp

    技术2024-03-23  84

    世界经济日益全球化,推动了对跨国用户可以访问的基于Web的软件的需求。 这些用户可能有不同的语言,显示,数据输入,演示和文化需求。 国际化(简称i18n )是一种创建适用于如此多样化的用户群体的应用程序的艺术。

    也许令人惊讶的是,当在服务器端使用J2SE而不对其进行自定义修改时,它对国际化的内置支持不足。 通常,服务器端应用程序的国际化仍是一门艺术,而不是一门科学,通常涉及专有或自有解决方案。

    本文将基于服务器端基于JSP的应用程序与J2SE应用程序的国际化需求区分开来。 我将探究各种导致服务器端需求显着不同的客户端/服务器拓扑。 然后,您将研究说明两个基本问题的广泛使用的解决方案的工作代码。

    超越J2SE语言环境

    J2SE使用语言环境的概念(请参见语言 符号 )进行国际化。 在单台机器上,语言环境指示用户对显示语言(例如,英语或西班牙语)的偏好,以及日期,时间,货币等的格式约定。 通常,底层操作系统管理语言环境首选项,并在运行时将其传递给J2SE。

    语言环境的符号

    语言环境指定为语言代码,然后是国家/地区代码。 (请参阅相关主题关于这些代码的更多信息。)的标准格式是xx_YY,其中xx是小写的两个字母的语言代码,YY是大写的两个字母的国家代码。 您可能还会看到在语言和国家/地区代码之间使用连字符的变体,或者将国家/地区代码置于小写形式。 必须将语言与国家/地区分开,因为多个国家/地区可能使用相同的语言,但是在日期,时间,货币格式等方面有不同的约定。

    如果您在本地计算机上运行服务器,或者该服务器是局域网中的另一台计算机,则特定于计算机的语言环境的概念非常有用。 所有涉及的客户端和服务器计算机都具有相同的语言环境,因此它们都使用相同的显示语言,日期约定等。 这两种情况都不会出现任何棘手的国际化问题。 但是,当您想使用同一台服务器为多个国际位置的用户提供服务时,情况就变得不那么直接了。

    服务器端国际化问题

    部署服务器应用程序以进行国际访问时,它必须同时为不同的语言环境提供支持。 图1显示了一种可能的情况。 每台机器(服务器以及可以随时访问服务器的客户端)可以具有自己的语言环境设置,并且这些语言环境可能有所不同。

    图1.服务器为具有不同语言环境的用户提供服务

    在图1中,服务器计算机位于旧金山,其计算机特定语言环境为en_US(美国英语)。 来自纽约和达拉斯的用户都使用en_US语言环境,因此没有其他国际化需求。 但是,来自首尔的用户希望以韩语查看应用程序提示,语言环境为ko_KR。 同时,来自上海的用户希望以zh_CN的语言环境查看中文的应用程序文本。 来自东京的用户希望该应用程序以日语显示,语言环境为ja_JP。 必须从San Francisco服务器上运行的JSP应用程序满足所有这些用户的要求。

    在服务器端,您可以完全控制服务器计算机自己的语言环境,但是您无法做任何更改或强制客户端进入特定语言环境的操作。 相反,您的应用程序必须找到每个用户的语言环境,并确保使用正确的语言环境显示JSP页面(请参阅检测客户端语言环境 )。

    检测客户端语言环境

    通过检查从用户浏览器传入的HTTP标头,可以自动检测用户的语言环境。 但是,用户或操作系统可能未正确设置此信息。 除此之外,某些浏览器在处理区域信息方面存在错误,您可以理解为什么让您的应用程序明确要求用户提供其首选区域是确定其值的更可接受的方法。

    更多地区确定性并发症

    仅当您认为仅确定客户端的语言环境是安全的(并相应地显示JSP时,就会遇到新的变化。请考虑以下非常现实的情况)。

    一位来自东京的来访人员正在中国上海的销售办事处使用机器,该机器的语言环境为zh_CN。 她不懂中文,她想用日语访问您的Web应用程序。 有关这种情况的说明,请参见图2(a)。

    图2.想要与客户端计算机不同的语言环境的用户

    在图2(a)中,旧金山服务器的语言环境为en_US。 上海的客户端计算机的语言环境为zh_CN。 但是,JSP应用程序需要在ja_JP语言环境中显示,以便对用户有用。

    采取另一种(更奇怪但仍然可能的)方案。 作为国际化JSP应用程序的开发人员,您正在调试。 在具有en_US语言环境的客户端系统上,您打开三个运行JSP应用程序的浏览器实例。 服务器计算机位于LAN上,并且也具有en_US语言环境。 但是,您正在为中文和日语用户测试应用程序的处理方式。 因此,在您的一台en_US客户端计算机上,一个浏览器实例是英语(en_US),一个是日语(ja_JP),一个是中文(zh_CN)。 图2 (b)说明了这种情况。

    根本的国际化问题现在应该已经清楚了:客户端语言环境或服务器语言环境都与显示所需国际化应用程序的任何特定实例的实际所需语言环境无关。 只有用户可以告诉您显示页面的语言环境。

    值得庆幸的是,通常可以安全地假设用户在使用应用程序时不希望更改显示的语言。 因此,语言环境通常可以与会话关联。

    解决语言环境相关的语言显示问题

    至少有两种公认的方法可以处理JSP应用程序的不同语言的显示:

    使用图像进行初始语言选择

    通常,没有可靠的方法来提前知道传入客户端可能具有的字体支持。 为了节省存储空间和内存,大多数现代操作系统默认情况下不会为Unicode中的所有字符预安装完整的字体支持。 某些浏览器仅在首次访问包含这些字符的网页时才尝试下载并安装所需的字体。 使用图片显示外来字符或国家/地区标志是显示语言选择屏幕的一种实用方法。

    存储多套JSP,每套JSP以不同的语言编码,然后根据用户的语言环境选择在这些JSP之间切换。 隔离所有使用文本字符串的方法,而是从资源束中获取特定于语言环境的字符串。 (此方法使用J2SE特定于语言环境的资源包处理。)

    我将展示示例代码的两个版本,每个版本一个。 示例应用程序是一个虚构的电子邮件服务(称为developerWorks Email)的登录屏幕。 首先将通过语言选择屏幕提示该电子邮件系统的用户,该屏幕将确定其当前会话所需的语言环境。 选择内容包括英语,韩语,日语和中文,如图3所示。如果尝试代码,请使用URL http:// <服务器地址> /dwi18n/multdir/index.jsp访问此页面。

    图3.用于显式语言环境选择的语言选择屏幕

    在图3中,语言选择屏幕使用四个图像来呈现四个区域设置选择(请参阅使用图像进行初始语言选择 )。 使用用户在此处选择的语言显示登录屏幕。 图4显示了日语的登录屏幕。

    图4.日语登录屏幕

    使用多个冗余的特定于语言的JSP集

    此示例的第一个版本位于示例代码分发的webapps / dwi18n / multdir /目录中,它使用多组JSP页面。 图5显示了此应用程序的目录层次结构。

    图5. dwi18n / multdir的目录层次结构显示了特定于语言环境的目录

    在图5中,每个语言环境都有一个对应的子目录。 en_EN语言环境的英语编码JSP位于en子目录中。 对应于ko_KR语言环境的韩语编码JSP位于ko子目录中。 对于ja_JP语言环境,日语编码的JSP位于ja子目录中。 zh_CN语言环境由zh子目录中的中文编码JSP表示。 这些子目录中的每一个都包含登录屏幕JSP(login.jsp)和数据确认JSP(confirm.jsp)。

    数据确认JSP只是显示在此简单示例中输入的数据。 例如,如果您要在中文登录屏幕上输入信息,然后单击按钮,那么数据确认JSP将显示输入的数据,如图6所示。

    图6.中文确认页面

    编码JSP

    名为index.jsp的语言环境选择JSP直接链接到一组特定于语言的JSP。 此版本的index.jsp的代码在清单1中:

    清单1.语言环境选择JSP直接链接到特定于语言的页面
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Select a language</title> </head> <body> <table> <tr> <td colspan=4 bgcolor="black"> <br/> <center><font face="arial" size=+2 color="white"> <b><i>developer</i>Works Email</b></font> </center> <br/> </td> </tr> <tr><td> <c:url value="en/login.jsp" var="englishURL"/> <a href="${englishURL}"> <img src="english.gif"/> </a> </td> <td> <c:url value="ja/login.jsp" var="japaneseURL"/> <a href="${japaneseURL}"> <img src="japanese.gif"/> </a> </td> <td> <c:url value="ko/login.jsp" var="koreanURL"/> <a href="${koreanURL}"> <img src="korean.gif"/> </a> </td> <td> <c:url value="zh/login.jsp" var="chineseURL"/> <a href="${chineseURL}"> <img src="chinese.gif"/> </a> </td> </tr> </table> </body> </html>

    在清单1中,请注意使用JSP标准标记库(JSTL)中的<c:url>标记来创建链接URL。 这样可以确保正确处理会话管理。 (参见相关主题有关JSTL和所述的更多信息<c:url>标签)

    每套login.jsp和Confirm.jsp均以特定于语言环境的语言进行编码。 清单2显示了ja_JP语言环境的login.jsp(对应于图4 ):

    清单2. ja_JP语言环境的登录页面(login.jsp)
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" > <title>developerWorks é??»å­??ã??¡ã??¼ã??«</title> </head> <body> <c:url value="confirm.jsp" var="actionURL"/> <form action="${actionURL}" method="post"> <table> <tr> <td colspan=2 bgcolor="black"> <br/> <center><font face="arial" size=+2 color="white"> <b><i>developer</i>Works é??»å­??ã??¡ã??¼ã??«</b></font> </center> <br/> </td> </tr> <tr> <td>ã??¦ã??¼ã??¶ ID</td> <td><input type="text" name="userid" size="40"/></td> </tr> <tr> <td>ã????ã??¹ã??¯ã??¼ã????</td> <td><input type="password" name="pass" size="40"/></td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="ã??­ã??°ã??¤ã??³"/></td> </tr> </table> </form> </body> </html>

    类似地,对于zh_CN语言环境,confirm.jsp(对应于图6 )是用中文编码的,如清单3所示:

    清单3. zh_CN语言环境的数据确认页面(confirm.jsp)
    <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" > <title>developerWorks ç??µé??®</title> </head> <body> <table border="1"> <tr> <td colspan=2 bgcolor="black"> <br/> <center><font face="arial" size=+2 color="white"> <b><i>developer</i>Works ç??µé??®</b></font> </center> <br/> </td> </tr> <tr> <td>ç??¨æ??·å¸??å??·</td> <td>${param.userid}</td> </tr> <tr> <td>å¯??ç ??</td> <td>${param.pass}</td> </tr> </table> </body> </html>

    我刚刚向您展示的多冗余集方法是针对以下应用程序的实用解决方案:

    主要使用一种语言进行访问,仅偶尔从另一种语言环境进行访问 具有不经常更改的基础表示层JSP

    使用J2SE资源包

    上一节使用多个冗余的特定于语言的JSP的解决方案的最大缺点是,当需要更新任何特定于语言的JSP集合时,必须对所有冗余编码的JSP集合执行更新。 。 即使是中型项目,也可能需要乏味且容易出错的更新。

    我将向您展示的解决方案现在看起来和工作起来与上一个类似,但是在这种情况下,您仅使用了一组login.jsp和Confirm.jsp。 在需要时(参见该解决方案利用了J2SE支持的语言环境中的资源包拉在区域设置特定文本字符串相关信息对J2SE资源包的更多信息)。 此解决方案的示例代码位于webapps \ dwi18n \ javares目录下。 如果部署示例代码,请使用URL http:// <服务器地址> /dwi18n/javares/index.jsp。

    图7显示了在同一客户端计算机上运行的四个浏览器会话,每个会话请求了不同的语言环境。

    图7.同一台机器上的四个不同的语言环境

    在图7中,您可以清楚地看到国际化的JSP应用程序如何同时处理多个语言环境。

    编码JSP

    在这种情况下,index.jsp略有不同,因为它现在已链接到单个login.jsp。 清单4显示了此版本的index.jsp的代码:

    清单4.链接到单个login.jsp的语言环境选择页面
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Select Language</title> </head> <body> <table> <tr> <td colspan=4 bgcolor="black"> <br/> <center><font face="arial" size=+2 color="white"> <b><i>developer</i>Works Email</b></font> </center> <br/> </td> </tr> <tr><td> <c:url value="login.jsp" var="englishURL"> <c:param name="locale" value="en_US"/> </c:url> <a href="${englishURL}"> <img src="english.gif"/> </a> </td> <td> <c:url value="login.jsp" var="japaneseURL"> <c:param name="locale" value="ja_JP"/> </c:url> <a href="${japaneseURL}"> <img src="japanese.gif"/> </a> </td> <td> <c:url value="login.jsp" var="koreanURL"> <c:param name="locale" value="ko_KR"/> </c:url> <a href="${koreanURL}"> <img src="korean.gif"/> </a> </td> <td> <c:url value="login.jsp" var="chineseURL"> <c:param name="locale" value="zh_CN"/> </c:url> <a href="${chineseURL}"> <img src="chinese.gif"/> </a> </td> </tr> </table> </body> </html>

    在清单4中,请注意使用JSTL <c:param>标记来设置称为locale的URL请求参数。 当用户单击语言选择时,此参数将传递给login.jsp。 清单5显示了login.jsp的代码:

    清单5.使用J2SE资源包的登录页面(login.jsp)
    <%@ page pageEncoding="UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <html> <c:set var="loc" value="en_US"/> <c:if test="${!(empty param.locale)}"> <c:set var="loc" value="${param.locale}"/> </c:if> <fmt:setLocale value="${loc}" /> <fmt:bundle basename="app"> <head> <title>developerWorks <fmt:message key="email"/></title> </head> <body> <c:url value="confirm.jsp" var="formActionURL" /> <form action="${formActionURL}" method="post"> <table> <tr> <td colspan=2 bgcolor="black"> <br/> <center><font face="arial" size=+2 color="white"><b> <i>developer</i>Works <fmt:message key="email"/> </b></font></center> <br/> </td> </tr> <tr> <td><fmt:message key="userid"/></td> <td> <input type="hidden" name="locale" value="${loc}"/> <input type="text" name="userid" size="40"/></td> </tr> <tr> <td><fmt:message key="password"/></td> <td><input type="text" name="pass" size="40"/></td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="<fmt:message key='login'/>"/></td> </tr> </table> </form> </body> </fmt:bundle> </html>

    清单5使用JSTL国际化帮助程序标记库(请参阅参考资料 )。 如果传入的param.locale为空,则默认情况下将语言环境设置为en_US。 在使用资源包时,可以使用<fmt:setLocale>标记设置语言环境。

    设置区域设置后, <fmt:message>标记将从捆绑软件中的属性文件中提取与指定键对应的文本。 使用<fmt:bundle> JSTL标记将捆绑软件的基本名称设置为app 。 如果您在dwi18n / WEB-INF / classes目录下查看,则会在该资源包中看到所有属性文件(和其他文件)。 表1描述了这些文件。 请参阅相关主题与J2SE资源包工作以获取更多信息。

    表1.资源包中的文件
    文档名称 描述 app.properties 要使用的默认属性文件。 对应于en_US语言环境。 app_zh.properties zh_CN语言环境的属性文件。 包含中文编码的字符串。 app_ko.properties ko_KR语言环境的属性文件。 包含韩文编码的字符串。 app_ja.properties ja_JP语言环境的属性文件。 包含日语编码的字符串。 * .ucd Unicode源文件创建属性文件。 convacii.bat 批处理文件,用于将ucd文件转换为属性文件。

    作为示例,清单6中显示了app_ko.properties文件的内容:

    清单6.资源包中的app_ko.properties文件
    email=\uc774\uba54\uc77c userid=\uc544\uc774\ub514 password=\ube44\ubc00\ubc88\ud638 login=\ub85c\uadf8\uc778

    在清单6中,请注意所有Unicode字符都被转义了。 您必须这样做,因为Java资源束机制仅接受ASCII编码的属性文件。 要创建此文件,可以使用IDE中的字符串资源编辑器,也可以使用Unicode编辑器创建Unicode文件,然后使用JDK的nativetoascii实用程序对其进行转换。 在这种情况下, convascii.bat文件处理了转换。

    结论

    设计国际化JSP应用程序时,您需要了解独特的需求。 您的应用程序必须准备好支持具有不同区域设置要求的用户进行多个并发访问。 本文针对国际化JSP应用程序显示特定于语言环境的语言文本的问题提供了两种解决方案。 但是,我只是摸索了创建国际化就绪的服务器端应用程序的迷人技术的表面。 其他重要问题包括使用不同的日期和货币格式,管理GUI布局以及处理专门的输入法编辑器(IME,用于输入外来字符的实用程序软件)。 请参阅相关主题的信息,可以帮助你探索国际化更进一步。


    翻译自: https://www.ibm.com/developerworks/java/library/j-jspapp/index.html

    Processed: 0.017, SQL: 9