MessageTag.java
上传用户:jiancairen
上传日期:2007-08-27
资源大小:26458k
文件大小:6k
- /*
- * Copyright 2002-2004 the original author or authors.
- *
- * 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.springframework.web.servlet.tags;
- import java.io.IOException;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.JspTagException;
- import org.springframework.context.MessageSource;
- import org.springframework.context.NoSuchMessageException;
- import org.springframework.util.StringUtils;
- import org.springframework.web.util.ExpressionEvaluationUtils;
- import org.springframework.web.util.HtmlUtils;
- import org.springframework.web.util.JavaScriptUtils;
- import org.springframework.web.util.TagUtils;
- /**
- * Custom JSP tag to look up a message in the scope of this page.
- * Messages are looked up using the ApplicationContext, and thus should
- * support internationalization.
- *
- * <p>Regards a HTML escaping setting, either on this tag instance,
- * the page level, or the web.xml level. Can also apply JavaScript escaping.
- *
- * <p>If "code" isn't set or cannot be resolved, "text" will be used as default
- * message. Thus, this tag can also be used for HTML escaping of any texts.
- *
- * @author Rod Johnson
- * @author Juergen Hoeller
- * @see #setCode
- * @see #setText
- * @see #setHtmlEscape
- * @see #setJavaScriptEscape
- * @see HtmlEscapeTag#setDefaultHtmlEscape
- * @see org.springframework.web.util.WebUtils#HTML_ESCAPE_CONTEXT_PARAM
- */
- public class MessageTag extends HtmlEscapingAwareTag {
- private String code;
- private Object arguments;
- private String text;
-
- private String var;
-
- private String scope = TagUtils.SCOPE_PAGE;
- private boolean javaScriptEscape = false;
- /**
- * Set the message code for this tag.
- */
- public void setCode(String code) {
- this.code = code;
- }
- /**
- * Set optional message arguments for this tag, as a comma-delimited
- * String (each String argument can contain JSP EL), an Object array
- * (used as argument array), or a single Object (used as single argument).
- */
- public void setArguments(Object arguments) {
- this.arguments = arguments;
- }
- /**
- * Set the message text for this tag.
- */
- public void setText(String text) {
- this.text = text;
- }
-
- /**
- * Set PageContext attribute name under which to expose
- * a variable that contains the resolved message.
- * @see #setScope
- * @see javax.servlet.jsp.PageContext#setAttribute
- */
- public void setVar(String var) {
- this.var = var;
- }
-
- /**
- * Set the scope to export the variable to.
- * Default is SCOPE_PAGE ("page").
- * @see #setVar
- * @see org.springframework.web.util.TagUtils#SCOPE_PAGE
- * @see javax.servlet.jsp.PageContext#setAttribute
- */
- public void setScope(String scope) {
- this.scope = scope;
- }
- /**
- * Set JavaScript escaping for this tag, as boolean value.
- * Default is false.
- */
- public void setJavaScriptEscape(String javaScriptEscape) throws JspException {
- this.javaScriptEscape =
- ExpressionEvaluationUtils.evaluateBoolean("javaScriptEscape", javaScriptEscape, pageContext);
- }
- protected final int doStartTagInternal() throws JspException, IOException {
- MessageSource messageSource = getMessageSource();
- if (messageSource == null) {
- throw new JspTagException("No corresponding MessageSource found");
- }
- String resolvedCode = ExpressionEvaluationUtils.evaluateString("code", this.code, pageContext);
- String resolvedText = ExpressionEvaluationUtils.evaluateString("text", this.text, pageContext);
- String resolvedVar = ExpressionEvaluationUtils.evaluateString("var", this.var, pageContext);
- try {
- String msg = null;
- if (resolvedCode != null) {
- Object[] argumentsArray = null;
- if (this.arguments instanceof String) {
- argumentsArray = StringUtils.commaDelimitedListToStringArray((String) this.arguments);
- for (int i = 0; i < argumentsArray.length; i++) {
- argumentsArray[i] =
- ExpressionEvaluationUtils.evaluateString(
- "argument[" + i + "]", (String) argumentsArray[i], pageContext);
- }
- }
- else if (this.arguments instanceof Object[]) {
- argumentsArray = (Object[]) this.arguments;
- }
- else {
- // assume a single argument object
- argumentsArray = new Object[] {this.arguments};
- }
- if (resolvedText != null) {
- msg = messageSource.getMessage(
- resolvedCode, argumentsArray, resolvedText, getRequestContext().getLocale());
- }
- else {
- msg = messageSource.getMessage(
- resolvedCode, argumentsArray, getRequestContext().getLocale());
- }
- }
- else {
- msg = resolvedText;
- }
- // HTML and/or JavaScript escape, if demanded
- msg = isHtmlEscape() ? HtmlUtils.htmlEscape(msg) : msg;
- msg = this.javaScriptEscape ? JavaScriptUtils.javaScriptEscape(msg) : msg;
- // expose as variable, if demanded
- if (resolvedVar != null) {
- String resolvedScope = ExpressionEvaluationUtils.evaluateString("scope", this.scope, pageContext);
- pageContext.setAttribute(resolvedVar, msg, TagUtils.getScope(resolvedScope));
- }
- else {
- writeMessage(msg);
- }
- return EVAL_BODY_INCLUDE;
- }
- catch (NoSuchMessageException ex) {
- throw new JspTagException(getNoSuchMessageExceptionDescription(ex));
- }
- }
- /**
- * Write the message to the page.
- * <p>Can be overridden in subclasses, e.g. for testing purposes.
- * @param msg the message to write
- * @throws IOException if writing failed
- */
- protected void writeMessage(String msg) throws IOException {
- pageContext.getOut().write(String.valueOf(msg));
- }
- /**
- * Use the application context itself for default message resolution.
- */
- protected MessageSource getMessageSource() {
- return getRequestContext().getWebApplicationContext();
- }
- /**
- * Return default exception message.
- */
- protected String getNoSuchMessageExceptionDescription(NoSuchMessageException ex) {
- return ex.getMessage();
- }
- }