我们将 HTML标记存储在 XML文档中,并使用JiBX解组.我们也使用 Spring,当其中一个对象被添加到模型中时,我们可以通过EL在JSP中访问它. ${model.bookshelf.columnList[0].linkList[0].htmlMarkup} 没有什么是
${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”标签的东西?令牌替换在第一个示例中起作用,但在第二个示例中不起作用,并且不是很强大.
如果我理解正确:您正在寻找一种方法来在运行时评估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; } }
相关TLD:
<?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}来处理会话变量,也使用${param.urlPar1}来处理请求参数,但因为它使用当前JSP的表达式求值程序,我认为它应该适用于所有其他“正常”EL表达式也是.