java反射-在form提交的一些应用

 

 

说明:这个例子用在简化java的web开发之中,javaeye里面高手众多,我特地将这个例子贴出来,还希望各位朋友指导建议,互相学习学习。

实现:页面有一个form表单,提交到servlet或action后,表单的值与相应的javabean自动赋值。

 

假如,这里要对页面表单的数据进行插入数据库操作,

1、首先看javabean里面代码:

public class AccountBean {

	private int uid = -1;//用户编号-----hidden
	private String uname = "";//用户名称----text
	private String sex = "";//用户性别-----radio
	private String loves[];//用户爱好-------checkbox
     //省略get、set属性方法
}

 

2、BaseAction

package com.test;

import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.actions.DispatchAction;

public class BaseAction extends DispatchAction {

	private static final String TYPE_STRING = "java.lang.String";
	private static final String TYPE_INTEGER = "java.lang.Integer";
	private static final String TYPE_DOUBLE = "java.lang.Double";
	private static final String TYPE_FLOAT = "java.lang.Float";
	private static final String TYPE_BOOLEAN = "java.lang.Boolean";
	private static final String TYPE_CHARACTER = "java.lang.Character";
	private static final String TYPE_SHORT = "java.lang.Short";
	private static final String TYPE_LONG = "java.lang.Long";
	private static final String TYPE_BYTE = "java.lang.Byte";
	
	/**
	 * 将表单内所有的name属性与值封装
	 * 值的类型为基本类型、String、String[]类型,不可能为Collection或Map等集合类型
	 */
	public Map<String, Object> getFormValues(HttpServletRequest request){
		
		Map<String,Object> linkMap = null;
		Map map = request.getParameterMap();
		if(map!=null) {
			linkMap = new LinkedHashMap<String, Object>();
			Set set = map.entrySet();
			Iterator it = set.iterator();
			while(it.hasNext()) {
				Entry entry = (Entry) it.next();
				String key = entry.getKey().toString();
				String value = "";
				Object object = entry.getValue();
				if(object instanceof String[]) {
					String values[] = (String[]) entry.getValue();
					if(values.length == 1) {
						value += values[0];
					}
					if("".equals(value)){
						linkMap.put(key, values);
					}else
						linkMap.put(key, value);
				}
			}
		}
		return linkMap;
	}
	
	public void errors(String msg) {
		String temp = "操作出现异常,异常信息为:" + msg;
		try {
			throw new Exception(temp);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	/**
	 * 将form表单数据相应的javabean类与表单的数据封装,返回赋值后的javabean对象
	 */
	public Object getObjectByAttrs(String className,Map map) {
		
		try {
			Class clazz =Class.forName(className);
			Object obj = clazz.newInstance();
			Field fields[] = clazz.getDeclaredFields();
			for (int i = 0; i < fields.length; i++) {
				Field field = fields[i];
				Class classType = field.getType();
				field.setAccessible(true);
				String key = field.getName();
				if(map.containsKey(key)) {
					Object object = setFieldType(classType,map.get(key));
					field.set(obj,object);
				}
			}
			return obj;
		} catch (ClassNotFoundException e) {
			errors("加载类出现异常");
		} catch (IllegalArgumentException e) {
			errors("向方法传递了一个不合法或不正确的参数");
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			errors("没有权限访问该成员变量");
		} catch (InstantiationException e) {
			errors("反射调用实例化类错误");
		}
		
		return null;
	}
	
	private Object setFieldType(Class classType,Object object) {
		
		String typeString = classType.getName();
		
		if(typeString.equals(TYPE_INTEGER) || classType.equals(Integer.TYPE)) {
			return Integer.parseInt(object.toString());
		}else if(typeString.equals(TYPE_STRING)) {
			return object.toString();
		}else if(typeString.equals(TYPE_LONG) || classType.equals(Long.TYPE)) {
			return Long.parseLong(object.toString());
		}else if(typeString.equals(TYPE_BOOLEAN) || classType.equals(Boolean.TYPE)) {
			return Boolean.parseBoolean(object.toString());
		}else if(typeString.equals(TYPE_BYTE) || classType.equals(Byte.TYPE)) {
			return Byte.parseByte(object.toString());
		}else if(typeString.equals(TYPE_CHARACTER) || classType.equals(Character.TYPE)) {
			return object.toString().charAt(0);
		}else if(typeString.equals(TYPE_DOUBLE) || classType.equals(Double.TYPE)) {
			return Double.parseDouble(object.toString());
		}else if(typeString.equals(TYPE_FLOAT) || classType.equals(Float.TYPE)) {
			return Float.parseFloat(object.toString());
		}else if(typeString.equals(TYPE_SHORT) || classType.equals(Short.TYPE)) {
			return Short.parseShort(object.toString());
		}else {
			if(classType.isArray()) {
				if(object instanceof String) {
					return new String[] {object.toString()};
				}
				return (String[])object;
			}
			return object;
		}
	}
	
}

 

3、调用的action类AccountAction.java

 

import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class AccountAction extends BaseAction {

	public ActionForward execute(ActionMapping mapping, ActionForm forms,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		request.setCharacterEncoding("UTF-8");

		Map<String, Object> maps = this.getFormValues(request);//将表单填写的数据按name和valu存储map集合中
		AccountBean account= (AccountBean) this.getObjectByAttrs(
				"com.test.AccountBean", maps);//将表单form的转换为一个javabean属性类
		
		System.out.println(account == null);//这里输出account对象的各个属性都是有值的
		return null;
	}

}

 

4、页面表单

 

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0"> 
	<style type="text/css">
		*{
			padding: 5px;
			font:small-caps 13px 微软雅黑; 
		}
	</style>
  </head>
  
  <body>
    	<form action="test.do" method="post">
    		<table border="1">
    			<tr>
    				<td>姓名:</td>
    				<td>
    					<input type="hidden" value="1001" name="uid" />
    					<input type="text" name="uname" />
    				</td>
    			</tr>
    			<tr>
    				<td>性别:</td>
    				<td>
    					<input type="radio" name="sex" value="男" checked="checked"/>男
    					<input type="radio" name="sex" value="女"/>女
    				</td>
    			</tr>
    			<tr>
    				<td>爱好:</td>
    				<td>
    					<input type="checkbox" name="loves" value="足球" />足球
    					<input type="checkbox" name="loves" value="篮球" />篮球
    					<input type="checkbox" name="loves" value="乒乓球" />乒乓球
    					<input type="checkbox" name="loves" value="垒球" />垒球
    					<input type="checkbox" name="loves" value="台球" />台球
    				</td>
    			</tr>
    			<tr>
    				<td>说明:</td>
    				<td>
    					<textarea rows="3" cols="35" name="info"></textarea>
    				</td>
    			</tr>
    			<tr>
    				<td colspan="2" align="center">
    					<input type="submit" value="提交" />
    					<input type="reset" value="重置" />
    				</td>
    			</tr>
    		</table>
    	</form>
		
  </body>
</html>

 

5、web.xml和 strut-config.xml环境的配置就不说了,需要导入strut1.2的所有的jar文件,附件内为源文件。

 

 

总结:这里重在简化页面提交和取值这里做简化,写的不怎么高明,高手指教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值