zoukankan      html  css  js  c++  java
  • struts2对action中的方法进行输入校验(2)

    struts2输入校验流程:

    1.类型转换器对请求參数运行类型转换,并把转换后的值赋给aciton中的属性

    2.假设在运行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,

    conversionError拦截器将异常信息加入到fieldErrors里,无论类型转换是否出现异常,都会进入第三步

    3.系统通过反射技术先调用action的validateXXX方法

    4.再调用aciton中的validate方法

    5.经过上述的4步。假设系统中的fieldErrors存在错误信息,系统自己主动将请求转发至名称为input的视图

    假设系统中的fieldErrors没有不论什么错误信息,系统将运行aciton中的处理方法。


    也就是说转发至input视图有两个原因:1.类型转换异常

    2.输入校验不合法


    例如以下:

    InvidateAction.java:

    package com.itheima.action;
    
    import java.util.Date;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class InvidateAction extends ActionSupport{
    
    	private String username;
    	private String tel;
    	private Date birthday;
    	private String msg;
    	public void setUsername(String username) {
    		this.username = username;
    	}
    	public void setTel(String tel) {
    		this.tel = tel;
    	}
    	
    	public void setBirthday(Date birthday) {
    		this.birthday = birthday;
    	}
    	public String getMsg() {
    		return msg;
    	}
    	public void validate() {
    		
    	}
    	public String execute1() {
    		msg = "execute1";
    		return "success";
    	}
    	public String execute2() {
    		msg = "execute2";
    		return "success";
    	}
    }
    

    person.jsp:

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<s:fielderror/>
    	<form action="${pageContext.request.contextPath }/invidateAction_execute1.action" method="post">
    		用户名:<input type="text" name="username"><br>
    		手机号:<input type="text" name="tel"><br>
    		生日:<input type="text" name="birthday"><br>
    		<input type="submit" value="提交">
    	</form>
    </body>
    </html>
    struts2.xml

    <action name="invidateAction_*" class="com.itheima.action.InvidateAction" method="{1}">
    	<result name="success">/success.jsp</result>
    	<result name="input">/person.jsp</result>
    </action>


    我在jsp中输入信息例如以下:

    则会提示:

    ======================================================================================================

    解决以上问题能够通过创建Action的类型转换器:

    类型转换器教程參见:http://blog.csdn.net/m631521383/article/details/40680723

    InvidateAction.java:

    package com.itheima.action;
    
    import java.util.Date;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class InvidateAction extends ActionSupport{
    
    	private String username;
    	private String tel;
    	private Date birthday;
    	private String msg;
    	public void setUsername(String username) {
    		this.username = username;
    	}
    	public void setTel(String tel) {
    		this.tel = tel;
    	}
    	
    	public void setBirthday(Date birthday) {
    		this.birthday = birthday;
    	}
    	public String getMsg() {
    		return msg;
    	}
    	public void validate() {
    		
    	}
    	public String execute1() {
    		msg = "execute1";
    		return "success";
    	}
    	public String execute2() {
    		msg = "execute2";
    		return "success";
    	}
    }
    

    DateTypeConverter.java:

    package com.itheima.converter;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Map;
    
    import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
    
    public class DateTypeConverter extends DefaultTypeConverter{
    
    	@Override
    	public Object convertValue(Map<String, Object> context, Object value,
    			Class toType) {
    		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmdd");
    		if(toType == Date.class) {
    			String[] strs = (String[])value;
    			Date date = null;
    			try {
    				date = dateFormat.parse(strs[0]);
    			} catch (ParseException e) {
    				e.printStackTrace();
    				throw new RuntimeException(e);
    			}
    			return date;
    		} else if(toType == String.class) {
    			return dateFormat.format((Date)value);
    		}
    		
    		return null;
    	}
    
    	
    }
    
    InvidateAction-conversion.properties:

    birthday=com.itheima.converter.DateTypeConverter

    项目树:


  • 相关阅读:
    第五章 数据的共享与保护
    实验6
    实验5
    实验4 类与对象2)
    实验三 类与对象
    实验2
    2018—3-21第二章程序例题(2)
    第二章思维导图
    2018—3-18C++第二章程序例题
    汇编实验九
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5093775.html
Copyright © 2011-2022 走看看