Avatar billede riddlerse Nybegynder
10. juni 2006 - 14:13 Der er 9 kommentarer

JSTL Tags

Jeg har en løkke der iterere igennem en samling objekter. Dette gøres via JSTL tags som følgende:

<c:forEach items="${entities}" var="entity" varStatus="state">

Jeg smider herefter forskellige properties ud også via JSTL tags således:

<c:out value="${entity.title}"/>

Mit problem er nu, at jeg skal bruge en attribut fra 'entity' objektet i et andet tag, og det kan jeg ikke lure hvordan jeg gør.

Jeg har prøvet:

<portlet:actionURL portletMode="view" windowState="maximized">
<portlet:param name="action" value="show_news"/>
<portlet:param name="news_id" value="${entity.id}"/>
</portlet:actionURL>

Men så får news_id bare værdien "${entity.id}".

Jeg har også prøvet at indsætte <%=entity.getId()%> , men det giver bare en compiler fejl fordi entity ikke findes.

Hvad er den korrekte måde at gøre dette på?
Avatar billede carstenknudsen Nybegynder
10. juni 2006 - 16:40 #1
Måske accepterer portlet:param (som jeg ikke kender) ikke dynamiske værdier, du kan i stedet prøve:
<portlet:param name="news_id" value="<c:out value='${entity.id}'/>"/>
Det kræver selvfølgelig at du er indenfor din c:forEach løkke.
PS spørgsmålet hører nok hjemme under JSP.
Avatar billede riddlerse Nybegynder
10. juni 2006 - 18:34 #2
Tak for dit svar. Desværre går den ikke. Du kan ikke lægge tags inden i hinanden. Og så var jeg ikke klar over der var jsp forum også, men det ved jeg nu :)
Avatar billede carstenknudsen Nybegynder
10. juni 2006 - 19:47 #3
Det beklager jeg, det må være fordi jeg så ofte benytter jsp tags i html tags men det er jo en anden historie. Nedenstående eksempel fra nettet tyder på at du kan skrive name="entity" og partname="id" eller noget i den stil, jeg har ikke beskrivelsen af tagget. Du skal selvfølgelig også angive klassen for entity men det kan være class="java.util.Map" eller skal det være class="java.util.Map.Entry"?
      <portlet:param name="addressInfo"
                      caption="address.info"
                      class="java.util.Hashtable"
                      partname="address"
                      boundTo="request-attribute"/>
Avatar billede riddlerse Nybegynder
10. juni 2006 - 20:00 #4
Tak for forsøget igen, men jeg tror du har misforstået problemet. Problemet er ikke portlet tagget, men hvordan jeg får fat i en attribut fra et objekt der er instancieret i et JSTL tag.

Med :

<c:forEach items="${entities}" var="entity" varStatus="state">

Instancieres et object 'entity'. Dette object har en attribut med navnet id, som jeg meget gerne vil have ind i mit portlet tag som en parameter.

Det er somend det hele.
Avatar billede carstenknudsen Nybegynder
10. juni 2006 - 20:59 #5
Det er præcis det jeg forsøgte at besvare. Du vil have værdien af entity.id ind i din tag, det forstår jeg godt, og det ser for mig ud til at ovenstående kode forsøger at gøre; den skal have fat i et objekt med navnet "entity" og fra det skal den hive "id" ud, den ser ud til at blive kaldt "partname", men det er blot spekulation. Måske du kunne sende lidt af koden, det kunne jo være en triviel fejl af en art (dem laver jeg selv mange af).
Avatar billede riddlerse Nybegynder
10. juni 2006 - 21:42 #6
Jeg læste nok ikke din besvarelse helt grundig, beklager. Men jeg forstår den nu stadig ikke.

Her er den fulde kode for jsp'en:

<%@ taglib prefix="portlet" uri="http://java.sun.com/portlet" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

<portlet:defineObjects/>

<br/>

<form method="post" name="sample<portlet:namespace/>" action="<portlet:actionURL/>"/>
<table border="0" cellpadding="1" cellspacing="1" width="100%"
      class="portlet-font" style="font-size: x-small;">

    <tr class="portlet-section-header">
        <th align="center">ID</th>
        <th align="center">Title</th>
        <th align="center">Short Description</th>
    </tr>

    <c:forEach items="${entities}" var="entity" varStatus="state">
        <tr <c:choose>
                <c:when test="${state.count % 2 == 0}">class="portlet-section-body" style="font-weight: normal;"
                    onMouseEnter="this.className = 'portlet-section-body-hover';" onMouseLeave="this.className =
                    'portlet-section-body';"
                </c:when>
                <c:otherwise>class="portlet-section-alternate" style="font-weight: normal;" onMouseEnter="this.className
                    = 'portlet-section-alternate-hover';" onMouseLeave="this.className =
                    'portlet-section-alternate';"
                </c:otherwise>
            </c:choose>
          >

            <td align="left">
            <a href="
                    <portlet:actionURL portletMode="edit">
                        <portlet:param name="action" value="edit_news"/>
                        <portlet:param name="news_id" value="${entity.id}"/>
                    </portlet:actionURL>
                    "><c:out value="${entity.id}"/></a>
            </td>
            <td align="left">
            <a href="
                    <portlet:actionURL portletMode="edit">
                        <portlet:param name="action" value="edit_news"/>
                        <portlet:param name="news_id" value="${entity.id}"/>
                    </portlet:actionURL>
                    "><c:out value="${entity.title}"/></a>
            </td>
            <td align="left">
            <a href="
                    <portlet:actionURL portletMode="edit">
                        <portlet:param name="action" value="edit_news"/>
                        <portlet:param name="news_id" value="${entity.id}"/>
                    </portlet:actionURL>
                    "><c:out value="${entity.shortdescription}"/></a>
            </td>
        </tr>
    </c:forEach>
</table>
</form>

------

I dit eksempel vises at man kan angive name, caption, class, partname og boundTo, men hvordan bruger jeg lige det? Der er jo tale om en iteration over en samling af objecter. Det må da være mulig at få fat i entity objecktet og om end ikke andet, så bruge et scriptlet til at skrive den ud.
Avatar billede riddlerse Nybegynder
10. juni 2006 - 21:43 #7
Når ja, entity er en instans af en af mine egne klasse, ikke en klasse i java.util.Map.
Avatar billede carstenknudsen Nybegynder
11. juni 2006 - 08:22 #8
entity kan vel ikke både være en instans af en af dine egne klasser (som du eksplicit har instantieret) og navnet på en variabel i din c:forEach, så skygger c:forEach variablen for din egen instans. Hvor i dine referencer går det galt/godt?
Avatar billede riddlerse Nybegynder
11. juni 2006 - 10:01 #9
Det er den heller ikke. Den er alene en instans der oprettes af c:forEach løkken. Og jeg ved ikke hvordan jeg får fat i den så jeg kan bruge den i andre tags der ikke understøtter ${var.attribute} notationen, som f.eks. portlet tags.

Entities er en List bestående af flere NewsEntity objekter. Jeg laver opslaget i portletten og binder listen af NewsEntity objekter på requested før jeg dispatcher videre til jsp filen der skal vise indholdet.

try {
    List entities = DBNewsEntityManager.getInstance().findAll();
        request.setAttribute("entities", entities);
        PortletRequestDispatcher dispatcher = getPortletContext().getRequestDispatcher(DEFAULT_INCLUDE);
        dispatcher.include(request, response);
} catch (Throwable e) {
        logger.error("[error]", e);
        throw new PortletException(e);
}

Problemet er altså kort sagt, at jeg ikke ved hvordan man med JSTL bruger et object instancieret i en c:forEach i et andet tag. Der er prøvet JSTL syntax i tagget (value="${entity.id}"), indlejret c:out tag og simpel scriptlet (value="<%=entity.id%">. Ingen af disse virker. JSTL syntax understøttes ikke og strengen får teksten "${entity.id}" som værdi, indlejret tags er slet ikke tilladte og en scriptlet virker ikke, fordi compileren ikke kender entity variablen.

Gav det lidt mere lys over problemet?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester