(转)(Struts)ActionForm类及表单数据验证
在Struts的中央控制器中写了Struts的控制器角色,在这篇介绍下Struts的视图!
Struts的视图组件:
Struts框架中的视图组件主要包括:
JSP页面。
ActionForm类。
Struts自定义标记。
消息资源。
其中,ActionForm类是Struts框架的核心组件之一,是Struts的关键视图组件。在这篇文章中,将讨论ActionForm类及其作用。
ActionForm的作用机理:
ActionForm本质上是一种JavaBean,是专门用来传递表单数据的DTD(Data Transfer Object,数据传递对象)。它包括用于表单数据验证的validate()方法和用于数据复位的reset()方法。
Struts 框架利用ActionForm对象来临时存放视图页面中的表单数据。例如,一个登录页面会有一个用户名输入框和一个密码输入框,以及用来提交登录请求的按扭。当用户提交登录请求后,Struts将 用户名和密码两个输入域的数据自动填充到相应的ActionForm对象中,然后控制层可以从该ActionForm对象中读取用户输入的表单数据,也可以把来自模型层的数据存放到ActionForm中,然后返回给视图显示。
ActionForm有(request)和 (session)两种作用域(scope)。如果ActionForm的作用域设定为request,ActionForm实例将保存在request 对象中,像其他保存在request对象中的属性一样,仅在当前请求范围内有效。如果ActionForm的作用域设定为session,那么 ActionForm实例将被保存在session对象中,同一个ActionForm实例在整个HTTP会话中有效。
在Struts框架 中,ActionForm的作用机理如下图:
当验证ActionForm时,如果检测到一个或多个验证错误,Struts框架会把错误转发回配置文件struts-config.xml中<action>元素的input属性所指定的输入页面。
ActionForm的使用方法:
下面通过在(Struts重构)构建一个简单的基于MVC模式的JavaWeb的例子,来介绍一下ActionForm的正确使用,包括如何创建,配置和访问。
1.创建ActionForm
可以扩展Struts软件包的ActionForm类来创建具体的ActionForm。Struts软件包中的ActionForm类本身 是一个抽象类,在扩展的时候,为每一个要从HTML表单中捕获的输入域定义一个属性,使表单输入域与ActionForm属性一一对应,以使 ActionForm能够捕获需要的表单输入。定义了具体的属性,就可以覆盖父类 的validate()和reset()方法,来实现具体的ActionForm验证规则和初始化方法。
下面是我在(Struts重构)构建一个简单的基于MVC模式的JavaWeb里面的例子
/**//* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass.vtl */package struts.form;import javax.servlet.http.HttpServletRequest;import org.apache.struts.action.ActionErrors;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionMapping;/** *//** * Struts框架的ActionForm对象,它可用来在用户和业务层之间舆用户的输入数据。 * ActionForm也叫FormBean.Struts框架会自动从请求中惧输入数据,再将 这些 * 数据交给一个使用FormBean的Action对象,接着FormBean可以再交给业务层 */public class LoginHandlerForm extends ActionForm { /**//* * Generated fields */ /** *//** userName property */ private String userName; /** *//** userPwd property */ private String userPwd; //验证方法,主要用于验证视图上的数据,例如非空之类, //如果要进行业务验证,则应该在Action中进行! public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { return null; } //初始化首先调用的方法 public void reset(ActionMapping mapping, HttpServletRequest request) { // TODO Auto-generated method stub } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPwd() { return userPwd; } public void setUserPwd(String userPwd) { this.userPwd = userPwd; }}
<form-beans > <form-bean name="loginHandlerForm" type="struts.form.LoginHandlerForm" /> </form-beans><form-beans>
LoginHandlerForm loginHandlerForm = (LoginHandlerForm)request.getAttribute("loginHandlerForm");
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { LoginHandlerForm loginHandlerForm = (LoginHandlerForm) form; //从Form中取得表单数据 String userName = loginHandlerForm.getUserName(); String userPwd = loginHandlerForm.getUserPwd(); //(略) return mapping.findForward(forward); }
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); if(userName == null || userName.length()<3) //此处userName为错误key,在前面页面中要使用该名字以显示 errors.add("userName",new ActionMessage("error.login.userName",userName)); if(userPwd == null || userPwd.length()<3) errors.add("userPwd",new ActionMessage("error.login.userPwd",userPwd)); return errors; }
<action attribute="loginHandlerForm" input="/login.jsp" name="loginHandlerForm" path="/loginHandler" scope="request" validate="true" type="struts.action.LoginHandlerAction" > <!-- action与视图组件的联系在配置文件中写,这样就大大降低了Action和VIEW的耦合性 --> <forward name="success" path="/main.jsp" /> <forward name="fail" path="/register.jsp" /> </action><!-- 资源文件 --> <message-resources parameter="struts.ApplicationResources" />
<%@ page language="java" pageEncoding="GBK"%><%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> <html> <head> <title>JSP for LoginHandlerForm form</title> </head> <body> <html:form action="/loginHandler"> userName : <html:text property="userName"/><html:errors property="userName"/><br/> userPwd : <html:text property="userPwd"/><html:errors property="userPwd"/><br/> <html:submit/><html:cancel/> </html:form> </body></html>