文章目录
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: <input type="text" name="news.nid" id="nid">
新闻标题: <input type="text" name="news.ntitle" id="ntitle">
新闻内容: <input type="text" name="news.ncontent" id="ncontent">
发布日期: <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: <input type="text" name="news.nid" id="nid" value="1001">
<span>${fieldErrors['news.nid'][0] }</span><br>
新闻标题: <input type="text" name="news.ntitle" id="ntitle" value="你好">
<span>${fieldErrors['news.ntitle'][0] }</span><br>
新闻内容: <input type="text" name="news.ncontent" id="ncontent" value="我不好">
<span>${fieldErrors['news.ncontent'][0] }</span><br>
发布日期: <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)默认情况下所有的验证都是在数据赋值成功之后使用的,所以如果直接使用都无用。