Передача параметров в действие через ModelDriven в Struts 2

Проблема связана с ModelDriven и Struts 2.3.16. Поскольку поведение перехватчика params изменилось на параметры доступа, переданные действию, необходимо настроить список acceptParamNames для использования с действием ModelDriven. Если список acceptParamNames пуст, он работает по умолчанию, принимая параметры по шаблону по умолчанию. Предположим, у нас есть

ModelDriven действие:

@Namespace("/modelDriven")
public class ModelDrivenAction extends ActionSupport implements ModelDriven {

  private Gangster model = new Gangster();

  private String name; //getter and setter

  public Object getModel() {
    return model;
  }

  @Actions({
    @Action(value="modelDriven", results=@Result(location = "/modelDriven/modelDriven.jsp")),
    @Action(value="modelDrivenResult", results=@Result(location = "/modelDriven/modelDrivenResult.jsp"))
  })
  public String execute() throws Exception {
    model.setName(name);
    return SUCCESS;
  }
}

модель:

public class Gangster {
  private String name; //getter and setter
}

modelDriven.jsp:

<s:form id="modelDrivenForm" action="modelDrivenResult" method="POST" namespace="/modelDriven">    
    <s:textfield
        label="Gangster Name"
        name="[1].name"/>
    <sj:submit cssClass="btn btn-primary" executeScripts="true" targets="div1"/>
</s:form>

<div id="div1"/>

modelDrivenResult.jsp:

<s:label
    label="Gangster Name"
    name="name"/><br/>

В методе действия execute мы получаем параметр name, который должен быть заполнен перехватчиком params, и инициализируем свойство модели, чтобы отобразить его в результате. Но проблема в том, что параметр не заполнен. Как получить параметр name, заполняемый перехватчиком params, чтобы действие могло отображать значение?


person Roman C    schedule 22.01.2014    source источник


Ответы (1)


name является свойством модели, а также свойством класса действия. modelDriven перехватчик помещает модель на вершину стека значений. , поэтому его легко использовать в JSP. Объект действия находится под моделью. Таким образом, на него можно было бы ссылаться напрямую, используя префикс [1]. См. основы OGNL.

Но в этом нет необходимости, если в модели и объекте действия нет повторяющихся имен свойств. Когда имя, такое как name, оценивается OGNL, он ищет средство доступа к свойству от вершины valueStack вниз по стеку. Будет выполнен первый найденный метод доступа. Таким образом, свойство модели имеет приоритет, поскольку модель находится на вершине стека значений.

Если свойство с именем name должно быть установлено для действия, вы можете напрямую назвать это свойство как [1].name. Но такое имя параметра не принимается шаблоном по умолчанию params interceptor. . Однако это допустимое выражение OGNL. Итак, чтобы передать его через перехватчик, вам нужно добавить его в шаблон принятых имен параметров. Как это

@Action(value="modelDrivenResult", results=@Result(location = "/modelDriven/modelDrivenResult.jsp"),
  interceptorRefs = @InterceptorRef(value="defaultStack", params={
    "params.acceptParamNames", "(\\[\\d+\\]\\.)*\\w+((\\.\\w+)|(\\[\\d+\\])|(\\(\\d+\\))|(\\['\\w+'\\])|(\\('\\w+'\\)))*"
  })
)

Это связано с тем, что OGNL также проверяет шаблон принятых параметров, и этот шаблон регулярного выражения позволяет сопоставлять как params, так и сопоставители OGNL.

person Roman C    schedule 22.01.2014
comment
Я попытался сделать что-то похожее на ваш вопрос в struts-2.3.15.2, и это сработало нормально, не было необходимости изменять acceptParamNames. Это только новое для 2.3.16??? - person Siddharth Trikha; 23.01.2014
comment
acceptParamNames требуется изменить даже в старой версии, чтобы параметры передавались перехватчику, но в более новой версии это не влияет, если параметры исключены. См. также Приемлемые параметры Struts 2 и действие struts 2 без сеттера-геттера - person Roman C; 23.01.2014
comment
@SiddharthTrikha Разве вы не понимаете, что это не 2.3.15.x? Struts 2.3.16 имеет другую реализацию и поведение. - person Roman C; 28.05.2014