一、为什么要进行验证?
验证几乎是注册登录的必须前提,验证的主要作用有两点:
1、安全性
2、对用户提供差异化服务。
二、如何验证?
ActionSupport类中有一个validate()方法,这是为开发者使用struts提供的一个接口,初始时是没有任何验证的。所以要使用此方法首先要进行重写该方法。
举注册为例,调用顺序为setUsername()方法--》validate()方法--->register()方法。所以一旦验证不过那么将无法执行后续方法,即后面的功能将被隔离!
三、实例:
UserAction.java
package com.amos.web.action; import com.opensymphony.xwork2.ActionSupport; /** * @ClassName: UserAction * @Description: 用户管理,将相关的action封装到一个类中 * @author: amosli * @email:amosli@infomorrow.com * @date Jan 8, 2014 1:06:00 AM */ public class UserAction extends ActionSupport { private static final long serialVersionUID = -6275534406709255984L; private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { System.out.println("执行setUserName()方法!"); if (username != null & username.trim().length() > 0) { this.username = username; } } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } // 检验方法 public void validate() { System.out.println("执行validate()方法!"); if (username != null && username.trim().length() > 0) { }else{ this.addFieldError("username", "用户名为必填!"); } if (password != null && password.trim().length() > 0) { }else{ this.addFieldError("password", "密码为必填!"); } } // 用户注册 public String register() throws Exception { System.out.println("执行注册方法!"); return "toRegisterJsp"; } // 用户登录 public String login() throws Exception { System.out.println("执行登录方法!"); return "toLoginJsp"; } }
效果如图所示:
直接点击提交,不输入用户名和密码
页头将提示信息显示出来
有可能出现的问题:
1、下面这个是因为没有验证通过,要在user_struts.xml中进行配置,如果出错,将采措施进行回避这样的问题。
<s:fielderror/>
使用标签取出Action中所有的出错提示信息,这里必须定义为this.fielderror才能取到值。
<s:fielderror fieldName="password"/>,取出Action中具体的出错提示信息。
一旦使用struts2的标签那么就不要用EL表达式。
根据提示信息表明要对配置一个name为"input"的属性来对出错信息进行捕获。user_struts.xml部分内容截选:
<action name="UserRegister" class="com.amos.web.action.UserAction" method="register"> <result name="toRegisterJsp" type="dispatcher"> /register_success.jsp </result> <result name="input" type="dispatcher"> /user_register.jsp </result> </action>
将result属性配置为user_register.jsp,即如果验证不通过的话那么页将跳转回user_register.jsp页面。
其中user_register.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> <form name="register" action="/struts2/UserRegister" method="post"> <table border="2" align="center"> <caption>新用户注册</caption> <tr> <th>用户名:</th> <td><input name="username" id="username" type="text" /></td> <td><s:fielderror fieldName="username"/></td> </tr> <tr> <th>密码:</th> <td><input name="password" id="password" type="password" /></td> <td><s:fielderror fieldName="password"/></td> </tr> <tr> <td colspan="2" align="center"><input type="submit" value="提交" width="120ppx" /></td> </tr> </table> </form> </body> </html>
register_success.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> 注册成功<br/> <hr> 用户名:<s:property value="username" /> 密码:<s:property value="password"/> </body> </html>
验证不通过的效果如下图所示:
验证通过的效果图如下所示:
同样可类似对用户登录进行配置,user_struts.xml部分内容截选:
<action name="UserLogin" class="com.amos.web.action.UserAction" method="login"> <result name="toLoginJsp" type="dispatcher"> /login_success.jsp </result> <result name="input" type="dispatcher"> /user_login.jsp </result> </action>
其中login_success.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> 登录成功! <hr> 用户名:<s:property value="username"/> </body> </html>
user_login.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> <form name="register" action="/struts2/UserLogin" method="post"> <table border="2" align="center"> <caption>用户登录</caption> <tr> <th>用户名:</th> <td><input name="username" id="username" type="text" /></td> <td><s:fielderror/></td> </tr> <tr> <td colspan="2" align="center"><input type="submit" value="提交" width="120ppx" /></td> </tr> </table> </form> </body> </html>
2.如何验证指定方法?
比如只想login,不想验证register方法。
那么只需要将validate()方法改名为validateLogin()方法即可,这里只验证指定方法格式为validate+大写指定方法名首字母,例如如果只想验证register方法,那么只需要将validate()方法改为validateRegister()即可。这里就不再演示了。
本文源码链接:https://github.com/amosli/strust2