08 04Struts 2.x数据验证

1 数据验证方法覆写

在任何的开发情况下,只要是项目编写,那么绝对不可避免的就要涉及到数据验证部分,但是对于数据验证的部分应该是有两种形式的:
(1)第一种形式:客户端验证,使用JavaScript完成,如果方便一些使用JQuery中的验证框架完成;
(2)第二种形式:服务器端验证,在服务器端进行检查,这样即便客户端验证失效了,那么数据依然可以保证正确。

如果要想实现一些基础验证,只需要覆写一些方法即可,在ActionSupport类里面提供有如下一个方法:
(1)public void validate(),这个方法里面只适合于编写进行验证的操作,这个方法会自动进行调用是在执行具体的业务方法之前执行;
(2)保存单个错误信息:public void addFieldError(String fieldName, String errorMessage)
(3)取得全部的错误信息:public Map<String,List<String>> getFieldErrors()
在调用validate()方法之后,如果发现里面有内容(Map集合的长度大于0),那么就认为会出现错误。会跑到跳转路径的key为input路径进行错误显示。

范例:定义News.java类

@SuppressWarnings("serial")
public class News implements Serializable{

	private Integer nid;
	private String ntitle;
	private String ncontent;
	private Date npubdate;	
}

范例:定义表单

<form action="" method="post">
	新闻ID:&nbsp;<input type="text" name="news.nid" id="nid">
	新闻标题:&nbsp;<input type="text" name="news.ntitle" id="ntitle">
	新闻内容:&nbsp;<input type="text" name="news.ncontent" id="ncontent">
	发布日期:&nbsp;<input type="text" name="news.npubdate" id="npubdate">
	<input type="submit" value="submit">
	<input type="reset" value="reset">
</form>

范例:定义news_show.jsp页面,此页面显示提交信息(利用标签完成)

<body>
	<h1><s:property value="news.nid"/></h1>
	<h1><s:property value="news.nname"/></h1>
	<h1><s:property value="news.ncontent"/></h1>
	<h1><s:property value="news.npubdate"/></h1>
</body>

定义NewsAction,而后覆写好validate()方法。
范例:定义NewsAction,暂时不加入验证

@SuppressWarnings("serial")
public class NewsAction extends ActionSupport {
	private News news = new News();
	
	public News getNews() {
		return news;
	}
	
	public String insert(){
		System.out.println(this.news);
		return "news.show";
	}
	
	@Override
	public void validate() {
		System.out.println("*****************");
	}
}

现在的Action只是负责信息显示,而后跳转到一个指定的路径上,而这个路径要配置的是news_show.jsp页面。
范例:修改struts.xml文件

<package name="root" namespace="/" extends="struts-default">
	<action name="NewsAction" class="org.lks.action.NewsAction">
		<result name="news.show">news_show.jsp</result>
	</action>
</package>

那么下面的程序就需要针对于错误进行验证,但是非常遗憾的是,这个验证发生在赋值之后。在validate()方法里面所能够验证的只有null这一个形式的判断,那么既然要验证必然要保存错误信息。
范例:定义全局资源文件——Messages.properties

data.null={0}不允许为空!

范例:定义struts.properties文件

struts.i18n.encoding=UTF-8
struts.locale=zh_CN

struts.custom.i18n.resources=Messages,Pages

范例:编写验证

@Override
	public void validate() {
		if(this.news.getNid() == null || "".equals(this.news.getNid())){
			super.addFieldError("news.nid", super.getText("data.null", new String[]{"新闻ID"}));
		}else if(this.news.getNtitle() == null || "".equals(this.news.getNtitle())){
			super.addFieldError("news.ntitle", super.getText("data.null", new String[]{"新闻标题"}));
		}else if(this.news.getNcontent() == null || "".equals(this.news.getNcontent())){
			super.addFieldError("data.null", super.getText("data.null", new String[]{"新闻内容"}));
		}else if(this.news.getNpubdate() == null || "".equals(this.news.getNpubdate())){
			super.addFieldError("data.null", super.getText("data.null", new String[]{"新闻发布日期"}));
		}
	}

整个的代码操作之中只是进行了一个功能的填充。但是如果验证失败,它会默认找到input对应的路径,所以需要在配置action的时候找到input的设置。
范例:修改struts.xml文件

<package name="root" namespace="/" extends="struts-default">
	<action name="NewsAction" class="org.lks.action.NewsAction">
		<result name="news.show">news_show.jsp</result>
		<result name="input">news_insert.jsp</result>
	</action>
</package>

此时一个最为基础的验证就算是完成了。

2 错误信息显示

虽然这个时候已经可以成功的进行了错误跳转,但是跳转之后可能依然没有人知道出现了哪些错误,那么现在就必须想办法在页面中显示这些错误。

首先必须明确的再次提示,在ActionSupport类里面提供的取得全部错误信息的方法:
(1)取得错误信息:public Map<String,List<String>> getFieldErrors()
所有的错误信息都是以Map集合形式保存的,而Map中的key是表单的参数名称,但是最麻烦的是后面的value保存的是List集合,如果是List集合,你这里面就应该想办法输出内容。

当验证失败之后,所有保存的错误信息都会自动的存放在request属性范围之内,而千万要记住,如果出现了错误,会跑到input设置的路径上进行错误显示。
范例:修改验证方法

@Override
public void validate() {
	if(this.news.getNid() == null || "".equals(this.news.getNid())){
		super.addFieldError("news.nid", super.getText("data.null", new String[]{"新闻ID"}));
	}
	if(this.news.getNtitle() == null || "".equals(this.news.getNtitle())){
		super.addFieldError("news.ntitle", super.getText("data.null", new String[]{"新闻标题"}));
	}
	if(this.news.getNcontent() == null || "".equals(this.news.getNcontent())){
		super.addFieldError("data.null", super.getText("data.null", new String[]{"新闻内容"}));
	}
	if(this.news.getNpubdate() == null || "".equals(this.news.getNpubdate())){
		super.addFieldError("data.null", super.getText("data.null", new String[]{"新闻发布日期"}));
	}
}

而后在前台页面上显示出相应的错误信息。
范例:显示错误信息

<form action="NewsAction!insert.action" method="post">
	新闻ID:&nbsp;<input type="text" name="news.nid" id="nid" value="1001">
	<span>${fieldErrors['news.nid'][0] }</span><br>
	新闻标题:&nbsp;<input type="text" name="news.ntitle" id="ntitle" value="你好">
	<span>${fieldErrors['news.ntitle'][0] }</span><br>
	新闻内容:&nbsp;<input type="text" name="news.ncontent" id="ncontent" value="我不好">
	<span>${fieldErrors['news.ncontent'][0] }</span><br>
	发布日期:&nbsp;<input type="text" name="news.npubdate" id="npubdate" value="2020-03-02">
	<span>${fieldErrors['news.npubdate'][0] }</span><br>
	<input type="submit" value="submit">
	<input type="reset" value="reset">
</form>

整个的输入页面并没有使用Struts 2.x所提供的开发标签,都是利用了request属性范围得来的。

疑问:怎么知道Action跳转回JSP页面后会自动传递一个名称为fieldErrors的request属性呢?
要知道在整个JSP内置对象里面,有四种属性范围,但是千万要记住,每一个属性范围的内置对象里面都会提供有一个方法:取得所有属性的名称:public Enumeration getAttributeNames()

结论:所有的验证的操作方法都是在赋值完成之后完成的。这种的验证操作实际上根本就无效,也根本没有什么单独使用的意义,唯一可以使用的意义只有一个:可以利用input跳转,而后可以将错误信息传递给request属性,进行页面的内容输出。

但是此验证是在赋值后进行,所以一旦数据出现了格式的错误,那么根本就无法进行有效验证,后台依旧会出现报错的情况。

总结:
(1)在执行具体的业务操作方法之前,一定会默认调用validate()方法进行检查;
(2)所有的错误信息都保存在了fieldErrors这个Map集合之中,每一个错误信息可以使用addFieldError()方法进行添加;
(3)默认情况下所有的验证都是在数据赋值成功之后使用的,所以如果直接使用都无用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值