现在的位置: 首页 > 综合 > 正文

ActionSupport 类型转换与输入校验

2013年08月17日 ⁄ 综合 ⁄ 共 2869字 ⁄ 字号 评论关闭

下面我们来分析一下继承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 所对应的页面

抱歉!评论已关闭.