ActionSupport 类型转换与输入校验

下面我们来分析一下继承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>

myOutput.jsp

<%@ 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 所对应的页面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值