我正在尝试通过瓷砖集成来学习Struts2 f / w,但是在实现时我在putAttributeTag中获得了NPE。
单击登录后,我需要转到主页,但是打开主页时出现异常。
以下是一些相关的代码。
struts.xml
<package name="default" extends="struts-default" namespace="/">
<result-types>
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"></result-type>
</result-types>
<action name="signin" class="actions.SigninAction" method="execute">
<result name="success" type="tiles">home</result>
</action>
</package>
Tiles.xml
<tiles-definitions>
<definition name="baseLayout" template="/baseLayout.jsp">
<put-attribute name="title" value=""></put-attribute>
<put-attribute name="header" value="/header.jsp"></put-attribute>
<put-attribute name="leftmenu" value="/leftmenu.jsp"></put-attribute>
<put-attribute name="footer" value="/footer.jsp"></put-attribute>
<put-attribute name="rightmenu" value="/rightmenu.jsp"></put-attribute>
<put-attribute name="content" value=""></put-attribute>
</definition>
<definition name="home" extends="baseLayout">
<put-attribute name="content" value="/home.jsp"></put-attribute>
<put-attribute name="title" value="Home"></put-attribute>
</definition>
</tiles-definitions>
baselayout(也定义了模板其他部分的其他div,但是我没有在此处包括它们,如果需要它们,我将更新baselayout)
<title><tiles:insertAttribute name="title" ignore="true"></tiles:insertAttribute>
</title>
</head>
<body>
<div id="leftmenu" class=".leftmenu">
<b>Add New</b><br> Update<br> Search<br> Remove
</div>
<div id="content" class=".content">
<tiles:putAttribute name="content"></tiles:putAttribute>
</div>
home.jsp
仅包含简单的一行文本。actions.SigninAction
仅返回success
(输入验证尚未合并,我也已检查此Action返回成功)。日志
信息:
ServletException including path '/baseLayout.jsp'.
ServletException including path '/baseLayout.jsp'.
堆栈跟踪
org.apache.tiles.TilesException: ServletException including path '/baseLayout.jsp'.
org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:614)
org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:246)
org.apache.struts2.views.tiles.TilesResult.doExecute(TilesResult.java:105)
和
org.apache.tiles.util.TilesIOException: ServletException including path '/baseLayout.jsp'.
org.apache.tiles.servlet.context.ServletTilesRequestContext.wrapServletException(ServletTilesRequestContext.java:298)
org.apache.tiles.servlet.context.ServletTilesRequestContext.forward(ServletTilesRequestContext.java:200)
org.apache.tiles.servlet.context.ServletTilesRequestContext.dispatch(ServletTilesRequestContext.java:179)
org.apache.tiles.context.TilesRequestContextWrapper.dispatch(TilesRequestContextWrapper.java:72)
和
java.lang.NullPointerException
org.apache.tiles.jsp.taglib.PutAttributeTag.execute(PutAttributeTag.java:204)
org.apache.tiles.jsp.taglib.RoleSecurityTagSupport.doEndTag(RoleSecurityTagSupport.java:75)
org.apache.jsp.baseLayout_jsp._jspx_meth_tiles_005fputAttribute_005f0(baseLayout_jsp.java:188)
org.apache.jsp.baseLayout_jsp._jspService(baseLayout_jsp.java:129)
如果您能指出我的错误,那就太好了。
最佳答案
NPE的原因是在baseLayout
中,我使用的是putAttribute
标记而不是insertAttribute
。
<div id="content" class=".content">
<tiles:putAttribute name="content"></tiles:putAttribute>
</div>
当应对此
putAttribute
进行评估时,缺少value
参数。因此,导致抛出NPE。固定:
使用
insertAttribute
标记,因为我们将获取值并将其插入baselayout
中。通过this blog之后我更改的其他一些操作还如下:
Jsp的名称以大写字母开头。
在图块定义中,
.tiles
用作其他视图技术中图块定义的标记。另外,在图块定义名称之前合并了斜杠
/
,并相应地调整了struts.xml
。