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. php静态变量的销毁

    什么都不说,先上代码: public function _childrenids($data,$cate_id,$clear=false) { static $arr = array(); if ($ ...

  2. c语言 字符串大小写转换

    https://www.programmingsimplified.com/c/program/c-program-change-case https://docs.microsoft.com/en- ...

  3. (c++ std) 查找 vector 中的元素

    You can use std::find from <algorithm>: std::find(vector.begin(), vector.end(), item) != vecto ...

  4. [Qt] 打开文件夹 Windows

    bool ok = QDesktopServices::openUrl(QUrl("c:/users/administrator/desktop/dir"));

  5. 从GC的SuppressFinalize方法带你深刻认识Finalize底层运行机制

    如果你经常看开源项目的源码,你会发现很多Dispose方法中都有这么一句代码: GC.SuppressFinalize(this); ,看过一两次可能无所谓,看多了就来了兴趣,这篇就跟大家聊一聊. 一 ...

  6. 怎么将swagger API导出为HTML或者PDF

    文章目录 将swagger API导出为HTML或者PDF 什么是Asciidoc swagger2markup-maven-plugin asciidoctor-maven-plugin 使用命令行 ...

  7. layui模块化加载Echarts图表v4.2.1

    layui.use(['jquery','echarts'], function () { var $ = layui.$; //记得这是dom对象不是JQ对象,需要转换 echarts = layu ...

  8. Spark学习笔记(一)

    概念: Spark是加州大学伯克利分校AMP实验室,开发的通用内存并行计算框架. 支持用scala.java和Python等语言编写应用程序.相较于Hdoop,往往有更好的运行效率. Spark包括了 ...

  9. JavaScript面向对象那些东西-继承

    继承 父类里有些属性方法 子类想把父类中的这些属性方法 继承过来给子类自己的实例也用用 ( ps: →_→ 能不能专业点 没文化真可怕 ) 一.原型链继承 // 原型链继承:把子类的原型作为父类的实例 ...

  10. Code force-CodeCraft-20 (Div. 2) D. Nash Matrix 详解(DFS构造)

    D. Nash Matrix time limit per test2 seconds memory limit per test256 megabytes inputstandard input o ...