NumberFormatException при попытке объединить строку в EL - PullRequest
3 голосов
/ 13 мая 2011

Вот что я пытаюсь сгенерировать:

<div class="marker" style="background:transparent url('/myApp/faces/javax.faces.resource/1.png?ln=images/map') no-repeat center top;"></div>
<div class="marker" style="background:transparent url('/myApp/faces/javax.faces.resource/2.png?ln=images/map') no-repeat center top;"></div>
<div class="marker" style="background:transparent url('/myApp/faces/javax.faces.resource/3.png?ln=images/map') no-repeat center top;"></div>

etc...

Вот мой код:

<ui:repeat value="#{myBean.items}" var="item" varStatus="status">
    <h:panelGroup layout="block" styleClass="marker" style="background:transparent url(#{resource['images/map:'+(status.index+1)+'.png']} no-repeat center top;"/>
</ui:repeat>

Это ошибка с NumberFormatException, потому что интерпретатор EL пытается преобразовать "images / map" в число. После долгого поиска я обнаружил, что + предназначен только для добавления чисел. Есть идеи, как добиться желаемых результатов?

Ответы [ 2 ]

14 голосов
/ 13 мая 2011

EL не распознает оператор + как оператор конкатенации строк. Оператор + находится в EL в конечном итоге только для суммирования чисел. Вам нужно использовать <ui:param> для создания другой переменной выражения, в которой вы объединяете части, просто вставляя выражение EL в значение, а затем используете его в конечном выражении.

<ui:repeat value="#{myBean.items}" var="item" varStatus="status">
    <ui:param name="key" value="images/map#{status.index + 1}.png" />
    <h:panelGroup layout="block" styleClass="marker" style="background:transparent url(#{resource[key]} no-repeat center top;"/>
</ui:repeat>

Примечание: если бы вы использовали JSP вместо Facelets, вы бы использовали JSTL <c:set> вместо Facelets <ui:param>.

2 голосов
/ 03 февраля 2015

Вы можете использовать функцию concat для объединения строк в JSP EL. В вашем примере это будет:

<ui:repeat value="#{myBean.items}" var="item" varStatus="status">
    <h:panelGroup layout="block" styleClass="marker" style="background:transparent url(#{resource['images/map:'.concat( (status.index+1).concat('.png')]} no-repeat center top;"/>
</ui:repeat>
...