使用ValueStack在JSP上检索对象的问题

时间:2013-08-09 10:47:00

标签: java jsp struts2 taglib ognl

我使用以下代码在拦截器拦截方法中的Struts2 ValueStack中放置了一个对象:

public String intercept(ActionInvocation invocation)
    ValueStack vS = invocation.getStack();
    vS.set("mainViewComponent", new MainViewComponent());
    ...
}

我尝试使用此代码

在jsp上检索它
<s:property value="#mainViewComponent.contextPath" />

但抛出此异常

Caused by: java.io.IOException: JSPException including path '/_common/layout/fragments/httpHeader.jsp'.
at org.apache.tiles.request.servlet.ServletUtil.wrapServletException(ServletUtil.java:61) [:1.0.1]
at org.apache.tiles.request.jsp.JspRequest.doInclude(JspRequest.java:125) [:1.0.1]
at org.apache.tiles.request.AbstractViewRequest.dispatch(AbstractViewRequest.java:47) [:1.0.1]
at org.apache.tiles.request.render.DispatchRenderer.render(DispatchRenderer.java:45) [:1.0.1]
at org.apache.tiles.request.render.ChainedDelegateRenderer.render(ChainedDelegateRenderer.java:68) [:1.0.1]
at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:259) [:3.0.1]
at org.apache.tiles.TilesContainerWrapper.render(TilesContainerWrapper.java:108) [:3.0.1]
at org.apache.tiles.template.InsertAttributeModel.renderAttribute(InsertAttributeModel.java:188) [:3.0.1]
at org.apache.tiles.template.InsertAttributeModel.execute(InsertAttributeModel.java:132) [:3.0.1]
at org.apache.tiles.jsp.taglib.InsertAttributeTag.doTag(InsertAttributeTag.java:299) [:3.0.1]
at org.apache.jsp._005fcommon.layout.base_jsp._jspx_meth_tiles_005finsertAttribute_005f0(base_jsp.java:161)
at org.apache.jsp._005fcommon.layout.base_jsp._jspService(base_jsp.java:72)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) [:6.1.0.Final]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [:1.0.0.Final]
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) [:6.1.0.Final]
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:326) [:6.1.0.Final]
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:253) [:6.1.0.Final]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [:1.0.0.Final]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:324) [:6.1.0.Final]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:6.1.0.Final]
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:734) [:6.1.0.Final]
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:541) [:6.1.0.Final]
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:479) [:6.1.0.Final]
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:407) [:6.1.0.Final]
at org.apache.tiles.request.servlet.ServletRequest.forward(ServletRequest.java:265) [:1.0.1]
... 88 more
Caused by: source is null for getProperty(null, "contextPath") - Class: ognl.OgnlRuntime
File: OgnlRuntime.java
Method: getProperty
Line: 2310 - ognl/OgnlRuntime.java:2310:-1
at com.opensymphony.xwork2.ognl.OgnlValueStack.handleOgnlException(OgnlValueStack.java:331) [:2.3.14.2]
at com.opensymphony.xwork2.ognl.OgnlValueStack.findValue(OgnlValueStack.java:309) [:2.3.14.2]
at org.apache.struts2.components.Property.start(Property.java:159) [:2.3.14.2]
at org.apache.struts2.views.jsp.ComponentTagSupport.doStartTag(ComponentTagSupport.java:53) [:2.3.14.2]
at org.apache.jsp._005fcommon.layout.fragments.httpHeader_jsp._jspx_meth_s_005fproperty_005f0(httpHeader_jsp.java:118)
at org.apache.jsp._005fcommon.layout.fragments.httpHeader_jsp._jspService(httpHeader_jsp.java:70)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) [:6.1.0.Final]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [:1.0.0.Final]
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) [:6.1.0.Final]
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:326) [:6.1.0.Final]
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:253) [:6.1.0.Final]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [:1.0.0.Final]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:324) [:6.1.0.Final]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:6.1.0.Final]
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:734) [:6.1.0.Final]
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:639) [:6.1.0.Final]
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:576) [:6.1.0.Final]
at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968) [:6.1.0.Final]
at org.apache.jasper.runtime.PageContextImpl.doInclude(PageContextImpl.java:650) [:6.1.0.Final]
at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:644) [:6.1.0.Final]
at org.apache.tiles.request.jsp.JspRequest.doInclude(JspRequest.java:123) [:1.0.1]
... 111 more
Caused by: ognl.OgnlException: source is null for getProperty(null, "contextPath")
at ognl.OgnlRuntime.getProperty(OgnlRuntime.java:2310) [:]
at ognl.ASTProperty.getValueBody(ASTProperty.java:114) [:]
at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) [:]
at ognl.SimpleNode.getValue(SimpleNode.java:258) [:]
at ognl.ASTChain.getValueBody(ASTChain.java:141) [:]
at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) [:]
at ognl.SimpleNode.getValue(SimpleNode.java:258) [:]
at ognl.Ognl.getValue(Ognl.java:494) [:]
at com.opensymphony.xwork2.ognl.OgnlUtil.getValue(OgnlUtil.java:255) [:2.3.14.2]
at com.opensymphony.xwork2.ognl.OgnlValueStack.getValue(OgnlValueStack.java:356) [:2.3.14.2]
at com.opensymphony.xwork2.ognl.OgnlValueStack.tryFindValue(OgnlValueStack.java:345) [:2.3.14.2]
at com.opensymphony.xwork2.ognl.OgnlValueStack.tryFindValueWhenExpressionIsNotNull(OgnlValueStack.java:321) [:2.3.14.2]
at com.opensymphony.xwork2.ognl.OgnlValueStack.findValue(OgnlValueStack.java:307) [:2.3.14.2]
... 130 more

有人能理解问题在哪里吗?

1 个答案:

答案 0 :(得分:0)

在JSP中,您已经包含了标头片段,但用于获取资源的URL并不起作用,因为它包含无法评估的OGNL表达式,因为它引用了null对象。

现在我看到你发布了你是否检索了网址

<s:property value="#mainViewComponent.contextPath" />

错误是#mainViewComponent引用ActionContext属性null,因为你没有把对象放到它上面,但你把它放在valueStack中所以应该得到

<s:property value="mainViewComponent.contextPath" />