struts 2 tiles NoSuchDefinitionException

时间:2011-01-22 20:23:50

标签: exception struts2 tiles2

使用struts 2 with tiles

时出现此异常

org.apache.tiles.definition.NoSuchDefinitionException:/index.jsp

// tiles.xml

<tiles-definitions>
<definition name="baseLayout" template="/index.jsp">
    <put-attribute name="title" value="/Template" />
    <put-attribute name="header" value="/Header.jsp" />
    <put-attribute name="menu" value="/Menu.jsp" />
    <put-attribute name="body" value="/body.jsp" />
    <put-attribute name="footer" value="/Footer.jsp" />
</definition>
<tiles-definitions>

// index.jsp的

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
<tiles:insertAttribute name="header"/>
<tiles:insertAttribute name="footer"/>   
</body>
</html>

// web.xml中

<listener>
<listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
</listener>
<context-param>
<param-name>org.apache.tiles.impl.BasicTilesContainer.  
DEFINITIONS_CONFIG</param-name>
<param-value>/WEB-INF/tiles.xml</param-value>
</context-param>

// struts.xml中

    <package name="default" namespace="/test" extends="struts-default">
    <result-types>
    <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
    </result-types>

    <action name="login" class="com.medics.action.LoginAction">
        <result name="SUCCESS" type="tiles">/index.jsp</result>
    </action>
    </package> 

我搜索了很多但没有找到任何内容

2 个答案:

答案 0 :(得分:2)

org.apache.tiles.definition.NoSuchDefinitionException: /index.jsp

表示没有tile定义,没有名称“/index.jsp”的定义

当使用struts和tiles时...你的请求进入struts然后到tile中,tile组成了视图,所以你不应该有任何名为“anything.jsp”的tile定义。

所以只需替换

<result name="SUCCESS" type="tiles">/index.jsp</result>

<result name="SUCCESS" type="tiles">baseLayout/result>

现在已经解决了......我会重命名index.jsp,template.jsp(我觉得它不那么混乱),为什么你有一个名为“/ Template”的put属性?

现在要解决这个问题,我建议您将struts2结果目标更改为“baseLayout”,但这可能不是您的意思,因此您可能希望对新页面使用baseLayout定义,因此添加新定义:

<definition name="index" extends="baseLayout">
  <put-attribute name="title" value="My Title for Index" />
  <put-attribute name="body" value="/index.jsp" />
</definition>

现在上面将在defaultTemplate中添加该值并添加(或者如果名称相同,覆盖)创建index.jsp页面的基本模板中的内容,现在你的struts.xml应该有

 <result name="SUCCESS" type="tiles">index</result>

答案 1 :(得分:0)

我今天遇到了这个问题。 虽然这是一个很久以前的问题,但我找到了如下解决方案:

<result name="SUCCESS" type="dispatcher">/index.jsp</result>

只需将tiles替换为dispatcher,我就可以使用。