2

我将应用程序从 servlet 重写为 Struts 2。

以前为了获取参数值,我可以写:

request.getParameter("name");

现在我应该这样做:

public class MyAction implements ParameterAware {
  private Map<String, String[]> parameters;

  @Override
  public void setParameters(Map<String, String[]> parameters) {
    this.parameters = parameters;
  }

  public String getParameterValue(String name){
    return parameters.get(name)[0];
  }

  // get this parameter

当我使用 servlet 时,这要容易得多!

为了使代码 DRYer,我可以创建类 CustomActionSupport 扩展 ActionSupport 并将此代码放在那里。但是为什么 Struts 不为我做呢?我怎样才能让我的生活更轻松?

我使用 ParameterAware 作为文档说这是一种首选方式

4

1 回答 1

5

Struts2 的正常用例是拥有与参数对应的动作属性,并让参数拦截器在执行动作之前为您设置这些属性。

Struts2 试图隐藏您的操作作为 HTTP 请求的结果被调用的事实。尝试直接使用参数正在与这种范式作斗争。


这是一个依赖参数拦截器的小例子。首先,定义一个值对象。

public class Name {

  private String firstName;
  private String surname;

  public void setFirstName(String s) {
    this.firstName = s;
  }

  public void setSurname(String s) {
    this.surname = s;
  }

  /* Some interesting operations on Name... */

}

定义要使用的 Struts2 动作Name。name 的属性将在execute()调用之前使用 HTTP 参数设置。

public class NameAction extends Action {

  private final Name name = new Name();

  public Name getName() {
    return name;
  }

  public String execute() {
    /* Use "name" to do something interesting; its properties are set. */
  }

}

现在创建一个使用您的操作的表单:

<s:form action="name">
  <s:textfield name="name.firstName" label="First name" />
  <s:textfield name="name.surname" label="Last name" />
  <s:submit/>
</s:form>

现在,Name当表单提交到NameAction.

您可以设置框架做更多的事情,例如验证参数、使用 IoC 容器向您的操作注入对象等。

于 2012-11-15T22:09:54.003 回答