在Struts2的框架下,Action的配置信息写在struts.xml中,用来处理来自页面的请求。
一.Action调用
1.通过表单调用
表单调用是最为常见的调用方法,只要搞清表单与Action之间的对应方法即可完成调用:
<form action="authorsearch" method="get">
input author's name:<input type="text" name="author.authorname">
<input type="submit" value="search">
</form>
这是一个简单的表单,其中action属性即可说明该表单所对应的action,在struts.xml中只要有如下配置即可完成调用:
<action name="authorsearch" class="lab2.AuthorSearch">
<result name="success">/WEB-INF/content/authorsearchresult.jsp</result>
<result name="error">/WEB-INF/content/error.jsp</result>
</action>
很明显,action的name属性必须要和表单中的action属性一致。
2.通过超链接调用
如果想实现点击某个文字或图片后在后台执行Java代码,就要使用超链接调用Action:
<td><a href="./showdetails.action?bookname.title=${l.title}">${l.title }</a></td>
其中showdetails为struts.xml下的另一Action:
<action name="showdetails" class="lab2.ShowDetails">
<result name="success">/WEB-INF/content/details.jsp</result>
<result name="error">/WEB-INF/content/error.jsp</result>
</action>
显然,使用超链接时我们使用了相对URL,以上代码中的"./showdetails.action"即为相对URL。要注意的是,使用这种方法是必须明确struts.xml中Action所在package的namespace属性,这里我的设置为"/",即项目根文件夹,如果是其他目录,还需要在"/XX.action"前加上该目录。
二.参数处理
注意观察上面的表单和超链接,便能发现author.authorname以及bookname.title这样的变量,它们的作用是向后台的Java代码传递参数。在表单的例子中,author.authorname的值为用户输入,而超链接中的"${l.title }"为jsp的EL表达式,这些都是需要交给后台处理的参数,需要通过Action传送到后台,下面用表单的例子说明。
在后台对应第一个Action的类为AuthorSearch,代码如下:
public class AuthorSearch implements Action {
private Author author;
@Override
public String execute() throws Exception {
//do something
return null;
}
}
Author的定义如下:
public class Author {
private int authorid;
private String authorname;
private String age;
private String country;
public int getAuthorid() {
return authorid;
}
public void setAuthorid(int authorid) {
this.authorid = authorid;
}
public String getAuthorname() {
return authorname;
}
public void setAuthorname(String authorname) {
this.authorname = authorname;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
在代码运行时,Struts2框架会“自动”为author.authorname赋值,其值为表单中用户所输入的内容,这是如何实现的呢?原来在底层,Struts2框架是这样实现的:
1.调用request.getParameterNames()方法获取所有的参数名。我们在JavaEE的API文档中可以看到这个方法的描述:
2.对以上方法返回的每个String执行Action.getMethod("set" + String的首字母大写)。例如上面举例的表单中我们的参数名为author.authorname,执行后所调用的method为author.setAuthorname(),而在Author类中,该方法正是authorname的setter方法,由此便完成了对author.authorname的赋值。
所以,当出现Error setting expression 'author.authorname' with value ['XXX', ]的错误时,我们就要检查是否为authorname设置了符合要求的setter方法以及前端的参数名是否与后台的变量名匹配。