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