在 JSP 脚本分隔符中使用 OGNL

Using OGNL inside a JSP scripting delimiters

如何在脚本定界符内使用 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

在 Java 结构中,汽车名称列表和类型列表之间没有关联。它们不相关,因此不清楚如何将它们绑定在一起。

您应该使用 JavaBeans 约定并创建汽车 class,如

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:

@Setter private Car selectedCar;

在脚本定界符中不能使用 OGNL。您应该删除小脚本并将其替换为 <s:property> 标记或使用 ${}.

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

它展示了如何在 HTML 个标签中使用 OGNL

如果您正在使用 select 标签,我建议您阅读