4

HTML マークアップを XML ドキュメント内に保存し、JiBX を使用して非整列化します。Spring も使用しており、これらのオブジェクトの 1 つがモデルに追加されると、EL を介して JSP でアクセスできます。

${model.bookshelf.columnList[0].linkList[0].htmlMarkup}

画期的なことは何もありません。しかし、EL 式を HTML マークアップに格納したい場合はどうすればよいでしょうか? たとえば、次のリンクを保存するにはどうすればよいでしょうか。

<a href="/${localePath}/important">Locale-specific link</a>

... LocalePath がリクエスト属性である JSP に表示します。

またはさらに興味深いことに、以下を保存したい場合はどうなるでしょうか?

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」タグのようなものですか?トークンの置換は最初の例では機能しますが、2 番目の例では機能せず、あまり堅牢ではありません。

4

2 に答える 2

2

私が正しく理解していれば、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 式でも動作するはずです。

于 2013-01-12T22:30:03.007 に答える
0

プログラムで el 式を自分で解析する必要はありません。<rtexprvalue>true</rtexprvalue>たとえば、taglib にを含めることで、タグに評価の結果を提供する必要があります。

   <tag>   
      <name>mytag</name>

      <attribute>
        <name>myattribute</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
       </attribute>
   </tag>
于 2015-07-29T19:13:37.897 に答える