1.在项目开发中,如果没有使用框架进行数据绑定与封装,则可能会写大量的类似下面的代码:

String value=request.getParameter("v");

if(null!=value){

obj.setValue(value);

}

所以有必要自己实现一个满足实际需求的自动注入表单信息到数据模型中的功能。

实现代码:

package com.cml.model;





import java.lang.reflect.Method;

import java.lang.reflect.Type;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Iterator;

import java.util.Map;





import javax.servlet.http.HttpServletRequest;





public class BindRequest

{

// 默认日期格式

private static final String DATE_FORMAT = "yyyy-MM-dd";

private SimpleDateFormat format;





public BindRequest(String f)

{

format = new SimpleDateFormat(f);

}





public BindRequest()

{

this(DATE_FORMAT);

}





@SuppressWarnings("unchecked")

public <T> T bindFromRquest(Class<?> clazz, HttpServletRequest request)

throws Exception

{



Object instance = clazz.newInstance();

// 获取请求的所有参数信息

Map<String, String> parameters = request.getParameterMap();





Iterator<String> it = parameters.keySet().iterator();





while (it.hasNext())

{

// 获取表单参数中的name

String key = it.next();

// 获取表单参数中的value

String value = request.getParameter(key);

// 获取get方法

Method getMethod = clazz.getDeclaredMethod(this.initGetMethod(key),

null);

// 获取参数返回的类型

Class type = getMethod.getReturnType();





Method method = clazz.getDeclaredMethod(this.initSetMethod(key),

type);





if (type == String.class)

{

method.invoke(instance, value);

} else if (type == int.class || type == Integer.class)

{

method.invoke(instance, Integer.parseInt(value));





} else if (type == long.class || type == Long.class)

{

method.invoke(instance, Long.parseLong(value));





} else if (type == float.class || type == Float.class)

{

method.invoke(instance, Float.parseFloat(value));





} else if (type == double.class || type == Double.class)

{

method.invoke(instance, Double.parseDouble(value));





} else if (type == Date.class)

{

method.invoke(instance, format.parse(value));

}

}





return (T) instance;

}





public String initSetMethod(String field)

{

return "set" + field.substring(0, 1).toUpperCase() + field.substring(1);

}





public String initGetMethod(String field)

{

return "get" + field.substring(0, 1).toUpperCase() + field.substring(1);

}

}

这个类可以满足大部分需求了,如果对象中有数据或集合类型,则需要自己修改部分即可!

使用反射模拟struts2属性注入功能的更多相关文章

  1. Autofac中的属性注入功能使用

    使用依赖注入容器时,大部分都是使用构造函数来注入或者是xml配置文件.也有很多支持属性注入.Autofac就是其中一个. 1 为什么要有属性注入? 对于一些使用特频繁的类或者方法,很多类都会用到,那么 ...

  2. SpringBoot之Spring@Value属性注入使用详解

    在使用Spring框架的项目中,@Value是使用比较频繁的注解之一,它的作用是将配置文件中key对应的值赋值给它标注的属性.在日常使用中我们常用的功能都比较简单,本篇文章系统的带大家来了解一下@Va ...

  3. 采用dom4j和反射模拟Spring框架的依赖注入功能

    Spring的依赖注入是指将对象的创建权交给Spring框架,将对象所依赖的属性注入进来的行为.在学习了dom4j后,其实也可以利用dom4j和反射做一个小Demo模拟Spring框架的这种功能.下面 ...

  4. Spring学习笔记之 Spring IOC容器(一)之 实例化容器,创建JavaBean对象,控制Bean实例化,setter方式注入,依赖属性的注入,自动装配功能实现自动属性注入

    本节主要内容:       1.实例化Spring容器示例    2.利用Spring容器创建JavaBean对象    3.如何控制Bean实例化    4.利用Spring实现bean属性sett ...

  5. struts2视频学习笔记 07-08(为Action的属性注入值,指定需要Struts 2处理的请求后缀,常用常量)

    课时7 为Action的属性注入值(增加灵活性,适用于经常更改的参数) Struts2为Action中的属性提供了依赖注入功能,在struts2的配置文件中,我们可以很方便地为Action中的属性注入 ...

  6. 05. struts2中为Action属性注入值

    概述 struts2为Action中的属性提供了依赖注入功能 在struts2的配置文件中,我们可以很方便地为Action中的属性注入值.注意:属性必须提供get,set方法. 配置 <acti ...

  7. spring练习,使用Eclipse搭建的Spring开发环境,属性注入通过构造方法方式实现,模拟用户的正常登录。

    相关 知识 >>> 相关 练习 >>> 实现要求: 使用Eclipse搭建的Spring开发环境,属性注入通过构造方法方式实现,模拟用户的正常登录.要求如下: 通过 ...

  8. 简单模拟struts2及struts2的处理流程介绍

    用了几天模拟struts2,最后结果还是很成功的,也基本没有什么遇上比较难解决的问题,万事开头难,在最开始的时候无从下手,看着下面这张struts2工作流程图配合着网上的博客看了一天终于有了眉目. 看 ...

  9. [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection)

    [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection) 前言 在一些小型项目的开发情景里,系统不需要大型DI Framework所提供的:单一对象生成.生命周期 ...

随机推荐

  1. java中的模运算规则

    取模运算定义 如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = qd + r 且0 ≤ r < d.其中,q 被称为商,r 被称为余数. 运算实例 java模 ...

  2. Java 导出Excel xlsx、xls, CSV文件

    通用导出功能: 1.支持Excel xlsx.xls 2.支持CSV文件导出 3.数据库查询分页导出.内存导出 4.支持大批量数据导出 使用步骤如下 导入jar <dependency> ...

  3. 移动端上传图片(引入exif-js,图片被压缩为base64)

    <template> <div class="vue-box"> <img :src="imgUrl" alt="&qu ...

  4. 团队中的 Node.js 具体实践

    前天,我们公司前端团队的几个人一起去大搜车参加了芋头所组织的「搜车 Node Party」.这是我第一次参加与 Node.js 相关的线下聚会,如果不算「杭JS」的话. 聚会现场 这次聚会的主题全部是 ...

  5. HDU Problem D [ Humble number ]——基础DP丑数序列

    Problem D Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submi ...

  6. Linux 上搭建 Snort+BASE 入侵检测系统

    配置实验环境 由于本人电脑的存储空间不足,无法再承担安装一个虚拟机的开销,因此在阿里云上申请了一个云服务器进行本次实验.服务器配置如下: 1 核 - 2GB 内存 - 40GB 系统盘 操作系统:Ub ...

  7. Java 创建并应用PPT幻灯片母版

    幻灯片母版,可在幻灯片中预先存储设计模板信息,包括字形.占位符大小或位置.背景设计和配色方案等:对设定好的母版可应用于所有幻灯片,也可设计多个不同母版应用于不同幻灯片.下面通过Java代码示例介绍如何 ...

  8. (Lineup the Dominoes筛子)三维状压

    传送门 描述:\(一堆筛子,每个筛子两个面,上面有1-6之间的数字.后一个筛子与前一个筛子的接触面的点数必须相等.\) \(求,有多少种方案堆完筛子.(方案只关心筛子的位置,不关心是否翻转)\) \( ...

  9. B. Marvolo Gaunt's Ring 前缀后缀

    B. Marvolo Gaunt's Ring 这种一般只有三个的都可以处理前缀和后缀,再枚举中间这个值. 这个和之前写过的C. Four Segments 前缀后缀 处理方式很像. #include ...

  10. LTE基站开局流程脚本的具体含义

    1.全局参数配置MOD ENODEB(修改基站): ENODEBID=2015(基站标识2015), NAME="安职-1"(基站名称), ENBTYPE=DBS3900_LTE( ...