下面我们来分析一下继承ActionSupport的类的执行过程
myInput.jsp
<%@ taglib prefix="s"uri="/struts-tags" %>
<html>
<body>
This ismyInput.jsp <br>
<p>actionerror:</p>
<s:actionerror/>
<p>actionmessage:</p>
<s:actionmessage/>
<p>fielderror:</p>
<s:fielderror cssStyle="color:blue"/>
<form action="MyAction.action">
num: <input type="text"name="num"><br>
date:<input type="text"name=date><br>
<input type="submit" value="mySubmit">;
</form>
</body>
</html>
<%@ taglib prefix="s"uri="/struts-tags" %>
<html>
<body>
This ismyOutput.jsp <br>
num: <s:property value="num"/><br>
date:<s:property value="date"/><br>
</body>
</html>
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//ApacheSoftware Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="struts2"extends="struts-default">
<action name="MyAction"class="action.MyAction">
<result name="success">/myOutput.jsp</result>
<result name="input">/myInput.jsp</result>
</action>
</package>
</struts>
MyAction.java:
package action;
import java.util.Date;
importcom.opensymphony.xwork2.ActionSupport;
public class MyAction extends ActionSupport
{
private int num;
private Date date;
public int getNum()
{
System.out.println("getNuminvoke");
return num;
}
public void setNum(int num)
{
System.out.println("setNum");
this.num = num;
}
public Date getDate()
{
System.out.println("getDateinvoke");
return date;
}
public void setDate(Date date)
{
System.out.println("setDate");
this.date = date;
}
@Override
public void validate()
{
System.out.println("validateinvoke");
}
@Override
public String execute() throws Exception
{
System.out.println("executeinvoke");
return SUCCESS;
}
}
输入:
输出:
控制台输出:
setDate
setNum
validate invoke
execute invoke
getNum invoke
getDate invoke
从这个流程来看, 在myInput.jsp在提交表单后,表单中字符串”123”和”2011-11-09”由Struts2提供的类型转换分别转换为整型的123和Date型的11-11-9,而且分别在setNum 和 setDate 方法前完成类型转换,然后MyAction执行setNum和setDate方法,将数值设置给字段num和date,之后调用validate()方法,因为以上执行没有出现错误,所以进一步执行execute(),根据struts.xml,流程 转到 myOutput.jsp,在这个页面内,由struts标签<s:property> 通过getNum,getDate方法取得 MyAction的字段num和date的值,(通过struts的类型转换后)显示在页面上…
如果用户的输入是非法的呢?下面看看这种情况:
输入:
输出:
控制台输出:
用户输入的日期格式不正确的,我们看到控制台下输出了java.lang.NoSuchMethodException: action.MyAction.setDate([Ljava.lang.String;)它的意思是在MyAction类里,找不到setDate(String)这个方法,从myInput.jsp中, 标签<s:fielderror/> 输出了一个fielderror: Invalid field value for field"date",其流程如下:
用户输入的”XYZ”没有找到适合的类型转换器,因为”XYZ”本质是一个String类型的对象,也没有找到MyAction.setDate(String)的方法,所以抛出上面的异常, 因为无法转换到Date格式,所以无法执行setDate(Date)方法,所以控制台下没有输出”setDate”,由上面抛出的异常,所以MyAction执行addFieldError("date", " Invalid field value for field "date" ");方法,将这个字段的错误信息存放起来;而num的输入是正确的, MyAction调用setNum(int),获得字段num的值,然后再执行输入校验validate()方法,因为此前出出了FieldError,所以不再执行execute方法,流程输入struts.xml里设定的<result name="input">/myInput.jsp</result>,流程转回到myInput.jsp,而其标签<s:fielderror/> 输出了所有FieldError信息
所以继承ActionSupport的类的的执行流程:
1) 首先进行类型转换 (苦出现错误,则增加一个FieldError)
2) 然后进行输入校验(执行 validate 方法)
3) 如果在上述过程中出现了任何错误,都不会再去执行 execute
方法,会转向 struts.xml 中该 action 的名为 input 的 result 所对应的页面