我正在尝试编写自定义标记,而不是编写
<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}
答案 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;
}
...
}