如何在 Oracle Commerce(ATG) 中使用 <dsp:a> 生成动态 URL



我正在尝试使用ProductLookup滴在jsp中显示产品列表,如下所示。我还试图提供一个超链接,以导航到单个产品的产品详细信息页面。

<dsp:droplet name="/atg/commerce/catalog/ProductLookup">
    <dsp:param param="element.id" name="id"/>
    <dsp:oparam name="output"><br/>
    <dsp:a href="display_product.jsp?itemId=${id}">  
    Product display Name: 
    <b><dsp:valueof param="element.displayName"/></b><br/>
    Product description Name:
    <dsp:valueof param="element.description"/>
    </dsp:a>
    </dsp:oparam>
</dsp:droplet>

但是,我在将产品的id传递给dsp:ahref标签时遇到了问题。所得的HTML将${id}硬编码为display_product.jsp?itemId=${id}。我得到的产品列表,但URL是我面临的问题。如何将element.id中的值传递到dsp:ahref属性中?

我也试过下面的方法,但是没有成功。

1。

<dsp:a href="display_product.jsp?itemId=<%=out.print(element.id) %>">

2。

<dsp:a href="display_product.jsp?itemId=<%=out.print(id) %>">

3。

<dsp:getvalueof var="id" id="id" >
            <dsp:a href="display_product.jsp?itemId=${id}">
            Product display Name: 
            <b><dsp:valueof param="element.displayName"/></b><br/>
            Product description Name:
            <dsp:valueof param="element.description"/>
            </dsp:a>
            </dsp:getvalueof>

要将参数传递到另一个页面,只需按照下面的代码片段(嵌套在ProductLookup滴中)使用<dsp:param>标记:

这是老派的ATG方法:

 <dsp:a href="display_product.jsp">
     Product Name: <b><dsp:valueof param="element.displayName"/></b><br/>
     Product description: <dsp:valueof param="element.description"/>
     <%-- this will pass the itemId parameter and value--%>
     <dsp:param name="itemId" param="element.id"/>
 </dsp:a>

首选的方法是使用jstl EL变量,这样可以使jsp更清晰、更易于阅读,并且在引用值时具有更大的灵活性:

<%-- name the "element" and convert to a map  --%>
<dsp:tomap var="product" param="element" recursive="false"/>
<dsp:a href="display_product.jsp">
     Product Name: <b>${ product.displayName }</b><br/>
     Product description: ${ product.description }
     <dsp:param name="itemId" value="${ product.id }"/>
</dsp:a>

我在上面的例子中使用了recursive="false",因为您只引用产品的直接属性。如果你想引用属性的属性,那么你可以这样做(下面的代码没有经过测试,但应该给你一个大致的想法):

<dsp:tomap var="product" param="element" recursive="true"/>
<dsp:img page="${ product.image.url }">

更新:

当我继续惊讶于很少有人理解如何做甚至是最基本的事情,如传递参数时,我已经包含了其他可以与<dsp:param>一起使用的DSP标签

您可以为使用<dsp:include>

的包含JSP片段传递参数。
<dsp:tomap var="product" param="element" recursive="false"/>
<dsp:include page="fragments/myfragment.jsp">
    <dsp:param name="itemId" value="${ product.id } />
</dsp:include>

这个方法也适用于这些标签:

  • <dsp:iframe>
  • <dsp:img>
  • <dsp:link>

@Bated的回答是相当彻底的,但我想添加一些额外的信息,说明为什么使用ATG dsp标签来实现这一点是如此重要。


ATG以两种方式维护会话:

  1. 通过cookie中存储的jsessionid
  2. 通过查询字符串
  3. 中存储的jsessionid

通过使用<dsp>标签,您可以确保维护用户会话,因为很有可能用户已禁用cookie,并且dsp标签将恢复使用查询字符串。

使用html锚标记是不安全的,因为用户会话只有在启用cookie时才会被维护。

请尝试下面的代码片段。您需要使用dsp:getvalueof,如下所示。

<dsp:droplet name="/atg/commerce/catalog/ProductLookup">
    <dsp:param param="element.id" name="id"/>
    <dsp:oparam name="output"><br/>
       <dsp:getvalueof id="id" param="element.id" idtype="java.lang.String">
           <dsp:a href="display_product.jsp?itemId=<%=id%>">
               Product Name: <b><dsp:valueof param="element.displayName"/></b><br/>
               Product description: <dsp:valueof param="element.description"/>
           </dsp:a>
       </dsp:getvalueof>
    </dsp:oparam>
</dsp:droplet>

相关内容

  • 没有找到相关文章

最新更新