在实际的开发项目中,我们通常采用的是js对我们输入的值进行验证,例如,用户名的长度,密码长度,等等。但是这样做,不好之处就是我们可以通过人为的将开发者的验证js注掉,这样就导致验证失败,对后台安全性是一个很大的威胁,在采用struts2进行开发时,我们可以采用框架内置的校验器,对我们的Action进行校验。本文所讲诉的就是如何使用重写struts2中的ActionSupport里面的validate方法对输入值进行校验。
ok,看下面代码!
2、编写我们的Action方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<code>package</code> <code>csg.struts2.action;</code>
<code>import</code> <code>java.util.regex.Pattern;</code>
<code>import</code> <code>com.opensymphony.xwork2.ActionContext;</code>
<code>import</code> <code>com.opensymphony.xwork2.ActionSupport;</code>
<code>/**</code>
<code> </code><code>* </code>
<code> </code><code>* @author 小夜的传说</code>
<code> </code><code>* @2014-7-20</code>
<code> </code><code>* @validate</code>
<code> </code><code>* @csg.struts2.action</code>
<code> </code><code>* @StrutsAction</code>
<code> </code><code>* @2014-7-20下午7:21:26</code>
<code> </code><code>*/</code>
<code>public</code> <code>class</code> <code>StrutsAction </code><code>extends</code> <code>ActionSupport {</code>
<code> </code><code>private</code> <code>static</code> <code>final</code> <code>long</code> <code>serialVersionUID = 1L;</code>
<code> </code><code>private</code> <code>String username;</code>
<code> </code><code>private</code> <code>String mobile;</code>
<code> </code><code>public</code> <code>String getUsername() {</code>
<code> </code><code>return</code> <code>username;</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>void</code> <code>setUsername(String username) {</code>
<code> </code><code>this</code><code>.username = username;</code>
<code> </code><code>public</code> <code>String getMobile() {</code>
<code> </code><code>return</code> <code>mobile;</code>
<code> </code><code>public</code> <code>void</code> <code>setMobile(String mobile) {</code>
<code> </code><code>this</code><code>.mobile = mobile;</code>
<code> </code>
<code> </code><code>public</code> <code>String update(){</code>
<code> </code><code>ActionContext.getContext().put(</code><code>"message"</code><code>, </code><code>"更新成功"</code><code>);</code>
<code> </code><code>return</code> <code>"success"</code><code>;</code>
<code> </code><code>public</code> <code>String save(){</code>
<code> </code><code>ActionContext.getContext().put(</code><code>"message"</code><code>, </code><code>"保存成功"</code><code>);</code>
<code> </code><code>/**</code>
<code> </code><code>* 全局方法进行验证</code>
<code> </code><code>*/</code>
<code> </code><code>/*@Override</code>
<code> </code><code>public void validate() {</code>
<code> </code><code>if(this.username==null||"".equals(this.username.trim())){</code>
<code> </code><code>this.addFieldError("username", "用户名不能为空");</code>
<code> </code><code>}</code>
<code> </code><code>if(this.mobile==null||"".equals(this.mobile.trim())){</code>
<code> </code><code>this.addFieldError("mobile", "手机号不能为空");</code>
<code> </code><code>}else{</code>
<code> </code><code>if(!Pattern.compile("^1[358]\\d{9}$").matcher(this.mobile).matches()){</code>
<code> </code><code>this.addFieldError("mobile", "手机号格式不正确");</code>
<code> </code><code>}</code>
<code> </code><code>super.validate();</code>
<code> </code><code>}*/</code>
<code> </code><code>* 单个方法进行验证</code>
<code> </code><code>public</code> <code>void</code> <code>validateSave() {</code>
<code> </code><code>if</code><code>(</code><code>this</code><code>.username==</code><code>null</code><code>||</code><code>""</code><code>.equals(</code><code>this</code><code>.username.trim())){</code>
<code> </code><code>this</code><code>.addFieldError(</code><code>"username"</code><code>, </code><code>"用户名不能为空"</code><code>);</code>
<code> </code><code>if</code><code>(</code><code>this</code><code>.mobile==</code><code>null</code><code>||</code><code>""</code><code>.equals(</code><code>this</code><code>.mobile.trim())){</code>
<code> </code><code>this</code><code>.addFieldError(</code><code>"mobile"</code><code>, </code><code>"手机号不能为空"</code><code>);</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>if</code><code>(!Pattern.compile(</code><code>"^1[358]\\d{9}$"</code><code>).matcher(</code><code>this</code><code>.mobile).matches()){</code>
<code> </code><code>this</code><code>.addFieldError(</code><code>"mobile"</code><code>, </code><code>"手机号格式不正确"</code><code>);</code>
<code> </code><code>super</code><code>.validate();</code>
<code>}</code>
在这里讲解一下,我们的validate()方法会对我们Action里面的所有方法进行验证,但是比如说我们的get,list方法是不需要验证的所以通过validateXxx这样就可以对我们单个方法进行验证(validateXxx注意我们需要被验证的方法名首字母一定要大写)
ok,
3、编写我们的jsp提交页面(index.jsp)
<code><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%></code>
<code><%@taglib prefix="s" uri="/struts-tags" %></code>
<code><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"></code>
<code><</code><code>html</code><code>></code>
<code> </code><code><</code><code>head</code><code>></code>
<code> </code><code><</code><code>title</code><code>>后台验证表单提交</</code><code>title</code><code>></code>
<code> </code><code><</code><code>meta</code> <code>http-equiv</code><code>=</code><code>"pragma"</code> <code>content</code><code>=</code><code>"no-cache"</code><code>></code>
<code> </code><code><</code><code>meta</code> <code>http-equiv</code><code>=</code><code>"cache-control"</code> <code>content</code><code>=</code><code>"no-cache"</code><code>></code>
<code> </code><code><</code><code>meta</code> <code>http-equiv</code><code>=</code><code>"expires"</code> <code>content</code><code>=</code><code>"0"</code><code>> </code>
<code> </code><code><</code><code>meta</code> <code>http-equiv</code><code>=</code><code>"keywords"</code> <code>content</code><code>=</code><code>"keyword1,keyword2,keyword3"</code><code>></code>
<code> </code><code><</code><code>meta</code> <code>http-equiv</code><code>=</code><code>"description"</code> <code>content</code><code>=</code><code>"This is my page"</code><code>></code>
<code> </code><code><!--</code>
<code> </code><code><link rel="stylesheet" type="text/css" href="styles.css"></code>
<code> </code><code>--></code>
<code> </code><code></</code><code>head</code><code>></code>
<code> </code><code><</code><code>s:fielderror</code><code>/></code><code><!--获取验证失败之后的提示信息--></code>
<code> </code><code><</code><code>body</code><code>></code>
<code> </code><code><</code><code>form</code> <code>action</code><code>=</code><code>"/validate/test/list_save"</code> <code>method</code><code>=</code><code>"post"</code><code>></code>
<code> </code><code>用户名:<</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"username"</code><code>/>不能为空<</code><code>br</code><code>/></code>
<code> </code><code>手机号:<</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"mobile"</code><code>/>不能为空符合手机号格式<</code><code>br</code><code>/></code>
<code> </code><code><</code><code>input</code> <code>type</code><code>=</code><code>"submit"</code> <code>value</code><code>=</code><code>"提交"</code><code>/></code>
<code> </code><code></</code><code>form</code><code>></code>
<code> </code><code></</code><code>body</code><code>></code>
<code></</code><code>html</code><code>></code>
大家注意了,当我们验证成功之后,我的提示信息通过ActionContext.getContext()直接放在request范围里面,那么我们的验证失败之后的信息呢?这个就是放在ActionSupport里面这个属性中(看一下源码就知道了),ActionSupport里面有如下这段代码!
<code> </code><code>public</code> <code>void</code> <code>addFieldError(String fieldName, String errorMessage) {</code>
<code> </code><code>validationAware.addFieldError(fieldName, errorMessage);</code>
但是当我们验证失败之后,ActionSupport默认返回的是return "input"视图,所以我们需要在struts.xml中配置一项视图,如下
<code><?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"UTF-8"</code> <code>?></code>
<code><!DOCTYPE struts PUBLIC</code>
<code> </code><code>"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"</code>
<code> </code><code>"http://struts.apache.org/dtds/struts-2.3.dtd"></code>
<code><</code><code>struts</code><code>></code>
<code> </code><code><</code><code>package</code> <code>name</code><code>=</code><code>"struts"</code> <code>namespace</code><code>=</code><code>"/test"</code> <code>extends</code><code>=</code><code>"struts-default"</code><code>></code>
<code> </code><code><</code><code>action</code> <code>name</code><code>=</code><code>"list_*"</code> <code>class</code><code>=</code><code>"csg.struts2.action.StrutsAction"</code> <code>method</code><code>=</code><code>"{1}"</code><code>></code>
<code> </code><code><</code><code>result</code> <code>name</code><code>=</code><code>"success"</code><code>>/WEB-INF/page/success.jsp</</code><code>result</code><code>></code>
<code> </code><code><</code><code>result</code> <code>name</code><code>=</code><code>"input"</code><code>>/index.jsp</</code><code>result</code><code>></code>
<code> </code><code></</code><code>action</code><code>></code>
<code> </code><code></</code><code>package</code><code>></code>
<code></</code><code>struts</code><code>></code>
那么在index.jsp中我们就可以直接通过struts标签来取到
this.addFieldError里面的值。
ok,我们验证成功之后,直接转发到success.jsp页面,里面直接通过el表达式,${message}取到值
本文转自 小夜的传说 51CTO博客,原文链接:http://blog.51cto.com/1936625305/1440580,如需转载请自行联系原作者