2011-06-01 7 views
0

ネストされたel変数を作成しますが、$ {foo}はmytagの最後の後に使用できます。 .TLDファイルのバージョンを短縮ネストされたEL変数

は次のとおりです。

<?xml version="1.0" encoding="UTF-8" ?> 

<taglib version="2.0" xmlns="http://java.sun.com/xml/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> 
    <description>My Tags</description> 
    <tlib-version>1.0</tlib-version> 
    <jsp-version>2.0</jsp-version> 
    <short-name>mytaglib</short-name> 
    <uri>http://www.example.com/taglibs/mytaglib</uri> 

    <tag> 
    <name>mytag</name> 
    <tag-class>com.example.tags.MyTag</tag-class> 
    <body-content>JSP</body-content> 

    <variable> 
     <name-given>used</name-given> 
     <variable-class>java.lang.String</variable-class> 
     <scope>NESTED</scope> 
    </variable> 
    </tag> 
</taglib> 

その後、mytagというは、(私は関連するべきではありませんすべてのコードを削除しました)以下のん:

public class MyTag extends BodyTagSupport 
{ 
    // these are subtags 
    private JspFragment below; 
    private JspFragment at; 

    @Override 
    public int doStartTag() throws JspException 
    { 
    return EVAL_BODY_BUFFERED; 
    } 

    @Override 
    public int doEndTag() throws JspException 
    { 
    try 
    { 
     if (aBoolean) 
     { 
      below.invoke(pageContext.getOut()); 
     } 
     else 
     { 
      at.invoke(pageContext.getOut()); 
     } 
    } 
    catch (IOException e) 
    { 
     throw new JspException(e); 
    } 

    return EVAL_PAGE; 
    } 

    @Override 
    public void doInitBody() throws JspException 
    { 
    pageContext.setAttribute("used", "valueOfUsed"); 
    } 

    @Override 
    public int doAfterBody() throws JspException 
    { 
    try 
    { 
     bodyContent.writeOut(bodyContent.getEnclosingWriter()); 
    } 
    catch (IOException e) 
    { 
     throw new JspException(e); 
    } 

    return SKIP_BODY; 
    } 
} 

私の理解では、 doInitBody内のpageContext.setAttribute()はネストされたスコープ内にあり、doAfterBody内の実際のボディを評価する必要があります。 タグの範囲外で「使用済み」が利用可能であるにもかかわらず、そのように思われるはずです。

一般的な背景...タグは(簡略化した形)のようになります

<mytaglib:mytag> 
    Used is ${used} 
</mytaglib:mytag> 

または

<mytaglib:mytag> 
    <mytaglib:at> 
    You are at your limit, you have used: ${used} 
    </mytaglib:at> 
    <mytaglib:below> 
    You are below your limit, you have used: ${used} 
    </mytaglib:below> 
</mytaglib:mytag> 

どのように私はmytagというためにスコープされる{使用} $を得ることができますか?

+0

あなたの質問は混乱しています。 '$ {foo}'はス​​クリプト変数ではありません。それは '<%String foo =" something "です。 %> 'これらの '$ {} 'はEL(Expression Language)と呼ばれます。また、http://stackoverflow.com/tags/el/info – BalusC

+0

http://java.sun.com/products/jsp/syntax/2.0/syntaxref2013も参照してください。 .htmlもELのものを 'スクリプト変数'と呼んでいるようです。もっと明確になるように質問を更新しています。 EL変数のスコープをNESTEDにする方法はありますか? –

答えて

1

私が書き込むタグのモデルとして、常にJSTLを参照しています。だから私のアプローチは、似たようなことをするタグのソースコードを見て、それをコピーすることです。 < c:forEach>タグは最適な例です。手動

JSTLでLoopTagSupportクラスはjavax.servlet.jsp.tagext.TryCatchFinallyインタフェースを実装し、doFinally方法ではpageContext.removeAttributeを(呼び出し)。

JSTL1.1ソースディストリビューションを引用:

+0

興味深い...これは私が見つけたネストされた変数スコープのいずれにもマッチしませんが、これは基本的に回避策として行ったものです。これが存在すると、変数のネストされたスコープを持つ別のJSTLライブラリに問題がありますか? –

+0

これは有効な補足物ではありません。私は属性を削除すると同じ名前の以前に定義された属性も削除されることがわかりました。ドキュメントによれば、ネストされた変数は、タグのスコープ内で定義され、削除されなければならず、同期名[ここ](http://docs.oracle.com/cd/E19879) -01/819-3669/bnamj/index.html)。私はその事例を得ることができませんでした。 –

関連する問題