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

时间:2014-08-26 15:49:16

标签: java jsp atg oracle-commerce atg-droplet

我尝试使用ProductLookup Droplet在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传递给href的{​​{1}}标记时,我遇到了问题。生成的HTML已将dsp:a硬编码为${id}。我收到了产品清单,但网址是我遇到问题的地方。如何将display_product.jsp?itemId=${id}中的值传递到element.id的{​​{1}}属性中?

我也尝试了以下方法,但没有成功。

1

href

2

dsp:a

3

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

3 个答案:

答案 0 :(得分:8)

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

这是旧式的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>

答案 1 :(得分:1)

@Bated答案非常详尽,但是想要添加一些额外的信息,说明为什么使用ATG dsp标签实现这一目标非常重要。

ATG以两种方式维护您的会话:

  1. 通过存储在cookie中的jsessionid
  2. 通过查询字符串中存储的jsessionid
  3. 通过使用<dsp>标记,您可以确保维护用户会话,因为用户很可能已禁用Cookie,dsp标记将恢复为使用查询字符串。

    出于这个原因,使用html锚标记是不安全的,因为只有在启用了cookie的情况下才会维护用户会话。

答案 2 :(得分:0)

请尝试以下代码段。您需要使用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>