2017-03-13 35 views
1

如何在腳本分隔符中使用OGNL?在JSP腳本分隔符中使用OGNL

<s:iterator var="arr" value="%{carNames}" status="incr">   
    <option value="<%=car.getType()["#incr.index"]%>" > 
     <s:property value="arr"/> 
    </option>   
</s:iterator> 

這是我Car結構:

private String[] carNames = {"A", "B", "C"}; 

public static Integer[] getType() { 
    return new Integer[]{ 
     new Integer(Global.DISEL), 
     new Integer(Global.TESLA), 
     new Integer(Global.HYBRID) 
    }; 
} 

//getter and setter 
+1

發佈您的Java結構(carNames) –

回答

1

在腳本分隔符不能使用OGNL。您應該刪除腳本,用<s:property>標記代替它或使用${}

<option value="<s:property value='%{car.type[#incr.index]}'/>"> 

它顯示瞭如何在HTML標記中使用OGNL

如果您使用的是選擇標籤,我建議您閱讀Struts2 select tag - Dynamically add options

1

在你有車名的列表和類型列表之間沒有相關性和Java結構。它們不相關,因此不清楚如何將它們綁定在一起。

您應該使用JavaBeans的約定,並創建一個汽車類,像

public class Car implements Serializable { 
    @Getter @Setter private Long id; 
    @Getter @Setter private String name; 
    @Getter @Setter private Integer type; // but an Enum would be better 
} 

,然後聲明數組

@Getter private Car[] cars; 

或動作列表

@Getter private List<Car> cars; 

,並那麼代碼將是:

<select name="selectedCar"> 
<s:iterator value="cars" status="incr">   
    <option value="<s:property value='cars[%{#incr.index%}].id'/>" > 
     <s:property value="cars[%{#incr.index%}].type"/> - 
     <s:property value="cars[%{#incr.index%}].name"/> 
    </option>   
</s:iterator> 
</select> 

這相當於

<select name="selectedCar"> 
<s:iterator var="currentCar" value="cars" >   
    <option value="<s:property value='#currentCar.id'/>" > 
     <s:property value='#currentCar.type'/> - 
     <s:property value="#currentCar.name"/> 
    </option>   
</s:iterator> 
</select> 

這相當於

<select name="selectedCar"> 
<s:iterator value="cars" >   
    <option value="<s:property value='id'/>" > 
     <s:property value="type"/> - 
     <s:property value="name"/> 
    </option>   
</s:iterator> 
</select> 

這相當於

<select name="selectedCar"> 
<s:iterator value="cars" >   
    <option value="<s:property value='id'/>" > 
     <s:property value="%{type + ' - ' + name}"/> 
    </option>   
</s:iterator> 
</select> 

但它會更簡單使用<s:select />的Struts標記:

<s:select name="selectedCar" 
      list="cars" 
     listKey="id" 
    listValue="%{type + ' - ' + name}" /> 

並且根本沒有迭代器。

讀取所選的車,你只需要簡單地把汽車和二傳手目標行動:

@Setter private Car selectedCar;