天天看點

Struts2對Action送出方法進行驗證

   在實際的開發項目中,我們通常采用的是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>&lt;%@ page language="java" import="java.util.*" pageEncoding="utf-8"%&gt;</code>

<code>&lt;%@taglib prefix="s" uri="/struts-tags" %&gt;</code>

<code>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;</code>

<code>&lt;</code><code>html</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>head</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>title</code><code>&gt;背景驗證表單送出&lt;/</code><code>title</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>meta</code> <code>http-equiv</code><code>=</code><code>"pragma"</code> <code>content</code><code>=</code><code>"no-cache"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>meta</code> <code>http-equiv</code><code>=</code><code>"cache-control"</code> <code>content</code><code>=</code><code>"no-cache"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>meta</code> <code>http-equiv</code><code>=</code><code>"expires"</code> <code>content</code><code>=</code><code>"0"</code><code>&gt;    </code>

<code>    </code><code>&lt;</code><code>meta</code> <code>http-equiv</code><code>=</code><code>"keywords"</code> <code>content</code><code>=</code><code>"keyword1,keyword2,keyword3"</code><code>&gt;</code>

<code>    </code><code>&lt;</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>&gt;</code>

<code>    </code><code>&lt;!--</code>

<code>    </code><code>&lt;link rel="stylesheet" type="text/css" href="styles.css"&gt;</code>

<code>    </code><code>--&gt;</code>

<code>  </code><code>&lt;/</code><code>head</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>s:fielderror</code><code>/&gt;</code><code>&lt;!--擷取驗證失敗之後的提示資訊--&gt;</code>

<code>  </code><code>&lt;</code><code>body</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>form</code> <code>action</code><code>=</code><code>"/validate/test/list_save"</code> <code>method</code><code>=</code><code>"post"</code><code>&gt;</code>

<code>        </code><code>使用者名:&lt;</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"username"</code><code>/&gt;不能為空&lt;</code><code>br</code><code>/&gt;</code>

<code>        </code><code>手機号:&lt;</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"mobile"</code><code>/&gt;不能為空符合手機号格式&lt;</code><code>br</code><code>/&gt;</code>

<code>    </code><code>&lt;</code><code>input</code> <code>type</code><code>=</code><code>"submit"</code> <code>value</code><code>=</code><code>"送出"</code><code>/&gt;</code>

<code>    </code><code>&lt;/</code><code>form</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>body</code><code>&gt;</code>

<code>&lt;/</code><code>html</code><code>&gt;</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>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"UTF-8"</code> <code>?&gt;</code>

<code>&lt;!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"&gt;</code>

<code>&lt;</code><code>struts</code><code>&gt;</code>

<code>    </code><code>&lt;</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>&gt;</code>

<code>        </code><code>&lt;</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>&gt;</code>

<code>            </code><code>&lt;</code><code>result</code> <code>name</code><code>=</code><code>"success"</code><code>&gt;/WEB-INF/page/success.jsp&lt;/</code><code>result</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>result</code> <code>name</code><code>=</code><code>"input"</code><code>&gt;/index.jsp&lt;/</code><code>result</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>action</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>package</code><code>&gt;</code>

<code>&lt;/</code><code>struts</code><code>&gt;</code>

那麼在index.jsp中我們就可以直接通過struts标簽來取到

this.addFieldError裡面的值。

ok,我們驗證成功之後,直接轉發到success.jsp頁面,裡面直接通過el表達式,${message}取到值

本文轉自 小夜的傳說 51CTO部落格,原文連結:http://blog.51cto.com/1936625305/1440580,如需轉載請自行聯系原作者