我正在尝试使用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:a
的href
标签时遇到了问题。所得的HTML将${id}
硬编码为display_product.jsp?itemId=${id}
。我得到的产品列表,但URL是我面临的问题。如何将element.id
中的值传递到dsp:a
的href
属性中?
我也试过下面的方法,但是没有成功。
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>
<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以两种方式维护会话:
- 通过cookie中存储的jsessionid
- 通过查询字符串 中存储的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>