我可以在自定义标签中输出带表达式语言的String吗?

时间:2014-04-21 07:15:07

标签: jsp servlets jstl

我正在尝试编写自定义标记,而不是编写

<div>${message}</div>

我想用

替换它

<my:msg/>

但我不确定如何评估自定义标签内的EL

public class MyTag extends TagSupport { 
...
    @Override
    public int doStartTag() throws JspException {

        try {
            JspWriter out = pageContext.getOut();
            out.println("<div>${message}</div>");
        } catch (IOException ioe) {
            throw new JspException("Error:" + ioe.getMessage());
        }
        return SKIP_BODY;
    }
...
}

这会打印文字字符串$ {message}

1 个答案:

答案 0 :(得分:1)

EL wiki很好地解释了如何通过本文的JavaBeans部分中的PageContext#findAttribute()来计算表达式。该方法的基本思想是在与参数名称匹配的页面,请求,会话或应用程序范围中搜索第一个非null属性。

在您的示例中,容器不会评估标记文件的输出,因为自定义标记由单独的处理程序评估,因为会为客户端生成内容。因此,我们的想法是,一旦完成标记处理程序,就不应该输出需要额外评估的标记。

使用PageContext#findAttribute()

的处理程序
public class MyTag extends TagSupport { 
...
    @Override
    public int doStartTag() throws JspException {

        try {
            JspWriter out = pageContext.getOut();
            out.println(pageContext.findAttribute("message"));
        } catch (IOException ioe) {
            throw new JspException("Error:" + ioe.getMessage());
        }
        return SKIP_BODY;
    }
...
}

或者,如果您知道变量保证存在的范围,则可以更直接地检索变量。

直接检索 - 请求参数

public class MyTag extends TagSupport { 
...
    @Override
    public int doStartTag() throws JspException {

        try {
            JspWriter out = pageContext.getOut();
            out.println(pageContext.getRequest().getParameter("message"));
        } catch (IOException ioe) {
            throw new JspException("Error:" + ioe.getMessage());
        }
        return SKIP_BODY;
    }
...
}