国際化対応コンテキスト API の使用

Enterprise JavaBeans (EJB) クライアント・アプリケーション、サーブレット、およびエンタープライズ Bean は、 国際化対応コンテキスト API を使用して、国際化対応コンテキストをプログラマチックに取得および管理できます。 Web サービス・クライアント・アプリケーションの場合は、API を使用して、EJB クライアントの場合と同じ方法で、国際化対応コンテキストを取得および管理します。

始める前に

java.util および com.ibm.websphere.i18n.context パッケージには、EJB アプリケーション内で国際化対応サービスを使用するために必要なクラスがすべて含まれています。

手順

  1. 国際化対応コンテキスト API へのアクセスを取得します。

    国際化対応コンテキスト API 参照の解決は、 アプリケーション・コンポーネントの初期化メソッド内 (例えば、サーブレットの init メソッド、またはエンタープライズ Bean の SetXxxContext メソッド内) で、 アプリケーション・コンポーネントのライフサイクルの間に一度行ってください。 Web サービス・クライアント・プログラムの場合は、初期化時に国際化対応コンテキスト API への参照を解決します。Web サービス対応の Stateless Session Bean の場合は、setSessionContext メソッドで参照を解決します。

  2. 呼び出し元のロケールおよび時間帯にアクセスします。

    アプリケーション・コンポーネントのリモート起動ごとに、関連する呼び出し元の国際化対応コンテキストが、その起動を実行しているスレッドに関連付けられています。 呼び出し元コンテキストは、国際化対応サービスおよびミドルウェアによって、 Enterprise JavaBeans (EJB) ビジネス・メソッドやサーブレット・サービス・メソッドなどの、 要求の宛先に伝搬されます。 このタスクは、Web サービス・クライアント・プログラムにも適用されます。

  3. 起動ロケールおよび時間帯にアクセスします。

    サーブレット・サービスまたは Enterprise JavaBeans (EJB) ビジネス・メソッドのすべてのリモート起動には、 起動国際化対応コンテキストが、その起動を実行しているスレッドに関連付けられています。 起動コンテキストは、国際化対応コンテキストであり、この下でサーブレットおよびビジネス・メソッドの実装が実行されます。起動コンテキストは、国際化対応サービスおよびミドルウェアによって以降の起動時に伝搬されます。このタスクは、Web サービス・クライアント・プログラムにも適用されます。

タスクの結果

この結果生成されるコンポーネントは、アプリケーション管理国際化対応 (AMI) と呼ばれます。AMI について詳しくは、国際化対応コンテキスト: 管理ポリシーを参照してください。

国際化対応コンテキスト API の使い方は、サポートされている各アプリケーション・コンポーネントによってそれぞれ異なっています。各コンポーネント・ タイプ内での API の使用方法を示したコード例が用意されています。 API 使用法の相違、およびその他のコーディング・ヒントが、 関連するステートメント・ブロックの前にコメント形式で記載されています。

EJB クライアント・プログラム内での国際化対応コンテキストの管理: 以下の コード例は、組み込まれている EJB クライアント・プログラム、または Web サービス・クライアント・プログラム内での国際化対応コンテキスト API の使用方法を示したものです。

//------------------------------------------
// Basic Example: J2EE EJB client.
//------------------------------------------
package examples.basic;

//------------------------------------------
// INTERNATIONALIZATION SERVICE: Imports.
//------------------------------------------
import com.ibm.websphere.i18n.context.UserInternationalization;
import com.ibm.websphere.i18n.context.Internationalization;
import com.ibm.websphere.i18n.context.InvocationInternationalization;

import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.NamingException;
import java.util.Locale;
import java.util.SimpleTimeZone;

public class EjbClient {

  public static void main(String args[]) {

    //--------------------------------------------------
    // INTERNATIONALIZATION SERVICE: API references.
    //--------------------------------------------------
    UserInternationalization userI18n = null;
    Internationalization callerI18n = null;
    InvocationInternationalization invocationI18n = null;
   
    //--------------------------------------------------
    // INTERNATIONALIZATION SERVICE: JNDI name.
    //--------------------------------------------------
    final String UserI18NUrl =
        "java:comp/websphere/UserInternationalization";

    //--------------------------------------------------
    // INTERNATIONALIZATION SERVICE: Resolve the API.
    //--------------------------------------------------
    try {
     Context initialContext = new InitialContext();
     userI18n = (UserInternationalization)initialContext.lookup(
         UserI18NUrl);
     callerI18n = userI18n.getCallerInternationalization();
     invI18n = userI18n.getInvocationInternationalization ();
    } catch (NamingException ne) {
      log("Error: Cannot resolve UserInternationalization: Exception: " + ne);
    } catch (IllegalStateException ise) {
      log("Error: UserInternationalization is not available: " + ise);
    }
    ...

    //--------------------------------------------------------------------
    // INTERNATIONALIZATION SERVICE: Set invocation context.
    //
    // Under Application-managed Internationalization (AMI), contained EJB
    // client programs may set invocation context elements. The following 
    // statements associate the supplied invocation locale and time zone
    // with the current thread. Subsequent remote bean method calls will
    // propagate these context elements.
    //--------------------------------------------------------------------
    try {
      invocationI18n.setLocale(new Locale("fr", "FR", ""));
      invocationI18n.setTimeZone("ECT");
    } catch (IllegalStateException ise) {
      log("An anomaly occurred accessing Invocation context: " + ise );
    }
    ...

    //--------------------------------------------------------------------
    // INTERNATIONALIZATION SERVICE: Get locale and time zone.
    //
    // Under AMI, contained EJB client programs can get caller and
    // invocation context elements associated with the current thread.
    // The next four statements return the invocation locale and time zone
    // associated above, and the caller locale and time zone associated
    // internally by the service. Getting a caller context element within
    // a contained client results in the default element of the JVM.
    //--------------------------------------------------------------------
    Locale invocationLocale = null;
    SimpleTimeZone invocationTimeZone = null;
    Locale callerLocale = null;
    SimpleTimeZone callerTimeZone = null;
    try {
      invocationLocale = invocationI18n.getLocale();
      invocationTimeZone =
          (SimpleTimeZone)invocationI18n.getTimeZone();
      callerLocale = callerI18n.getLocale();
      callerTimeZone = SimpleTimeZone)callerI18n.getTimeZone();
    } catch (IllegalStateException ise) {
      log("An anomaly occurred accessing I18n context: " + ise );
    }

    ...
  } // main

  ...
  void log(String s) {
    System.out.println (((s == null) ? "null" : s));
  }
} // EjbClient

サーブレット内での国際化対応コンテキストの管理: 以下のコード例は、サーブレット内での 国際化対応コンテキスト API の使用方法を示したものです。 init および doPost メソッド内のコメントに注意してください。

...
//--------------------------------------------------------------------
// INTERNATIONALIZATION SERVICE: Imports.
//--------------------------------------------------------------------
import com.ibm.websphere.i18n.context.UserInternationalization;
import com.ibm.websphere.i18n.context.Internationalization;
import com.ibm.websphere.i18n.context.InvocationInternationalization;

import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.NamingException;
import java.util.Locale;

public class J2eeServlet extends HttpServlet {

  ...
  //------------------------------------------------------------------
  // INTERNATIONALIZATION SERVICE: API references.
  //------------------------------------------------------------------
  protected UserInternationalization userI18n = null;
  protected Internationalization i18n = null;
  protected InvocationInternationalization invI18n = null;

  //------------------------------------------------------------
  // INTERNATIONALIZATION SERVICE: JNDI name.
  //------------------------------------------------------------
  public static final String UserI18NUrl =
      "java:comp/websphere/UserInternationalization";

  protected Locale callerLocale = null;
  protected Locale invocationLocale = null;

  /**
   * Initialize this servlet.
   * Resolve references to the JNDI initial context and the
   * internationalization context API.
   */
  public void init() throws ServletException {

    //------------------------------------------------------------------
    // INTERNATIONALIZATION SERVICE: Resolve API.
    //
    // Under Container-managed Internationalization (CMI), servlets have
    // read-only access to invocation context elements. Attempts to set these
    // elements result in an IllegalStateException.
    //
    // Suggestion: cache all internationalization context API references
    // once, during initialization, and use them throughout the servlet
    // lifecycle.
    //------------------------------------------------------------------
    try {
      Context initialContext = new InitialContext();
      userI18n = (UserInternationalization)initialContext.lookup(UserI18nUrl);
      callerI18n = userI18n.getCallerInternationalization();
      invI18n = userI18n.getInvocationInternationalization ();
    } catch (NamingException ne) {
      throw new ServletException("Cannot resolve UserInternationalization" + ne);
    } catch (IllegalStateException ise) {
      throw new ServletException ("Error: UserInternationalization is not available: " + ise);
    }
    ...
  } // init
  
  /**
   * Process incoming HTTP GET requests.
   * @param request Object that encapsulates the request to the servlet
   * @param response Object that encapsulates the response from the
   *    Servlet.
   */
  public void doGet(
      HttpServletRequest  request,
      HttpServletResponse response)
    throws ServletException, IOException {
    doPost(request, response);
  } // doGet

  /**
   * Process incoming HTTP POST requests
   * @param request Object that encapsulates the request to
   *    the Servlet.
   * @param response Object that encapsulates the response from
   *    the Servlet.
   */
  	public void doPost(
      HttpServletRequest  request,
      HttpServletResponse response)
    throws ServletException, IOException {

    ...
    //--------------------------------------------------------------------
    // INTERNATIONALIZATION SERVICE: Get caller context.
    //
    // The internationalization service extracts the accept-languages
    // propagated in the HTTP request and associates them with the
    // current thread as a list of locales within the caller context.
    // These locales are accessible within HTTP Servlet service methods
    // using the caller internationalization object.
    // 
    // If the incoming HTTP request does not contain accept languages,
    // the service associates the server's default locale. The service
    // always associates the GMT time zone.
    //
    //--------------------------------------------------------------------
    try {
      callerLocale = callerI18n.getLocale();   // caller locale
      // the following code enables you to get invocation locale,
      // which depends on the Internationalization policies.
      invocationLocale = invI18n.getLocale();  // invocation locale
    } catch (IllegalStateException ise) {
      log("An anomaly occurred accessing Invocation context: " + ise );
    }
    // NOTE: Browsers may propagate accept-languages that contain a
    // language code, but lack a country code, like "fr" to indicate
    // "French as spoken in France."  The following code supplies a
    // default country code in such cases.
    if (callerLocale.getCountry().equals(""))
      callerLocale = AccInfoJBean.getCompleteLocale(callerLocale);
    
    // Use iLocale in JDK locale-sensitive operations, etc.
    ...
  } // doPost
  
  ...
  void log(String s) {
    System.out.println (((s == null) ? "null" : s));
  }
} // CLASS J2eeServlet

セッション Bean 内での国際化対応 コンテキストの管理: このコード例は、セッション Bean または Web サービス対応 セッション Bean 内で国際化対応サービスを使用して、ローカライズされた操作を 実行する方法を示したものです。

...
//------------------------------------------------------------
// INTERNATIONALIZATION SERVICE: Imports.
//------------------------------------------------------------
import com.ibm.websphere.i18n.context.UserInternationalization;
import com.ibm.websphere.i18n.context.Internationalization;
import com.ibm.websphere.i18n.context.InvocationInternationalization;

import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.NamingException;
import java.util.Locale;

/**
 * This is a stateless Session Bean Class
 */
public class J2EESessionBean implements SessionBean {

  //------------------------------------------------------------
  // INTERNATIONALIZATION SERVICE: API references.
  //------------------------------------------------------------
  protected UserInternationalization userI18n = null;
  protected InvocationInternationalization invI18n = null;

  //------------------------------------------------------------
  // INTERNATIONALIZATION SERVICE: JNDI name.
  //------------------------------------------------------------
  public static final String UserI18NUrl =
      "java:comp/websphere/UserInternationalization";
  ...
  
  /**
   * Obtain the appropriate internationalization interface
   * reference in this method.
   * @param ctx javax.ejb.SessionContext
   */
  public void setSessionContext(javax.ejb.SessionContext ctx) {

    //------------------------------------------------------------
    // INTERNATIONALIZATION SERVICE: Resolve the API.
    //------------------------------------------------------------
    try {
      Context initialContext = new InitialContext();
      userI18n = (UserInternationalization)initialContext.lookup(
          UserI18NUrl);
      invI18n = userI18n.getInvocationInternationalization ();
    } catch (NamingException ne) {
      log("Error: Cannot resolve UserInternationalization: Exception: " + ne);
        
    } catch (IllegalStateException ise) {
      log("Error: UserInternationalization is not available: " + ise);
    }
  } // setSessionContext

 /**
  * Set up resource bundle using I18n Service
  */
  public void setResourceBundle()
  {
    Locale invLocale   = null;

    //------------------------------------------------------------
    // INTERNATIONALIZATION SERVICE: Get invocation context.
    //------------------------------------------------------------
    try {
      invLocale = invI18n.getLocale();
    } catch (IllegalStateException ise) {
      log ("An anomaly occurred while accessing Invocation context: " + ise );
    }
    try {
      Resources.setResourceBundle(invLocale);
      // Class Resources provides support for retrieving messages from
      // the resource bundle(s). See Currency Exchange sample source code.
    } catch (Exception e) {
      log("Error: Exception occurred while setting resource bundle: " + e);
    }
  } // setResourceBundle

  /**
   * Pass message keys to get the localized texts
   * @return java.lang.String []
   * @param key java.lang.String []
   */
  public String[] getMsgs(String[] key) {
    setResourceBundle();
    return Resources.getMsgs(key);
  }

  ...
  void log(String s) {
    System.out.println (((s == null) ? ";null" : s));
  }
} // CLASS J2EESessionBean

SOAP ヘッダー内での国際化対応コンテキストの表示: このコード例は、Web サービス要求の SOAP ヘッダー内で 国際化対応コンテキストがどのように表されるかを示したものです。

<InternationalizationContext>
   <Locales>
      <Locale>
         <LanguageCode>ja</LanguageCode>
         <CountryCode>JP</CountryCode>
         <VariantCode>Nihonbushi</VariantCode>
      </Locale>
      <Locale>
         <LanguageCode>fr</LanguageCode>
         <CountryCode>FR</CountryCode>
      </Locale>
      <Locale>
         <LanguageCode>en</LanguageCode>
         <CountryCode>US</CountryCode>
      </Locale>
   </Locales>
   <TimeZoneID>JST</TimeZoneID>
</InternationalizationContext>
この表示は、以下のスキーマに対して有効です。
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="InternationalizationContext"
                 type="InternationalizationContextType">
    </xsd:element>

    <xsd:complexType name="InternationalizationContextType">
        <xsd:sequence>
            <xsd:element name="Locales"
                         type="LocalesType">
            </xsd:element>
            <xsd:element name="TimeZoneID"
                         type="xsd:string">
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="LocalesType">
        <xsd:sequence>
            <xsd:element name="Locale"
                         type="LocaleType"
                         minOccurs="0"
                         maxOccurs="unbounded">
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="LocaleType">
        <xsd:sequence>
            <xsd:element name="LanguageCode"
                         type="xsd:string"
                         minOccurs="0"
                         maxOccurs="1">
            </xsd:element>
            <xsd:element name="CountryCode"
                         type="xsd:string"
                         minOccurs="0"
                         maxOccurs="1">
            </xsd:element>
            <xsd:element name="VariantCode"
                         type="xsd:string"
                         minOccurs="0"
                         maxOccurs="1">
            </xsd:element>
         </xsd:sequence>
    </xsd:complexType>
    
</xsd:schema> 

トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tin_manageapi
ファイル名:tin_manageapi.html