All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.struts.util.package-info Maven / Gradle / Ivy

The newest version!
/*
 * $Id$
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

/**
 * The Utilities package provides a variety of families of classes,
 * to solve problems that are commonly encountered in building web applications.
 * 

* * *
* [Introduction] * [Beans] * [Servlet Utilities] * [Message Resources] *
* *
* * * *

Introduction

* *

The Struts Utilities Package offers several families * of classes that assist in solving commonly encountered problems when * building * web applications. Most of the classes in this package do not rely on the * controller servlet framework, or the custom tag libraries, so they are * also * suitable for general Java application programming. The following families * are included:

*
    *
  • Beans - A small set of utility beans useful * for * encapsulating form elements.
  • *
  • Servlet Utilities - A set of classes * useful * for working with servlet-related classes.
  • *
  • Message Resources - A family of classes * that * features access to internationalized message strings based on a * message * key coupled with a java.util.Locale object representing a * particular user's preferred language.
  • *
* *
* * * *

Beans

* *

The ImageButtonBean is a simple JavaBean to encapsulate the * request parameters sent for an HTML input element of type image. The * LabelValueBean is a simple JavaBean to represent label-value * pairs, especially useful for html option elements. *

* *
* * * *

Servlet Utilities

* *

The {@code RequestUtils} is a general purpose utility methods * related to processing a servlet request. The {@code ResponseUtils} * is a general purpose utility methods related to generating a servlet * response. The {@code ServletContextWriter} is a PrintWriter * implementation that uses the logging facilities of a * {@code jakarta.servlet.ServletContext} to output its results. *

* *
* * * *

Message Resources

* *
Background
* *

Modern applications often include the requirement to support multiple * languages, for users who prefer to interact in a language other than the * default language configured on the server platform. In addition, sentences * often need to be constructed, with dynamic content whose placement in the * message depends on the standard sentence structure in that particular * language.

* *

The standard Java platform includes a family of classes * (java.util.ResourceBundle) designed to support looking up * message * strings based on a standard "key". The resource bundle classes * automatically * access a Java class (or properties file) that is named with a naming * convention that includes the Locale to which messages in that class (or * file) * pertain. However, this selection is based only on the default Locale of * the * server platform, and cannot be adjusted on a per-user basis as required * for an * internationalized web application.

* *

Struts includes a family of classes * (org.apache.struts.util.MessageResources) that extends the * basic * approach to looking up message strings by key, allowing you to optionally * specify a Locale along with the key. In this way, you can build * applications * that let your users select which Locale they wish to operate within, and * then * look up messages in that language - using the same message keys no matter * what * language is selected.

* *

In addition to supporting dynamic selection of a Locale for message lookup, * the MessageResources family of classes optionally allow you * to * specify up to four parameter replacement objects, which are used to * replace the * parameter placeholders "{0}" through "{3}" in the retrieved message. This * replacement uses the facilities of the standard Java * java.text.MessageFormat class, which supports many extended * formatting capabilities as well.

* *

For more information about internationalized messages, consult the * following * resources in your Java Development Kit documentation bundle:

*
    *
  • Internationalization Info - General information on Java's * standard * support for internationalized applications can be found at * <$JAVA_HOME/docs/guide/internat/index.html>. * The "Internationalization Overview" section includes useful * information * about Locales, localized resources, message formatting, and other * relevant topics.
  • *
  • Internationalization Tutorial - The Java Language Tutorial * has a * comprehensive trail covering internationalization, available at: * * https://docs.oracle.com/javase/tutorial/i18n/index.html.
  • *
  • Javadoc APIs - You will want to consult the Javadoc API * documentation for the following standard Java classes: *
      *
    • java.text.MessageFormat *
    • java.util.ResourceBundle *
    • java.util.PropertyResourceBundle *
    • java.util.Properties - See the documentation for * the * load() method for the valid syntax of properties * files * that you prepare.
    • *
  • *
* *
Using the Standard MessageResources Implementation
* *

The standard MessageResources implementation provided by the * Struts library uses Java properties files to initialize message strings, * in a * manner very similar to that supported by the * java.util.PropertyResourceBundle class. The following steps * are * required to use these facilities in your Java application.

* *

First, prepare a Java properties file for each language (or Locale) in * which * you wish to support your messages. The filenames you use must conform to * the * naming convention for property resource bundles, as described in the * documentation referenced above. Be sure you use the same message keys in * each * file to identify the same message.

* *

For example, you might prepare files in French, Spanish, and English that * contain language-specific versions of the word "Hello". The French file * would * be named Messages_fr.properties and contain the following: *

*
 *    hi=Bonjour
* *

while the Spanish and English files would be named * Messages_es.properties and * Messages_en.properties * respectively. The corresponding message string definitions would say * hi=Hola and hi=Hello in these files.

* *

Second, place these properties files into the class path for your * application, exactly as you would with class files themselves. The name * actually used to load resources will look like a fully qualified Java * class * name (with appropriate package prefixes), so the file should be nested * inside * a directory structure that matches the packaging (either in an unpacked * directory, or within a JAR file, as appropriate). For example, assume you * place directory "foo" on your classpath, and stored the above properties * files * in directory "foo/com/mycompany/mypackage". (If you were using a JAR file * like * "foo.jar" instead, the files would be in directory * "com/mycompany/mypackage" * within the JAR file). * *

Third, initialize a MessageResources object that corresponds * to the set of properties files for a particular name, within a particular * package. The easiest way to do this is to initialize a variable in your * main * application class, like this:

*
 *    public static MessageResources messages =
 *    MessageResources.getMessageResources("com.mycompany.mypackage.Messages");
* *

Note that the "com.mycompany.mypackage" part of the name matches the * package * directory into which you placed your properties files, and "Messages" is * the * filename prefix for the particular family of properties files supported by * this * MessageResources instance. Depending on your development * process, * you might find it convenient to store all message strings for an entire * application in a single properties file family, or to have several * families - * in Struts, for example, there is a family of properties files for each * Java * package.

* *

To access a message string with a particular Locale, execute a statement * like this:

*
 *    Locale locale = ... select the locale to be used ...
 *    String message = messages.getMessage(locale, "hi");
* *

In this case, the variable message will contain the message * string corresponding to the key "hi", in the language that corresponds to * the * locale that was selected.

* *

For an example of message formatting with replaceable parameters, assume * that the message strings looked like this, instead (only the English * version * is shown - corresponding changes would be made in the other files):

*
 *    hi=Hello {0}
* *

Now, you can personalize the retrieved message like this:

*
 *    Locale locale = ... select the locale to be used ...
 *    String name = "Joe";
 *    String message = messages.getMessage(locale, "hi", name);
* *

and the marker "{0}" will have been replaced by the specified name (Joe), * no matter which language is in use. See the JavaDoc API documentation for * the * java.text.MessageFormat class for more advanced uses of the * parameter replacement mechanism.

* *
Developing Your Own MessageResources Implementation
* *

In the above example, we were using the default * MessageResources implementation supplied by Struts, which * uses * property files to store the message strings. It is also possible to create * customized mechanisms to retrieve messages (such as loading them on demand * from a database). The steps required are as follows:

*
    *
  • Create a customized subclass of * org.apache.struts.util.MessageResources that implements * message lookup operations as you require.
  • *
  • Create a customized subclass of * org.apache.struts.util.MessageResourcesFactory that will * create an instance of your custom MessageResources class * when the createResources method is called. Note that the * "config" argument to this method can be used to select families of * messages in any manner appropriate to your needs - you are not * required * to emulate the "fully qualified Java class name" approach that is used * by the standard PropertyMessageResourcesFactory class. *
  • *
  • Tell the MessageResourcesFactory class the name of the * customized MessageResourcesFactory implementation to use * when creating new factory instances.
  • *
  • Create a new factory instance.
  • *
  • Ask the new factory instance to create a MessageResources * instance for you.
  • *
* *

A code example that illustrates this technique is:

*
 *    MessageResourcesFactory.setFactoryClass("com.mycompany.mypkg.MyFactory");
 *    MessageResourcesFactory factory = MessageResourcesFactory.createFactory();
 *    MessageResources resources =
 *    factory.createResources("configuration information");
* *

Once you have created your custom MessageResources instance, you utilize it * to access message strings (with or without parameter replacement objects), * exactly as we illustrated with the standard implementation in the previous * section.

* *
Using MessageResources With Struts
* *

If your application uses the Struts controller servlet, you can optionally * configure Struts to load an application-specific message resources * instance for * you, and make it available as a servlet context attribute (in JSP terms, * an * application-scope bean). This mechanism is managed by setting the * following * servlet initialization parameters in the web application deployment * descriptor: *

*
    *
  • application - The configuration string that will be * passed to the createResources() method of the message * resources factory, in order to identify the family of resources to be * supported. If you use the standard message resources factory, this * must * be the base fully qualified name of the property resources files used * to contain these messages, as illustrated above.
  • *
  • factory - Fully qualified Java class name of the * MessageResourcesFactory to be used. By default, the * standard * implementation provided by Struts * (org.apache.struts.util.PropertyMessageResourcesFactory) * will be used.
  • *
* *

Struts provides several JSP custom tags that assume the existence of a * java.util.Locale attribute in the user's session, under the * key * named by the constant string value of Action.LOCALE_KEY. Your * own * application logic can set this attribute at any time, or you can ask * Struts to * set it automatically (if not already set) based on the * Accept-Language HTTP header included with the request. There * are * two mechanisms by which you request Struts to perform this service:

*
    *
  • To have this service performed on every request submitted to the * controller * servlet, set the servlet initialization parameter locale * to * the value true in the application deployment descriptor. *
  • *
  • To have this service performed by a JSP page when it is accessed * directly * by a user, utilize a <form:html ... locale="true" ... * /> * tag at the top of each page.
  • *
*/ package org.apache.struts.util;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy