4

我正在尝试使用 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 传递hrefdsp:a. 生成的 HTML 已硬编码${id}display_product.jsp?itemId=${id}. 我正在获取产品列表,但 URL 是我面临问题的地方。如何将值传递给element.idhref属性dsp:a

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

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>
4

3 回答 3

8

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

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

您可以为包含的 JSP 片段传递参数,这些片段使用<dsp:include>

<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>
于 2014-08-27T02:24:37.797 回答
1

@Bated 答案非常彻底,但想添加一些额外信息,说明为什么使用 ATGdsp标签来实现这一点如此重要。


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

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

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

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

于 2016-07-21T17:51:21.850 回答
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>
于 2014-08-26T16:43:47.493 回答