问题引入
通常在form表单输入数据提交前,会进行输入的验证和限制,比如登陆时账户和密码不能为空,注册时两次输入密码必须一致……一般可用JS进行控制。而struts2中提供了更为便捷的方法。
使用Action的validate()方法
1.Action继承ActionSupport 2.在Action中覆写validate()方法 3.在validate()方法中使用addFieldError()方法,配置struts.xml文件。
源代码
UserAction.java
package org.dny.action;import org.dny.model.User;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven; <User>{private User user;@Overridepublic User getModel() {if(this.user == null)this.user = new User();return this.user;}public String login() { //登录System.out.println(“UserAction login”);System.out.println(“userName:”+user.getUserName());System.out.println(“paswword:”+user.getPassword());return “loginSuccess”;}@Overridepublic void validate() { //在Action的所有其他函数之前函数之前执行,进行验证System.out.println(“UserAction validate”);if(user.getUserName() == null || user.getUserName().trim().equals(“”))this.addFieldError(“userName”, “帐号不能为空”); //给userName属性添加错误消息“帐号不能为空”if(user.getPassword() == null || user.getPassword().trim().equals(“”))this.addFieldError(“password”, “密码不能为空”);}}
1.函数addFieldError(“字段名”,”错误信息”):给一个字段(属性)添加错误消息 2.点击登录,调用Action的login()方法。而在Action的login()方法执行之前,会先执行validate()方法。 3.如果在validate()方法中执行了addFieldError()或者addActionError()方法,,则Action不会执行login()方法,而是直接跳转到一个名为”input”的result视图。
struts.xml文件的action配置:
<action name=”user_*” class=”org.dny.action.UserAction” method=”{1}”><result name=”loginSuccess”>/success.jsp</result><result name=”input”>/index.jsp</result></action>
1.当登录成功时,会跳转到success.jsp页面 2.当输入没有通过validate()函数的验证时,会跳转到首页。
index.jsp页面:
=>>=><!– 通过EL表达式取出 fieldErrors中userName的值 –>${fieldErrors[‘userName’][0]}>=><td><!– 通过EL表达式取出 fieldErrors中password的值 –>${fieldErrors[‘password’][0]}>==”submit” value=”登录”> <input>>${fieldErrors}/>>====>>>
1.要使用struts标签,还需在页面首部上加上:
<%@ taglib prefix=”s” uri=”/struts-tags”%>
2.错误信息fieldErrors既可以由EL表达式取得,又可以由struts标签<s:fielderror />取得。 3.使用<s:form></form>的好处:如果验证错误,错误信息会直接显示在对应属性的textfield前面。
运行结果及截图
1.验证通过,登录成功的情况:
2.验证失败,重新跳转到index.jsp的情况:
点击debug标签:
放弃等于又一次可以选择的机会。