为什么Struts 2不能提供更简单的方法来检索请求参数?

时间:2012-11-15 22:05:14

标签: java servlets struts2

我将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,我可以创建扩展ActionSupport的类CustomActionSupport并将此代码放在那里。但是为什么Struts不为我做呢?我怎样才能让生活更轻松?

我使用ParameterAware作为文档says that it's a preferred way

1 个答案:

答案 0 :(得分:4)

Struts2的正常用例是拥有与参数对应的动作属性,让parameters interceptor在执行动作之前为你设置这些属性。

Struts2试图隐藏您的操作是作为HTTP请求的结果而调用的事实。试图直接使用参数来对抗这种范式。


Here's a small example依赖于参数拦截器。首先,定义一个值对象。

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。在调用execute()之前,将使用HTTP参数设置name的属性。

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容器向对象注入操作等。

相关问题