【问题标题】:How to check existence of tiles attribute before inserting it into the page如何在将tiles属性插入页面之前检查它是否存在
【发布时间】:2012-11-13 05:50:41
【问题描述】:

我在 struts2 应用程序中使用磁贴。在定义基本布局时,我定义了一个属性“scriptFile”。

<definition name="baseLayout" template="/application/base-layout.jsp" >
    ... 
</definition>

<definition name="custom.tiles" extends="baseLayout">
    <put-attribute name="scriptFile" value="js/custom-script.js"></put-attribute>
</definition>

如果开发者在tiles定义文件“tiles.xml”中提供了“scriptFile”,这个脚本文件应该包含在下面的行中

<script language="javascript" src="<tiles:insertAttribute name="scriptFile"></tiles:insertAttribute>"></script>

但是如果没有定义scriptFile属性,则必须跳过这一行。

如何检查图块中是否存在“scriptFile”属性。有没有更好的方法来做这件事?

【问题讨论】:

  • 您使用的是什么版本的磁贴? scriptFile 属性从何而来?它在运行时是动态的吗?如果这只是平铺定义,您应该创建几个“头”模板,并包含适当的头,如果您使用需要您提供 scriptFile 的头,那么您将需要提供一个脚本文件。如果一个 struts2 动作需要一个 id 来完成它的工作,那么你不能很好地不发送一个 id 并期望它能够工作(对于瓷砖也是如此)。如果这是动态内容,还有其他可能性。
  • 版本 = 瓷砖 2.0.6。属性来自tiles.xml,它不是动态的。布局由页面标题、菜单、内容和页脚组成。每页只更改内容。如果内容需要任何 javascript,开发人员将提供该 JS 文件并在tiles.xml 中定义它。然后,此 javascript 文件将包含在页眉中。

标签: jakarta-ee struts2 tiles apache-tiles


【解决方案1】:

我试过了

<t:useAttribute name="scriptFile" id="script" classname="java.util.List" ignore="true"/>
<%
    if(script != null) {
        ... include script
    } 
%>

这里也可以使用JSTL。

【解决方案2】:

我能够通过使用 defaultValue 属性来解决类似的问题。这样,如果属性不存在,您将不会收到异常。在这种情况下,如果页面不需要包含额外的 JavaScript,那么图块模板只会添加一个空字符串

JSP

<tiles:insertDefinition name="portalTemplate">

    <tiles:putAttribute name="body">
        <h1>Body</h1>
    </tiles:putAttribute>  

    <tiles:putAttribute name="js">
        <script src="script.js"></script>
    </tiles:putAttribute>   
</tiles:insertDefinition>

平铺模板 JSP

<html>
<body>
   <tiles:insertAttribute name="body"/>
   <script src="/public/libs/jquery/jquery-2.1.1.min.js"></script>

   <!-- Include extra JS after JQuery -->
   <tiles:insertAttribute name="js" defaultValue=""/>
</body>
</html>

【讨论】:

    【解决方案3】:

    只需使用ignore 属性

    <script language="javascript" src="<tiles:insertAttribute name='scriptFile'  ignore='true'/>"></script>
    

    并且不要将scriptFile 放在您的定义中。

    更新

    那么在布局中使用getAsString标签怎么样

    <tiles:getAsString name="jscript" ignore="true" />
    

    并在定义中放置整个转义的脚本标签。

    <put-attribute name="jscript" value="&lt;script src='js/custom-script.js' type='text/javascript'>&lt;/script>" />
    

    【讨论】:

    • ignore 属性只是跳过放置属性值(如果它不存在)。在这种情况下,它周围的
    • 它可能有效,但我认为每次都提供完整的标签作为字符串而不是只定义文件名并不是一个好主意。如果给定文件名,则模板应放置周围的脚本标签,以减少工作量和出错的机会。
    【解决方案4】:

    我使用以下代码来解决该问题(仅根据我从标签描述中获得的信息: ignore - 如果此属性设置为 true,并且由 name 不存在,直接返回而不写任何东西。这 默认值为 false,这将导致运行时异常 抛出。 ):

    <tiles:importAttribute name="stylesheets" ignore="${true}"/>
    

    附:小心,使用 ${true} 而不是只使用“true”值。

    【讨论】:

      猜你喜欢
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多