Как создать динамический URL с помощью <dsp: a> в Oracle Commerce(ATG)

Я пытаюсь отобразить список продуктов в JSP с помощью капли ProductLookup, как показано ниже. Я также пытаюсь дать гиперссылку для перехода на страницу сведений о продукте отдельного продукта.

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

Однако при передаче идентификатора продукта я сталкиваюсь с проблемой href тег dsp:a, Результирующий HTML имеет жесткий код ${id} как display_product.jsp?itemId=${id}, Я получаю список продуктов, но URL-адрес, где я сталкиваюсь с проблемой. Как передать значение в element.id в href атрибут 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>

3 ответа

Решение

Для передачи параметров на другую страницу вы просто используете <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, которые можно использовать вместе с <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>

Ответ @Bated довольно подробный, но я хочу добавить дополнительную информацию о том, почему так важно использовать ATG. dsp теги для достижения этого.


ATG поддерживает вашу сессию двумя способами:

  1. Через jsessionid хранится в печенье
  2. Через jsessionid, хранящийся в строке запроса

Используя <dsp> теги, которые вы гарантируете, что вы поддерживаете сеанс пользователей, так как вполне возможно, что пользователь отключил куки и 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>
Другие вопросы по тегам