setlocalesupport.java
来自「jakarta-taglibs」· Java 代码 · 共 464 行 · 第 1/2 页
JAVA
464 行
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
* Licensed 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.
*/
package org.apache.taglibs.standard.tag.common.fmt;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Vector;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.jstl.core.Config;
import javax.servlet.jsp.jstl.fmt.LocalizationContext;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.taglibs.standard.resources.Resources;
import org.apache.taglibs.standard.tag.common.core.Util;
/**
* Support for tag handlers for <setLocale>, the locale setting tag in
* JSTL 1.0.
*
* @author Jan Luehe
*/
public abstract class SetLocaleSupport extends TagSupport {
//*********************************************************************
// Private constants
private static final char HYPHEN = '-';
private static final char UNDERSCORE = '_';
//*********************************************************************
// Protected state
protected Object value; // 'value' attribute
protected String variant; // 'variant' attribute
//*********************************************************************
// Private state
private int scope; // 'scope' attribute
//*********************************************************************
// Constructor and initialization
public SetLocaleSupport() {
super();
init();
}
private void init() {
value = variant = null;
scope = PageContext.PAGE_SCOPE;
}
//*********************************************************************
// Tag attributes known at translation time
public void setScope(String scope) {
this.scope = Util.getScope(scope);
}
//*********************************************************************
// Tag logic
public int doEndTag() throws JspException {
Locale locale = null;
if (value == null) {
locale = Locale.getDefault();
} else if (value instanceof String) {
if (((String) value).trim().equals("")) {
locale = Locale.getDefault();
} else {
locale = parseLocale((String) value, variant);
}
} else {
locale = (Locale) value;
}
Config.set(pageContext, Config.FMT_LOCALE, locale, scope);
setResponseLocale(pageContext, locale);
return EVAL_PAGE;
}
// Releases any resources we may have (or inherit)
public void release() {
init();
}
//*********************************************************************
// Public utility methods
/**
* See parseLocale(String, String) for details.
*/
public static Locale parseLocale(String locale) {
return parseLocale(locale, null);
}
/**
* Parses the given locale string into its language and (optionally)
* country components, and returns the corresponding
* <tt>java.util.Locale</tt> object.
*
* If the given locale string is null or empty, the runtime's default
* locale is returned.
*
* @param locale the locale string to parse
* @param variant the variant
*
* @return <tt>java.util.Locale</tt> object corresponding to the given
* locale string, or the runtime's default locale if the locale string is
* null or empty
*
* @throws IllegalArgumentException if the given locale does not have a
* language component or has an empty country component
*/
public static Locale parseLocale(String locale, String variant) {
Locale ret = null;
String language = locale;
String country = null;
int index = -1;
if (((index = locale.indexOf(HYPHEN)) > -1)
|| ((index = locale.indexOf(UNDERSCORE)) > -1)) {
language = locale.substring(0, index);
country = locale.substring(index+1);
}
if ((language == null) || (language.length() == 0)) {
throw new IllegalArgumentException(
Resources.getMessage("LOCALE_NO_LANGUAGE"));
}
if (country == null) {
if (variant != null)
ret = new Locale(language, "", variant);
else
ret = new Locale(language, "");
} else if (country.length() > 0) {
if (variant != null)
ret = new Locale(language, country, variant);
else
ret = new Locale(language, country);
} else {
throw new IllegalArgumentException(
Resources.getMessage("LOCALE_EMPTY_COUNTRY"));
}
return ret;
}
//*********************************************************************
// Package-scoped utility methods
/*
* Stores the given locale in the response object of the given page
* context, and stores the locale's associated charset in the
* javax.servlet.jsp.jstl.fmt.request.charset session attribute, which
* may be used by the <requestEncoding> action in a page invoked by a
* form included in the response to set the request charset to the same as
* the response charset (this makes it possible for the container to
* decode the form parameter values properly, since browsers typically
* encode form field values using the response's charset).
*
* @param pageContext the page context whose response object is assigned
* the given locale
* @param locale the response locale
*/
static void setResponseLocale(PageContext pc, Locale locale) {
// set response locale
ServletResponse response = pc.getResponse();
response.setLocale(locale);
// get response character encoding and store it in session attribute
if (pc.getSession() != null) {
try {
pc.setAttribute(RequestEncodingSupport.REQUEST_CHAR_SET,
response.getCharacterEncoding(),
PageContext.SESSION_SCOPE);
} catch (IllegalStateException ex) {} // invalidated session ignored
}
}
/*
* Returns the formatting locale to use with the given formatting action
* in the given page.
*
* @param pc The page context containing the formatting action
* @param fromTag The formatting action
* @param format <tt>true</tt> if the formatting action is of type
* <formatXXX> (as opposed to <parseXXX>), and <tt>false</tt> otherwise
* (if set to <tt>true</tt>, the formatting locale that is returned by
* this method is used to set the response locale).
*
* @param avail the array of available locales
*
* @return the formatting locale to use
*/
static Locale getFormattingLocale(PageContext pc,
Tag fromTag,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?