ActionForm是什么?
ActionForm本质上是一种JavaBean,是专门用来传递表单数据的DTO(Data Transfer Object,数据传递对象)。它包括用于表单数据验证的validate()方法和用于数据复位的reset()方法。
我们为什么要使用它?
因为我们要将页面的数据传到后台,也就是从表示层传到逻辑层。要利用ActionForm对象来临时存放视图页面中的表单数据
怎么使用ActionForm?
1、得到页面的Map集合
2、配置xml
3、通过反射得到对象
4、得到对象的字段
5、method.invoke(对象,map.get(key));【通过反射给当前对象set值】
6、验证(正则表达式写一款通用的正则表达式);
config.xml
<?xml version="1.0" encoding="UTF-8"?> <actions> <actionForm name="newForm" class="com.lxit.company.bean.NewsVo"/> <action name="company" class="com.lxit.company.action.AdministratorAction"> <forward name="doValidate" type="redirect">company.0905?method=doLogin</forward> <forward name="doSave">company.0905?method=doSave</forward> <forward name="doFindAll">company.0905?method=doFindAll</forward> <forword name="aindex" type="redirect">index.jsp</forword> <forword name="showUserList">showUserList.jsp</forword> <forword name="addManager">addManager.jsp</forword> <forward name="index" type="redirect">admin/index.jsp</forward> <forward name="login" type="redirect">login.jsp</forward> <forward name="error">error.jsp</forward> <forward name="doRemoveCookie">company.0905?method=doRemoveCookie</forward> </action> <newsAction form="newForm" name="newsAction" class="com.lxit.company.action.NewsAction"> <forward name="doSave">newsAction.0905?method=doSave</forward> <forward name="addNews">addNews.jsp</forward> <forward name="doFindAll">newsAction.0905?method=doFindAll</forward> <forward name="manageNews">manageNews.jsp</forward> <forward name="doShowNewsIndex" type="redirect">newsAction.0905?method=doShowNewsIndex</forward> <forward name="showNewsList">showNewsList.jsp</forward> <forward name="index">index.jsp</forward> <forward name="detailNews">detailNews.jsp</forward> <forward name="doObscure">newsAction.0905?method=doObscure</forward> </newsAction> <goodsAction name="goodsAction" class="com.lxit.company.action.GoodsAction"> <forward name="doSave">goodsAction.0905?method=doSave</forward> <forward name="addProduct">addProduct.jsp</forward> <forward name="doFindAll">goodsAction.0905?method=doFindAll</forward> <forward name="manageProduct">manageProduct.jsp</forward> <forward name="updateProduct">updateProduct.jsp</forward> <forward name="doShowProductList">goodsAction.0905?method=doShowProductList</forward> <forward name="showProductList">showProductList.jsp</forward> <forward name="detailProduct">detailProduct.jsp</forward> </goodsAction> <messageAction name="messageAction" class="com.lxit.company.action.MessageAction"> <forward name="doSave">messageAction.0905?method=doSave</forward> <forward name="doFindAll">messageAction.0905?method=doFindAll</forward> <forward name="newMessage">newMessage.jsp</forward> <forward name="messageBoard">messageBoard.jsp</forward> </messageAction> <ajaxAction name="ajaxAction" class="com.lxit.company.action.AjaxAction"> <forward name="doSave">ajaxAction.0905?method=doJudge</forward> </ajaxAction> <company name="mysql"> <mysql name="mysql.driver" value="com.mysql.jdbc.Driver"></mysql> <mysql name="mysql.url" value="jdbc:mysql://localhost:3306/company"></mysql> <mysql name="mysql.userName" value="root"></mysql> <mysql name="mysql.password" value="123"></mysql> </company> </actions>
ConfigUtil
package com.lxit.company.util;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import org.apache.log4j.Logger;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import com.lxit.company.action.ActionServlet;
/**
*
* 文件名:ConfigUtil.java
* 版权: 方勇
* 描述: 对键值对进行批量处理
* 修改时间: 2010-2-23下午02:43:00
*/
public class ConfigUtil {
private final Logger logger=Logger.getLogger(ConfigUtil.class);
private Document document=null;
/**
* 批量导入键值对
* @param configPath
*/
public ConfigUtil() {
logger.debug(StringUtil.append( "ConfigUtil", Common.BEGIN));
SAXBuilder builder=new SAXBuilder();
FileInputStream fileInputStream=null;
try {
fileInputStream = new FileInputStream(ActionServlet.configPath);
document=builder.build(fileInputStream);
} catch (FileNotFoundException e) {
logger.error(StringUtil.append("ConfigUtil",e.getMessage()));
} catch (JDOMException e) {
logger.error(StringUtil.append("ConfigUtil",e.getMessage()));
} catch (IOException e) {
logger.error(StringUtil.append("ConfigUtil",e.getMessage()));
}finally{
try{
if(null!=fileInputStream){
fileInputStream.close();
}
} catch (IOException e) {
logger.error(StringUtil.append("ConfigUtil",e.getMessage()));
}
}
logger.debug(StringUtil.append( "ConfigUtil", Common.END));
}
/**
*
* 〈得到action节点〉
* @param [key] [键值]
* @return [Element]
* @Author 方勇
*/
public Element getActionElement(String key){
logger.debug(StringUtil.append( "getActionElement", Common.BEGIN));
Element actionElement=null;
Element root=document.getRootElement();
@SuppressWarnings("unchecked")
List<Element> children=root.getChildren();
String value=null;
for (Element element : children) {
value=element.getAttributeValue("name");
if(key.equals(value)){
actionElement=element;
break;
}
}
logger.debug(StringUtil.append( "getActionElement", Common.END));
return actionElement;
}
/**
*
* 〈通过key获取value〉
* @param [key] [键值]
* @return [string类型的value]
* @Author 方勇
*/
public String getActionValue(String key){
return getActionElement(key).getAttributeValue("class");
}
/**
*
* 〈得到action节点〉
*
* @param [key] [键值]
* @return [Element]
* @Author 方勇
*/
public Element getActionFormElement(String key) {
Element actionElement = null;
Element root = document.getRootElement();
@SuppressWarnings("unchecked")
List<Element> children = root.getChildren();
String value = null;
for (Element element : children) {
value = element.getAttributeValue("name");
if (key.equals(value)) {
actionElement = element;
break;
}
}
return actionElement;
}
/**
*
* 〈通过key获取value〉
*
* @param [key] [键值]
* @return [string类型的value]
* @Author 方勇
*/
public String getActionFormValue(String key) {
return getActionElement(key).getAttributeValue("class");
}
/**
*
* 〈通过key获取value〉
*
* @param [key] [键值]
* @return [string类型的value]
* @Author 方勇
*/
public String getActionFormName(String key) {
return getActionElement(key).getAttributeValue("form");
}
/**
*
* 〈获取forward节点〉
* @param [actionName] [action节点的值]
* @param [forwardVlue] [forward节点的name值]
* @return [Element]
* @Author 方勇
*/
public Element getForwardElement(String actionName,String forwardValue){
logger.debug(StringUtil.append( "getForwardElement", Common.BEGIN));
Element forwardElement=null;
Element actionElement=getActionElement(actionName);
@SuppressWarnings("unchecked")
List<Element> children=actionElement.getChildren();
String value=null;
for (Element element : children) {
value=element.getAttributeValue("name");
if(forwardValue.equals(value)){
forwardElement=element;
break;
}
}
logger.debug(StringUtil.append( "getForwardElement", Common.END));
return forwardElement;
}
/**
*
* 〈得到forward节点值〉
* @param [actionName] [action节点的name值]
* @param [forwardName] [forward节点的name值]
* @return [String]
* @Author 方勇
*/
public String getForwardValue(String actionName,String forwardValue){
Element forwardElement = getForwardElement(actionName,forwardValue);
return forwardElement.getText();
}
/**
*
* 〈得到跳转页面类型〉
* @param [actionName] [action节点的name值]
* @param [forwardName] [forward节点的name值]
* @return [String]
* @Author 方勇
*/
public String getForwardType(String actionName,String forwardValue){
logger.debug(StringUtil.append("getForwardType", Common.BEGIN));
String type=null;
Element forwardType=getForwardElement(actionName,forwardValue);
type=forwardType.getAttributeValue("type");
logger.debug(StringUtil.append("getForwardType", Common.END));
return type;
}
/**
*
* 〈数据库连接〉
* @param [companyName] [company节点的name值]
* @param [mysqlName] [mysqlName节点的值]
* @return [Element]
* @Author 方勇
*/
public Element getDbElement(String companyName,String mysqlName){
logger.debug(StringUtil.append("getDbElement", Common.BEGIN));
Element forwardElement=null;
Element actionElement=getActionElement(companyName);
@SuppressWarnings("unchecked")
List<Element> children=actionElement.getChildren();
String value=null;
for (Element element : children) {
value=element.getAttributeValue("name");
if(mysqlName.equals(value)){
forwardElement=element;
break;
}
}
logger.debug(StringUtil.append("getDbElement", Common.END));
return forwardElement;
}
/**
*
* 〈得到数据库连接的节点值〉
* @param [companyName] [company节点的name值]
* @param [mysqlName] [mysqlName节点的值]
* @return [String]
* @Author 方勇
*/
public String getDbValue(String companyName,String mysqlName){
Element forwardElement = getDbElement(companyName,mysqlName);
return forwardElement.getAttributeValue("value");
}
}
ActionFormUtil
package com.lxit.company.util;
import java.io.IOException;
import java.io.Reader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class ActionFormUtil {
private static ActionFormUtil instance = null;
public ActionFormUtil(){
}
public static synchronized ActionFormUtil getInstance(){
if(null == instance){
instance = new ActionFormUtil();
}
return instance;
}
public Object getActionForm(String actionFormKey) {
ConfigUtil configUtil = new ConfigUtil();
// action节点对应的form名
String form = configUtil.getActionFormName(actionFormKey);
// ActionForm类路径
String actionForm = configUtil.getActionFormValue(form);
Object object = null;
try {
object = Class.forName(actionForm).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return object;
}
public Object mapToObject(Map map, Object object) {
// key集合
Set keySet = map.keySet();
// map集合
Map fieldsMap = getFields(object);
for (Object object2 : keySet) {
if (fieldsMap.containsKey(object2)) {
Method[] methods = object.getClass().getMethods();
for (Method method : methods) {
String name = method.getName();
if (name.startsWith("set") && object2.equals(name.substring(3).toLowerCase())) {
try {
String[] str = (String[]) map.get(object2);
method.invoke(object, str[0]);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
return object;
}
public Map getFields(Object object) {
Map map = new HashMap();
Method[] methods = object.getClass().getMethods();
for (Method method : methods) {
String name = method.getName();
if (name.startsWith("set")) {
String field = name.substring(3).toLowerCase();
map.put(field, null);
}
}
return map;
}
}
newAction调用
NewsVo newsVo = (NewsVo) ActionFormUtil.getInstance().getActionForm("newsAction");
ActionFormUtil.getInstance().mapToObject(request.getParameterMap(), newsVo);