spring:eval tag initial commit

This commit is contained in:
Keith Donald
2010-02-11 22:53:49 +00:00
parent 16aa399040
commit f23b55dc13
8 changed files with 309 additions and 12 deletions

View File

@@ -0,0 +1,181 @@
/*
* Copyright 2002-2009 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.PageContext;
import org.springframework.beans.BeansException;
import org.springframework.core.convert.ConversionService;
import org.springframework.expression.AccessException;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.PropertyAccessor;
import org.springframework.expression.TypedValue;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.expression.spel.support.StandardTypeConverter;
import org.springframework.web.util.ExpressionEvaluationUtils;
import org.springframework.web.util.HtmlUtils;
import org.springframework.web.util.JavaScriptUtils;
import org.springframework.web.util.TagUtils;
/**
* JSP tag for evaluating expressions with the Spring Expression Language (SpEL).
* Supports the standard JSP evaluation context consisting of implicit variables and scoped attributes.
*
* @author Keith Donald
* @since 3.0.1
*/
public class EvalTag extends HtmlEscapingAwareTag {
private ExpressionParser expressionParser;
private String expression;
private String var;
private int scope = PageContext.PAGE_SCOPE;
private boolean javaScriptEscape = false;
/**
* Set the expression to evaluate.
*/
public void setExpression(String expression) {
this.expression = expression;
}
/**
* Set the variable name to expose the evaluation result under.
* Defaults to rendering the result to the current JspWriter
*/
public void setVar(String var) {
this.var = var;
}
/**
* Set the scope to export the evaluation result to.
* This attribute has no meaning unless var is also defined.
*/
public void setScope(String scope) {
this.scope = TagUtils.getScope(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, this.pageContext);
}
@Override
public int doStartTagInternal() throws JspException {
this.expressionParser = new SpelExpressionParser();
return EVAL_BODY_INCLUDE;
}
@Override
public int doEndTag() throws JspException {
Expression expression = this.expressionParser.parseExpression(this.expression);
EvaluationContext context = createEvaluationContext();
if (this.var == null) {
// print the url to the writer
try {
String result = expression.getValue(context, String.class);
result = isHtmlEscape() ? HtmlUtils.htmlEscape(result) : result;
result = this.javaScriptEscape ? JavaScriptUtils.javaScriptEscape(result) : result;
pageContext.getOut().print(result);
}
catch (IOException e) {
throw new JspException(e);
}
}
else {
// store the url as a variable
pageContext.setAttribute(var, expression.getValue(context), scope);
}
return EVAL_PAGE;
}
private EvaluationContext createEvaluationContext() {
StandardEvaluationContext context = new StandardEvaluationContext();
context.addPropertyAccessor(new JspPropertyAccessor(this.pageContext));
ConversionService conversionService = getConversionService();
if (conversionService != null) {
context.setTypeConverter(new StandardTypeConverter());
}
return context;
}
private ConversionService getConversionService() {
try {
// TODO replace this with a call to RequestContext that is not brittle
return getRequestContext().getWebApplicationContext().getBean("conversionService", ConversionService.class);
} catch (BeansException e) {
return null;
}
}
private static class JspPropertyAccessor implements PropertyAccessor {
private PageContext pageContext;
public JspPropertyAccessor(PageContext pageContext) {
this.pageContext = pageContext;
}
public Class<?>[] getSpecificTargetClasses() {
return null;
}
public boolean canRead(EvaluationContext context, Object target,
String name) throws AccessException {
if (name.equals("pageContext")) {
return true;
}
// TODO support all other JSP implicit variables defined at http://java.sun.com/javaee/6/docs/api/javax/servlet/jsp/el/ImplicitObjectELResolver.html
return this.pageContext.findAttribute(name) != null;
}
public TypedValue read(EvaluationContext context, Object target,
String name) throws AccessException {
if (name.equals("pageContext")) {
return new TypedValue(this.pageContext);
}
// TODO support all other JSP implicit variables defined at http://java.sun.com/javaee/6/docs/api/javax/servlet/jsp/el/ImplicitObjectELResolver.html
return new TypedValue(this.pageContext.findAttribute(name));
}
public boolean canWrite(EvaluationContext context, Object target,
String name) throws AccessException {
return false;
}
public void write(EvaluationContext context, Object target,
String name, Object newValue) throws AccessException {
throw new UnsupportedOperationException();
}
}
}