ключевой атрибут OGNL в Struts2

Я давно работаю с Struts2.

Когда я использую <s:textfield label="Product Id" key="%{productId}"/> или <s:textfield label="Product Id" key="[0].productId"/>, это не работает. т. е. если я использую первый тег с атрибутом ключа, указывающим на выражение OGNL %{productId}, то результирующий атрибут имени html input tag's будет пустым, т.е. <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 не может заполнить мой параметр запроса в моем объекте модели, который является классом продукта, как показано ниже:

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 классе productId.

Но когда я использую <s:property value="%{[0].productId}"/>, он работает правильно.

Теперь мой вопрос: почему я не могу использовать полные выражения OGNL, такие как %{[0].productId}, но в теге <s:property /> Почему я могу использовать полные выражения OGNL, такие как %{[0].productId}.


person Jagadeesh    schedule 11.09.2015    source источник


Ответы (1)


key="%{productId} не работает, потому что, используя %{}, вы принудительно оцениваете выражение, а у вас нет значения в productId, поэтому атрибут name пуст.

key="[0].productId" является правильным выражением и обычно работает в OGNL, но поскольку оно имеет определенные риски безопасности, его нельзя использовать для установки значений в Struts2. Конечно, это выражение позволяет получать значения, поэтому <s:property value="[0].productId"/> работает.

person Aleksandr M    schedule 11.09.2015
comment
Я кое-что понял из вашего ответа. Но если вы уточните, это было бы большим подспорьем для меня. - person Jagadeesh; 11.09.2015
comment
@Jagadeesh: Уточните, что именно? Что ты не понимаешь? - person Aleksandr M; 11.09.2015
comment
если key=%{productId} и если у меня есть productId, то что произойдет? Если ключ = [0].productId, то я получаю атрибут имени как [0].productId, почему это так? - person Jagadeesh; 11.09.2015
comment
@Jagadeesh: значение productId будет помещено в результирующий html. - person Aleksandr M; 11.09.2015
comment
Значение productId будет помещено в результирующий html как атрибут имени или атрибут значения? - person Jagadeesh; 11.09.2015
comment
key это name, value и label. - person Aleksandr M; 11.09.2015
comment
@Jagadeesh: Ты понял? - person Aleksandr M; 11.09.2015
comment
Если ключ = [0].productId, то я получаю атрибут имени как [0].productId, почему это так? - person Jagadeesh; 11.09.2015
comment
@Jagadeesh: поскольку это строка, она не будет оцениваться в атрибуте name. - person Aleksandr M; 11.09.2015
comment
Давайте продолжим обсуждение в чате. - person Jagadeesh; 11.09.2015