1. Action类
Action类在MVC模式中发挥着控制器(Controller)的作用。Action类响应用户的动作,执行业务逻辑或调用其他类来执行业务逻辑,然后返回一个result用来告诉Struts应该呈现哪个视图。
Struts2的Action类常常继承由Struts2框架提供的ActionSupport类,该类提供了一些常见动作的默认实现,如execute、input等,还实现了一些有用的Struts2接口。当你的Action类继承ActionSupport时,它既可以重载默认实现,也可以继承默认实现。在上一章的例子中,HelloWorldAction中的execute()方法就是我们想要这个控制器做的事情,来响应hello.action。
2. 在Action类中处理表单输入
2.1 简单的获取输入
Action的最常见职责之一就是处理用户在表单中的输入,让处理结果可以在视图页面中显示。例如,我们在HelloWorld.jsp中想要显示一个个性化的hello,在index.jsp中我们要添加一个表单:
<s:form action="hello">
<s:textfield name="userName" label="Your name" />
<s:submit value="Submit" />
</s:form>
注意textfield的name属性的值"userName"。当用户点击该表单的提交按钮时,hello action将会被执行。该表单域的值将会被提交到Struts2的Action类,也就是HelloWorldAction。为了让HelloWorldAction类能够自动地接收到userName的值,该类必须有一个public的方法setUserName(符合JavaBean规范)。如此,在提交的时候,框架就会自动调用serUserName()方法,将表单中的value值作为参数传入,以此来设置userName的值。
在HelloWorldAction中添加setter方法:
private String userName;
public void setUserName(String username) {
this.userName = username;
}
public String getUserName() {
return userName;
}
为了让MessageStore中存储的message个性化,在HelloWorldAction的execute()方法中添加以下代码段:
public String execute() throws Exception {
messageStore = new MessageStore();
if (userName != null) {
messageStore.setMessage("Hello,"+userName);
}
return SUCCESS;
}
如果MessageStore类中没有setter方法,那么添加一个setMessage方法:
public void setMessage(String message) {
this.message = message;
}