سؤال

أنا أستخدم Tiles 2.0.6 كإطار عمل القالب الخاص بي مع الدعامات 2.1.6. أنا أكتب صفحة CMS بسيطة وأريد السماح للمستخدم بتحديد عنوان كل صفحة HTML.

لدي تعريف عنوان مثل هذا

    <definition name="base" template="/WEB-INF/jsp/templates/base.jsp">
        <put-attribute name="title" value=" "/>
        <put-attribute name="header" value="/WEB-INF/jsp/templates/header.jsp"/>  
        <put-attribute name="content" value="dummy"/>
        <put-attribute name="footer" value="/WEB-INF/jsp/templates/footer.jsp"/>   
        <put-attribute name="search" value="/WEB-INF/jsp/search.jsp"/>
    </definition>    
    <definition name="staticview" extends="base">
        <put-attribute name="title" value=" - Static"/>
        <put-attribute name="content" value="/WEB-INF/jsp/static/view.jsp"/>
    </definition>  

بدلاً من جعل العنوان JSP ، هل هناك طريقة لتجاوز العنوان (السلسلة) ديناميكيًا على header.jsp في سمة JSP اللاحقة ، على سبيل المثال View.jsp. أو حتى خطوة واحدة أخرى باستخدام EL

<put-attribute name="title" value="%{title}"/>

واجعلها تلتقط العنوان على الدعامات ognl ديناميكيا.

يرجى تقديم النصيحة

شكرا لك مقدما

هل كانت مفيدة؟

المحلول

في صفحة العرض ، نحتاج إلى الحصول على هذا -

<title><tiles:getAsString name="title" /></title>

أعلاه سوف تحصل على عنوان الصفحة. باستثناء ، نظرًا لأننا نريد أن يكون عنوان الصفحة ديناميكيًا ، في تكوين tiles.xml ، أضفت

<definition name="page1" extends="base">
    <put-attribute name="title" value="Page 1"/>
    <put-attribute name="content" value="/WEB-INF/jsp/page1.jsp"/>
</definition>
<definition name="page2" extends="base">
    <put-attribute name="title" value="Page 2"/>
    <put-attribute name="content" value="/WEB-INF/jsp/page2.jsp"/>
</definition>

الآن قد يبدو هذا وكأنه كتابة سيجعله يبدو أنه ثابت. ولكن في كل مرة تقوم فيها بعرض تلك الصفحة ، يجب أن يكون العنوان هو نفسه لتلك الصفحة. ما هو أفضل مكان للحصول على هذه المعلومات التي على tiles.xml.

بالنسبة لي لم يكن العنوان نفسه ، لكنني كنت بحاجة إلى عناوين صفحات مختلفة. لم أكن أرغب في النظر إلى سمة السياق للحصول على مسار الصفحة وتحديد العنوان للصفحة. لذلك ، هذا نجح بالنسبة لي وأبقي كل شيء مقترن بشكل فضفاض.

هذا يعمل إذا كنت تريد عنوان ديناميكي مختلف لكل صفحة أو أي شيء مشابه.

نصائح أخرى

حافظ على تعريف البلاط مثل هذا:

    <put-attribute name="title" value=""/>

يضيف العنوان كخاصية في فصل العمل الخاص بك.

وفي عرض صفحة jsp استخدم هذا:

    <tiles:insertDefinition name="staticview">
        <tiles:putAttribute name="title"> 
            ${title} <%--OR, <s:property value="title"/>--%>
        </tiles:putAttribute>
        <%--Remainning content--%>
    </tiles:insertDefinition>

حاولت هذا ويعمل.

CODE1

<tiles:putAttribute name="title"> 
          You String
</tiles:putAttribute>

الرمز 2

<tiles:insertAttribute name="title" />

ولكن يجب تنفيذ CODE1 قبل CODE2.

أفضل حل في رأيي هو الاستخدام expression بدلاً من value في تعريف البلاط وتمرير $ {title}. ولكن يجب عليك القيام بذلك في كل وجهة نظر صريحة ، لسوء الحظ. انظر أكثر في http://symfony-world.blogspot.com/2013/02/dynamic-attribute-values-with-apache.html

وجدت هذا الحل البسيط في مكان آخر:

تعريف سمة البلاط كالمعتاد:

 <put-attribute name="title"  value="welcome.title"/>

على صفحة JSP ، يتم استيراد السمة أولاً ثم يمكن استخدامها مع علامات الدعامات:

<tiles:importAttribute name="title" />
<title><s:text name="%{#attr['title']}"/></title> 

أقوم بإضافة العنوان إلى الطلب في فئة الإجراء ، إليك رمز JSP الخاص بي للقالب (البلاط 1):

<title>
    <tiles:getAsString name="title"/>
    <%-- add additional title (if found) --%>
    <logic:present scope="request" name="title"><bean:write scope="request" name="title"/></logic:present>
</title>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top