在JSP脚本分隔符中使用OGNL

时间:2017-03-13 15:33:42

标签: jsp struts2 iterator ognl

如何在脚本分隔符中使用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

2 个答案:

答案 0 :(得分:1)

在Java结构中,您的车名列表与类型列表之间没有相关性。它们是无关的,因此不清楚如何将它们绑在一起。

您应该使用JavaBeans约定并创建一个Car类,如

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;

答案 1 :(得分:1)

在脚本分隔符中,您无法使用OGNL。您应删除scriptlet并将其替换为<s:property>标记,或使用${}

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

它显示了如何在HTML标记中使用OGNL

如果您使用的是select标记,建议您阅读Struts2 select tag - Dynamically add options