`
haiyangyiba
  • 浏览: 14423 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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文件,附件内为源文件。

 

 

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

  • T.rar (1.2 MB)
  • 下载次数: 24
0
1
分享到:
评论

相关推荐

    java处理一个form多个submit

    在 Web 应用中,一个 HTML form 标签中可能有多个 submit 按钮,每个按钮执行不同的操作。Java 通过不同的方式可以实现对多个 submit 按钮的处理,下面将详细介绍 Struts1 和 Struts2 中的处理方法。 在 Struts1 中...

    javaweb配置xssproject,完美解决安全检测报XSS漏洞

    XSSProject是一个专门针对XSS攻击防护的Java库,通过提供一系列的过滤规则和处理机制,帮助开发者构建更安全的Web应用。 首先,我们来了解一下XSSProject的核心功能。XSSProject主要包含以下几个方面: 1. **XSS...

    反射型xss攻击代码.rar

    **反射型XSS攻击详解** ...通过以上措施,我们可以有效地防止Java应用遭受反射型XSS攻击,保护用户的个人信息安全。记住,网络安全是一个持续的过程,开发者需要时刻保持警惕,定期审查和更新安全策略。

    Java相对路径绝对路径总结

    例如,提交到a.jsp的action属性为`"/webapp/user/a.jsp"`或者使用`()%&gt;`来动态获取Web应用的路径,即`"()%&gt;/user/a.jsp"`。 - **JavaScript中的相对路径**: JavaScript代码在客户端解析,因此其相对路径与HTML表单的...

    java常用框架学习笔记

    前者基于Java的反射机制,后者则基于字节码增强技术。 #### Spring2.x Spring 2.x版本引入了许多新特性,比如改进的AOP支持、增强的声明式事务管理等。 #### Annotation(Spring高版本) 随着Spring的发展,注解...

    一套英文Java笔试题面试题.doc

    2. Java反射机制允许在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法。这在诸如配置文件驱动的编程、插件系统、元数据处理等方面非常有用。通过`Class`类和相关API(如`Method`、`Field`),...

    动态生成Java Bean测试页面

    在实际应用中,开发者可能会结合使用上述技术来实现动态生成Java Bean的测试页面。通过这种方式,他们可以快速验证Bean类的各个属性是否工作正常,而无需手动编写大量的测试代码。如果要深入学习这个话题,建议访问...

    struts-commons包的源码

    9. **Java反射机制**:Struts Commons在处理Action和Form Bean时可能用到Java反射,学习如何利用反射进行动态调用和属性设置。 10. **设计模式**:识别和学习源码中应用的设计模式,如工厂模式、单例模式、策略模式...

    Java学习笔记-个人整理的

    {14.3.1}SAX应用}{206}{subsection.14.3.1} {14.4}dom4j}{207}{section.14.4} {14.5}XPath}{210}{section.14.5} {14.6}apache.commons}{211}{section.14.6} {15}sqlite3}{213}{chapter.15} {16}Web基础}{215}{...

    Struts高级部分(2)(常用Action、验证框架、动态Form

    Struts是Java Web开发中的一个经典MVC框架,它为构建可维护的、结构清晰的Web应用程序提供了强大的支持。...理解并熟练运用自定义Action、验证框架和动态Form,可以使你在Java Web开发中游刃有余。

    Struts标签库查询手册和java_API1.

    Struts标签库是Java开发Web应用时非常重要的一个组件,特别是在基于MVC(Model-View-Controller)架构的Struts框架中。这个压缩包包含了两个关键资源:《Struts标签库查询手册》和《java_API1》的CHM文件,为初学者...

    java面试问题汇总(非常全面)

    什么是Java反射机制? Java 反射机制允许程序在运行时获取类的信息(如类名、方法名等),并操作类的方法和属性。通过反射,可以在不知道类的具体名称的情况下创建对象,调用方法。 #### 11. 常用的设计模式 - *...

    CVE-2017-3506-Poc.zip_CVE-2017-3506_CVE-2017-3506 poc_CVE-2017-3

    当用户提交的HTTP请求包含恶意构造的`Content-Type`头部时,Struts2框架在解析该头部时可能会导致反射式或者基于类加载器的远程代码执行。 **漏洞利用** PoC(Proof of Concept)是一种演示漏洞可行性的小型程序。...

    jsp中用集合收集数据并填充BeanForm

    在Java Web开发中,JSP(JavaServer Pages)是一种用于创建动态网页的服务器端脚本语言,它结合了HTML和Java代码,使...同时,理解如何在服务器端将用户输入的数据映射到Java Bean,对于构建动态Web应用至关重要。

    struts2.1+spring3.0+hibernate3.3整合小例子

    &lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt; &lt;form action="textAction.action" method="post"&gt; 请输入你要添加的用户名: &lt;input type="text" name="username" /&gt;&lt;br /&gt; 请输入...

    struts学习笔记

    Struts是一个开源的MVC(Model-View-Controller)框架,用于开发Java EE Web应用程序。它简化了Web应用的开发流程,提供了一种结构化的解决方案来组织代码。Struts的核心是`ActionServlet`,它作为控制器,负责调度...

    SSH工作原理

    - Hibernate使用Java反射机制实现透明性,无需额外的字节码增强工具。 3. **良好的性能表现**: - Hibernate是一个轻量级框架,具有出色的映射灵活性和支持多种关系数据库的能力,包括从一对一到多对多的各种复杂...

Global site tag (gtag.js) - Google Analytics