急于发布,我不得不将使用自定义标签制作的JSP的一部分与另一部分集成,这显示了一些与scriptlest的信息。
为了使两者协同工作,我将一个对象从标记处理程序doStartTag()
暴露给请求范围,在scriptlet中检索该对象,然后在标记处理程序执行流程的末尾将其删除, doEndTag()
。
有些代码应该澄清我的情况。
这是标签处理程序的相关部分:
public int doStartTag() throws JspException {
// ...
// obj is a private member
pageContext.setAttribute("productFromTag", obj, PageContext.REQUEST_SCOPE);
return EVAL_BODY_INCLUDE;
}
// ...
public int doEndTag() throws JspException {
pageContext.removeAttribute("productFromTag", PageContext.REQUEST_SCOPE);
return EVAL_PAGE;
}
这是JSP中检索和处理对象的部分:
<pre:product><!-- this adds the Product instance to the request scope -->
<div class="item">
<!-- other HTML -->
<p class="productName"><prod:name></prod:name></p>
<%
Product p = (Product) request.getAttribute("productFromTag");
// Use p
%>
<!-- other HTML -->
</div>
</pre:product>
第一次部署后一切正常,但如果我替换JSP(比如编辑后),removeAttribute()
方法会抛出NullPointerException
:
Caused by: java.lang.NullPointerException
at org.apache.jasper.runtime.PageContextImpl.doRemoveAttribute(PageContextImpl.java:398)
at org.apache.jasper.runtime.PageContextImpl.removeAttribute(PageContextImpl.java:387)
at xx.xxxxx.xxxx.ProductTag.release(ProductTag.java:89)
at org.apache.jasper.runtime.TagHandlerPool.release(TagHandlerPool.java:165)
at org.apache.jsp.modelli.camediResponsive.catalogo.schedaProdotto_jsp._jspDestroy(schedaProdotto_jsp.java:200)
at org.apache.jasper.runtime.HttpJspBase.destroy(HttpJspBase.java:60)
at org.apache.jasper.servlet.JspServletWrapper.destroy(JspServletWrapper.java:478)
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:166)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
... 83 more
通过阅读removeAttribute()
javadoc,不应抛出任何异常
我误读了文档吗?难道我做错了什么?
我经常在Eclipse内部编辑或运行生产应用程序时替换(即重新部署)JSP,但我已经面临这种情况。
当然,我已经在方法调用周围添加了catch()
,但我很困惑为什么会这样。