Как динамически установить конечный атрибут с помощью итератора Struts2 в JSP

<% 
    RegisterAction aro=new RegisterAction();    
    int count=aro.getLi().size();
%>

<s:iterator value="li" begin="0" end="1">
    <fieldset>
        name     : <s:property value="name"     /><br/>
        password : <s:property value="password" /><br/>
        email    : <s:property value="email"    /><br/>
        gender   : <s:property value="gender"   /><br/>
        country  : <s:property value="country"  /><br/>
    </fieldset>
</s:iterator>

Как динамически установить значение атрибута end для итерации, читая переменную count?

Если я использую end="<%=count%>", это не работает.

Если я использую end="count", он работает, но я получаю тот же результат, кратный числам, если я обновляю страницу или перезагружаю.


person santosh    schedule 27.07.2015    source источник
comment
Под динамически вы подразумеваете от какой-то переменной? Или из javascript?   -  person Aleksandr M    schedule 27.07.2015
comment
Вы забыли одну строку кода (ваш ‹h4›)   -  person Hearner    schedule 27.07.2015
comment
ya из некоторой переменной, которую я инициализировал в jsp перед итератором.   -  person santosh    schedule 27.07.2015
comment
RegisterAction aro=new RegisterAction(); int count=aro.getLi().size(); мне придется использовать переменную count в конечном атрибуте.   -  person santosh    schedule 27.07.2015
comment
Просто используйте свою переменную в атрибуте end.   -  person Aleksandr M    schedule 27.07.2015
comment
да, я использовал там в ‹%=count%›, но это не работает. есть ли что-нибудь, что можно использовать, кроме этого...?   -  person santosh    schedule 27.07.2015
comment
без тега выражения, если я использую эту переменную счетчика в атрибуте конца в итераторе, то есть продолжаю показывать тот же результат, сколько раз мы обновляем это количество строк.   -  person santosh    schedule 27.07.2015


Ответы (2)


Вы можете использовать нотацию #attr в OGNL для чтения переменных, установленных в блоках Scritplet, если вы помещаете их в pageContext:

<% 
    RegisterAction aro = new RegisterAction();
    int count = aro.getLi().size();
    pageContext.setAttribute("count", count); // pushing the variable into the pageContext
%>

<s:iterator value="li" begin="0" end="%{#attr['count']}">
    <fieldset>
        name     : <s:property value="name"     /><br/>
        password : <s:property value="password" /><br/>
        email    : <s:property value="email"    /><br/>
        gender   : <s:property value="gender"   /><br/>
        country  : <s:property value="country"  /><br/>
    </fieldset>
</s:iterator>

Но вы никогда не должны использовать Scriptlet по многим причинам.

Также очень легко использовать теги Struts вместо скриптлетов для ваших целей, как показано в этом ответе.


ИЗМЕНИТЬ:

Если я использую end="count", он работает, но я получаю тот же результат, кратный числам, если я обновляю страницу или перезагружаю.

Однако неясно, почему вы создаете экземпляр Action в блоке Scriptlet и почему вы ожидаете, что результат подсчета будет отличаться при загрузке страницы, поскольку ваш код всегда ссылается на коллекцию в ее начальном состоянии.

Если RegisterAction является вашим текущим действием, то, вероятно, вам нужно следующее:

<s:iterator value="li" begin="0" end="%{li.size()}">

это на самом деле

<s:iterator value="li">

и вы усложняете простую итерацию в 2337 раз.

person Andrea Ligios    schedule 27.07.2015
comment
я тоже пробовал это, но так же, как раньше, он продолжал загружать несколько номеров одной и той же записи после обновления и повторной загрузки, как только работает. - person santosh; 27.07.2015
comment
может быть, ваш ответ правильный, я уже проверил два ответа выше, но я ожидал какого-то точного ответа по этому вопросу. может быть, как вы сказали, коллекция продолжает итерацию от начального состояния. - person santosh; 27.07.2015
comment
@santosh, ты ждешь точного ответа на совершенно непонятный вопрос? Чего вы хотите достичь точно? Потому что (теперь) кажется, что вам просто нужно перебрать коллекцию. И если это так, то весь вопрос скриптлета неуместен и вводит в заблуждение, даже если на него хорошо дан ответ. Просто используйте тег итератора, без начала и конца. - person Andrea Ligios; 27.07.2015
comment
@ Андреа Лигиос, да, я пробовал, как ты сказал, на самом деле я читаю данные из БД и устанавливаю список и печатаю, сколько записей там в БД, столько записей только для отображения в JSP, даже после обновления, но здесь та же запись продолжается отображение нескольких раз, когда мы обновляем страницу, и если мы используем целочисленное значение в конечном атрибуте, который будет работать правильно, то какой в ​​этом смысл...? так что я думаю. - person santosh; 27.07.2015

привет, наконец, я получил ответы о том, как я хочу, чтобы вы могли использовать этот код ниже в классе действий для инициализации массива из числа БД

int l1=st.executeUpdate("select count(*) from strutsuser");
         li=new ArrayList<RegisterAction>(l1);

просмотр JSP

<s:iterator value="li" >

<fieldset >
name : <s:property value="name"/><br/>
password : <s:property value="password"/><br/>
email : <s:property value="email"/><br/>
gender : <s:property value="gender"/><br/>
country : <s:property value="country"/><br/>

</fieldset>

</s:iterator>

это решит количество множественных отображений одной и той же записи, даже если мы обновим страницу с помощью итератора Struts.

person santosh    schedule 28.07.2015