Struts2 中的关键属性 OGNL 问题

key attribute OGNL issue in Struts2

我已经与 Struts2 合作了很长时间。

当我使用 <s:textfield label="Product Id" key="%{productId}"/><s:textfield label="Product Id" key="[0].productId"/> 时,它不起作用。 即,如果我使用第一个带有指向 OGNL 表达式 %{productId} 的键属性的标签,那么结果 html input tag's name 属性将作为 empty.i.e。 <input type="text" name="" value="" id="Product_Save_"/>。如果我使用 <s:textfield label="Product Id" key="[0].productId"/> 标签,那么结果 html input tag<input type="text" name="[0].productId" value="" id="Product_Save__0__productId"/>.

在这两种情况下,Struts 无法将我的请求参数填充到我的模型对象中,即产品 class,如下所示:

public class Product{

private String productId;
private String productName;
private int price;
private ProductOwner productOwner;

public Product() {}

public Product(String productId, String productName, int price) {
    this.productId = productId;
    this.productName = productName;
    this.price = price;
}

public void setProductOwner(ProductOwner productOwner) {

    this.productOwner = productOwner;
}

public ProductOwner getProductOwner() {
    return productOwner;
}

public String getProductId() {
    return productId;
}

public void setProductId(String productId) {
    this.productId = productId;
}

public String getProductName() {
    return productName;
}

public void setProductName(String productName) {
    this.productName = productName;
}

public int getPrice() {
    return price;
}

public void setPrice(int price) {
    this.price = price;
}

}

如果我使用 <s:textfield label="Product Id" key="productId"/> 那么 Struts 可以将 productId 填充到 Product class productId.

但是当我使用 <s:property value="%{[0].productId}"/> 它工作正常。

现在我的问题是为什么我不能使用像 %{[0].productId} 这样的完整 OGNL 表达式,但是在 <s:property /> 标签中 为什么我可以使用像 %{[0].productId}.[=30= 这样的完整 OGNL 表达式]

key="%{productId} 不起作用,因为使用 %{} 是在强制表达式求值,而 productId 中没有值,因此 name 属性为空.

key="[0].productId"是一个正确的表达式,在OGNL中正常工作,但是因为它有一定的安全隐患所以不允许使用这个表达式在Struts2中设置值。当然,允许通过此表达式获取值,因此 <s:property value="[0].productId"/> 有效。