我们将 HTML 标记存储在 XML 文档中并使用 JiBX 进行解码。我们也使用 Spring,当这些对象之一被添加到模型中时,我们可以通过 EL 在 JSP 中访问它。
${model.bookshelf.columnList[0].linkList[0].htmlMarkup}
没有什么开创性的。但是如果我们想在 HTML 标记中存储 EL 表达式怎么办?例如,如果我们要存储以下链接怎么办?
<a href="/${localePath}/important">Locale-specific link</a>
...并将其显示在 JSP 中,其中 LocalePath 是请求属性。
或者更有趣的是,如果我们想存储以下内容怎么办?
The link ${link.href} is in column ${column.name}.
...并将其显示在嵌套的 JSP forEach 中...
<c:forEach var="column" items="${bookshelf.columnList}">
<c:forEach var="link" items="${column.linkList}">
${link.htmlMarkup}
</c:forEach>
</c:forEach>
请求属性中的这些 EL 表达式永远不会被评估。有没有办法让他们评估?像“eval”标签之类的东西? token 替换在第一个示例中有效,但在第二个示例中无效,并且不是很健壮。
最佳答案
如果我理解正确:您正在寻找一种在运行时评估 EL 表达式的方法,该表达式存储在 EL 表达式提供的另一个值中 - 类似于递归 EL 评估。
由于我找不到任何现有的标签,我很快就为这样的 EvalTag 整理了一个概念证明:
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.servlet.ServletContext;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleEvalTag extends SimpleTagSupport {
private Object value;
@Override
public void doTag() throws JspException {
try {
ServletContext servletContext = ((PageContext)this.getJspContext()).getServletContext();
JspApplicationContext jspAppContext = JspFactory.getDefaultFactory().getJspApplicationContext(servletContext);
String expressionStr = String.valueOf(this.value);
ELContext elContext = this.getJspContext().getELContext();
ValueExpression valueExpression = jspAppContext.getExpressionFactory().createValueExpression(elContext, expressionStr, Object.class);
Object evaluatedValue = valueExpression.getValue(elContext);
JspWriter out = getJspContext().getOut();
out.print(evaluatedValue);
out.flush();
} catch (Exception ex) {
throw new JspException("Error in SimpleEvalTag tag", ex);
}
}
public void setValue(Object value) {
this.value = value;
}
}
相关顶级域名:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
<tlib-version>1.0</tlib-version>
<short-name>custom</short-name>
<uri>/WEB-INF/tlds/custom</uri>
<tag>
<name>SimpleEval</name>
<tag-class>SimpleEvalTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Object</type>
</attribute>
</tag>
</taglib>
用法:
<custom:SimpleEval value="${someELexpression}" />
注:
我已经使用 Tomcat 7.0.x/JSP 2.1 对其进行了测试,但是正如您在源代码中看到的那样,没有特殊的错误处理等,因为它只是一些概念验证。
在我的测试中,它使用
${sessionScope.attrName.prop1}
对 session 变量起作用。以及使用 ${param.urlPar1}
的请求参数但由于它使用当前 JSP 的表达式求值器,我想它也应该适用于所有其他“普通”EL 表达式。
关于jsp - 评估请求属性中的 EL 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14297772/