- 浏览: 234025 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
mhsjlove:
正则表达式的捕获组比这好用多了
高效率分离字符串到一个Map中 -
yk0025:
正在研究中。。。
Antx学习总结 -
asialee:
博主这块写的挺好的,我完全看了,不过我也写了一些关于编解码器的 ...
Netty源代码框架剖析( 二 ) -
he_wen:
不能够停止tomcat的话 kill -9 进程号 得到进程 ...
检查tomcat是否宕机 -
zhangyou1010:
catalina.sh stop 如果这个不能停止tomc ...
检查tomcat是否宕机
一、业务背景
web前端发送一系列数据给后台,这些数据包含字符串和字符串数组,现在的业务需求就是怎样动态的把这些数据动态映射到DAO的字段中,而dao中的字段有java的基本类型,数组类型还有集合类型,后台应该怎样处理?
封装带来的好处:HTTP传过来的字符串自动的映射到dao中相应字段的类型,其字段类型包括java基本类型、数组类型、集合类型
二、代码详解
这个是测试代码
package com.hewen.java.frame; /** * 测试类,因为httpRequest请求一般都是以字符串,或者是字符串数组传过来的 * @author Administrator * */ public class DTOTest { public static void main(String[] args) { MyRequest request = new MyRequest(); request.setParameter("id", "9527"); request.setParameter("name", "name9527"); request.setParameterValues("friendsIds", new String[]{"1", "2", "3", "4", "5"}); request.setParameterValues("memTimes", new String[]{"2000-01-02 03:04:05", "2012-06-07 08:09:10"}); //UserQueryDTO dto = new UserQueryDTO(); //dto.initFromRequest(request); //DTOUtil.initFromRequest(request, dto); UserQueryDTO dto = (UserQueryDTO) DTOUtil.initFromRequest(request, UserQueryDTO.class); System.out.println(dto); } }
把所有的httpRequest请求都放到Map中,这个类是MyRequest,实现了HttpServletRequest接口
package com.hewen.java.frame; import java.io.BufferedReader; /** * 这个是一个测试的request请求 * @author Administrator * */ public class MyRequest implements HttpServletRequest{ private Map<String, String> parameters = new HashMap<String, String>(); private Map<String, String[]> listParameters = new HashMap<String, String[]>(); //这个是设置键值对给request,key是String ,value-String public void setParameter(String key, String value){ parameters.put(key, value); } //这个是给request设置键值对,key-String,value-String[] public void setParameterValues(String key, String[] value){ listParameters.put(key, value); } // @Override //获取设置request的键值对value-String public String getParameter(String name) { return parameters.get(name); } //获取设置request的键值对value-String[] // @Override public String[] getParameterValues(String name) { return listParameters.get(name); } }
封装的DAO类
package com.hewen.java.frame; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.List; //public class UserQueryDTO extends BaseDTO{ public class UserQueryDTO { private long id; private String name; private long[] friendsIds; private List<Timestamp> memTimes; public List<Timestamp> getMemTimes() { return memTimes; } public void setMemTimes(List<Timestamp> memTimes) { this.memTimes = memTimes; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long[] getFriendsIds() { return friendsIds; } public void setFriendsIds(long[] friendsIds) { this.friendsIds = friendsIds; } public String toString(){ StringBuilder sb = new StringBuilder(); sb.append("id:" + id).append("\nname:").append(name); sb.append("\nfriendsIds:["); for(long fid: friendsIds){ sb.append(fid).append(" "); } sb.deleteCharAt(sb.length() - 1); sb.append("]"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sb.append("\nmemTimes:["); for(Timestamp mem: memTimes){ sb.append(sdf.format(mem)).append(" "); } sb.deleteCharAt(sb.length() - 1); sb.append("]"); return sb.toString(); } }
后台是怎么样把请求的值映射到封装的dao类中,这个类是DTOUtil,用了反射机制
package com.hewen.java.frame; import java.lang.reflect.Method; import java.sql.Date; import java.sql.Time; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Vector; import javax.servlet.http.HttpServletRequest; public class DTOUtil { private static final String SETFLAG = "set"; private static final int ARRAY_TYPE_VECTOR =1;//dao类中字段的集合是Vector,List,ArrayList private static final int ARRAY_TYPE_LIST = 2; private static final int ARRAY_TYPE_ARRAYLIST = 3; /** * 为request请求初始数据至dao * @param request Http请求 * @param dto Http请求所有数据,映射到相应的Dao类中 * @return */ public static Object initFromRequest(HttpServletRequest request, Object dto){ Method []methods = dto.getClass().getMethods();//得到dao中所有的方法 for(Method method: methods){ //因为要对dao中各个字段进行映射,所以要过滤掉get开头的方法, //只需要判断带有set开头的方法 if(method.getName().startsWith(SETFLAG)){ /* * 得到set开头方法字符串对应的字段值,如setName,转变后name */ String fieldName = method.getName().substring(SETFLAG.length()); fieldName = fieldName.replaceFirst(fieldName.substring(0, 1), fieldName.substring(0, 1).toLowerCase()); if(isArrayField(method)){//判断dao映射的字段是否是数组字段或者是集合类型 String[] fieldValue = request.getParameterValues(fieldName); //System.out.println("==initFromRequest==fieldName:" + fieldName + "\tfieldValue:" + fieldValue); //检查得到的request的值是否是数组类型 if(fieldValue == null || !checkArrayField(fieldValue)){ System.err.println("null value when initFromRequest,fieldName:" + fieldName + " fieldValue:" + fieldValue); continue; } //把request所传过来的数组值映射到dao字段 initArrayField(dto, method, fieldValue); }else{ String fieldValue = request.getParameter(fieldName); //System.out.println("==initFromRequest==fieldName:" + fieldName + "\tfieldValue:" + fieldValue); if(fieldValue == null){ System.err.println("null value when initFromRequest,fieldName:" + fieldName + " fieldValue:" + fieldValue); continue; } initField(dto, method, fieldValue); } } } return dto; } public static Object initFromRequest(HttpServletRequest request, Class<?> dtoClass){ Object dto; try { dto = dtoClass.newInstance(); } catch (Exception e) { throw new RuntimeException("exception when newInstance:" + dtoClass.getName()); } initFromRequest(request, dto); return dto; } //检查得到的request的值是否是数组类型 private static boolean checkArrayField(String[] fieldValue){ if(fieldValue.length == 1 && fieldValue[0].trim().length() == 0){ return false; } return true; } //初始化非数组类型 private static void initField(Object o, Method method, String fieldValue){ Class<?> pType = method.getParameterTypes()[0]; try { if(pType.equals(int.class) || pType.equals(Integer.class)){ method.invoke(o, Integer.parseInt(fieldValue)); }else if(pType.equals(float.class) || pType.equals(Float.class)){ method.invoke(o, Float.parseFloat(fieldValue)); }else if(pType.equals(double.class) || pType.equals(Double.class)){ method.invoke(o, Double.parseDouble(fieldValue)); }else if(pType.equals(long.class) || pType.equals(Long.class)){ method.invoke(o, Long.parseLong(fieldValue)); }else if(pType.equals(String.class)){ method.invoke(o, fieldValue); }else if(pType.equals(Timestamp.class)){ method.invoke(o, Timestamp.valueOf(fieldValue)); }else if(pType.equals(Date.class)){ method.invoke(o, Date.valueOf(fieldValue)); }else if(pType.equals(Time.class)){ method.invoke(o, Time.valueOf(fieldValue)); }else{ throw new RuntimeException("unsupport type exception when initField, method is:" + method.getName()); } }catch(Exception e){ //e.printStackTrace(); System.err.println("exception when initFromRequest,method is:" + method.getName() + " fieldValue:" + fieldValue); } } /** * 判断dao映射的字段是否是数组字段或者是集合类型 * @param m 该字段对应的set方法 * @return */ private static boolean isArrayField(Method m){ if(m.getParameterTypes().length < 1){ return false; } //得到该字段对应的set方法参数类型 Class<?> p0 = m.getParameterTypes()[0]; //判断set方法对应的参数类型是数组或者是集合类型 return p0.isArray() || Collection.class.isAssignableFrom(p0); } /** * 把request所传过来的值映射到dao字段 * @param obj 需要映射的dao对象 * @param m dao字段对应的set方法如:setName(String name) * @param fieldValue request请求所得到的值,要映射到dao字段里 */ private static void initArrayField(Object obj, Method m, String[] fieldValue){ Class<?> p0 = m.getParameterTypes()[0]; try { if(p0.isArray()){ //p0.getComponentType()返回数组类型中包含哪个基本类型 m.invoke(obj, getArray(p0.getComponentType(), fieldValue)); }else if(Collection.class.isAssignableFrom(p0)){ //因为dao中set方法参数中有List、vector,ArrayList,故需知道集合里面中包含的是什么数据基本类型 //ArrayList.class.isAssignableFrom(p0)判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同, //或是否是其超类或超接口。如果是则返回 true;否则返回 false。 // 如果该 Class 表示一个基本类型,且指定的 Class 参数正是该 Class 对象, //则该方法返回 true;否则返回 false。 String innerType = getInnerType(m.getGenericParameterTypes()[0].toString()); if(Vector.class.isAssignableFrom(p0)){ m.invoke(obj, getArray(innerType, fieldValue, ARRAY_TYPE_VECTOR)); }else if(ArrayList.class.isAssignableFrom(p0)){ m.invoke(obj, getArray(innerType, fieldValue, ARRAY_TYPE_ARRAYLIST)); }else if(List.class.isAssignableFrom(p0)){ m.invoke(obj, getArray(innerType, fieldValue, ARRAY_TYPE_LIST)); } } } catch (Exception e) { throw new RuntimeException("exception when init arrayField, method is:" + m.getName()); } } /*** * * @param componentType 数组是哪个基本类型 * @param fieldValue request请求的数据值 * @return 请求的数据值转换成数组中 */ private static Object getArray(Class<?> componentType, String[] fieldValue){ int i; if(componentType.equals(int.class) || componentType.equals(Integer.class)){ int []a = new int[fieldValue.length]; for(i = 0; i < fieldValue.length; i++){ a[i] = Integer.parseInt(fieldValue[i]); } return a; }else if(componentType.equals(short.class) || componentType.equals(Short.class)){ short []a = new short[fieldValue.length]; for(i = 0; i < fieldValue.length; i++){ a[i] = Short.parseShort(fieldValue[i]); } return a; }else if(componentType.equals(float.class) || componentType.equals(Float.class)){ float []a = new float[fieldValue.length]; for(i = 0; i < fieldValue.length; i++){ a[i] = Float.parseFloat(fieldValue[i]); } return a; }else if(componentType.equals(double.class) || componentType.equals(Double.class)){ double []a = new double[fieldValue.length]; for(i = 0; i < fieldValue.length; i++){ a[i] = Double.parseDouble(fieldValue[i]); } return a; }else if(componentType.equals(long.class) || componentType.equals(Long.class)){ long []a = new long[fieldValue.length]; for(i = 0; i < fieldValue.length; i++){ a[i] = Long.parseLong(fieldValue[i]); } return a; }else if(componentType.equals(String.class)){ String []a = new String[fieldValue.length]; for(i = 0; i < fieldValue.length; i++){ a[i] = fieldValue[i]; } return a; }else if(componentType.equals(Timestamp.class)){ Timestamp []a = new Timestamp[fieldValue.length]; for(i = 0; i < fieldValue.length; i++){ a[i] = Timestamp.valueOf(fieldValue[i]); } return a; }else if(componentType.equals(Date.class)){ Date []a = new Date[fieldValue.length]; for(i = 0; i < fieldValue.length; i++){ a[i] = Date.valueOf(fieldValue[i]); } return a; }else if(componentType.equals(Time.class)){ Time []a = new Time[fieldValue.length]; for(i = 0; i < fieldValue.length; i++){ a[i] = Time.valueOf(fieldValue[i]); } return a; }else{ throw new RuntimeException("unsupport type exception when get array, type:" + componentType); } } /*** * 初始化集合类型数据包含Vector=ARRAY_TYPE_VECTOR=1, * ARRAY_TYPE_ARRAYLIST=ArrayList=3 * ARRAY_TYPE_LIST=List=2 * @param innerType 集合类型包含的基本数据类型 * @param fieldValue request请求的数据值 * @param arrayType 是集合类型的哪个类型 * @return 请求的数据方法集合类中 */ private static Object getArray(String innerType, String[] fieldValue, int arrayType){ /** * 判断集合里面是哪种类型如: * "java.sql.Time","java.sql.Date","java.sql.Timestamp","java.lang.String", * "java.lang.Double","java.lang.Long","java.lang.Float","java.lang.Integer","java.lang.Short" * 然后把fieldValue值添加到指定的集合(arrayType)中 */ if(innerType == null){ // default type: String List<String> l; if(arrayType == ARRAY_TYPE_VECTOR){ l = new Vector<String>(); }else{ l = new ArrayList<String>(); } for(String value: fieldValue){ l.add(value); } return l; }else if(innerType.equals("java.lang.Short")){ List<Short> l; if(arrayType == ARRAY_TYPE_VECTOR){ l = new Vector<Short>(); }else{ l = new ArrayList<Short>(); } for(String value: fieldValue){ l.add(Short.parseShort(value)); } return l; }else if(innerType.equals("java.lang.Integer")){ List<Integer> l; if(arrayType == ARRAY_TYPE_VECTOR){ l = new Vector<Integer>(); }else{ l = new ArrayList<Integer>(); } for(String value: fieldValue){ l.add(Integer.parseInt(value)); } return l; }else if(innerType.equals("java.lang.Float")){ List<Float> l; if(arrayType == ARRAY_TYPE_VECTOR){ l = new Vector<Float>(); }else{ l = new ArrayList<Float>(); } for(String value: fieldValue){ l.add(Float.parseFloat(value)); } return l; }else if(innerType.equals("java.lang.Double")){ List<Double> l; if(arrayType == ARRAY_TYPE_VECTOR){ l = new Vector<Double>(); }else{ l = new ArrayList<Double>(); } for(String value: fieldValue){ l.add(Double.parseDouble(value)); } return l; }else if(innerType.equals("java.lang.Long")){ List<Long> l; if(arrayType == ARRAY_TYPE_VECTOR){ l = new Vector<Long>(); }else{ l = new ArrayList<Long>(); } for(String value: fieldValue){ l.add(Long.parseLong(value)); } return l; }else if(innerType.equals("java.lang.String")){ List<String> l; if(arrayType == ARRAY_TYPE_VECTOR){ l = new Vector<String>(); }else{ l = new ArrayList<String>(); } for(String value: fieldValue){ l.add(value); } return l; }else if(innerType.equals("java.sql.Timestamp")){ List<Timestamp> l; if(arrayType == ARRAY_TYPE_VECTOR){ l = new Vector<Timestamp>(); }else{ l = new ArrayList<Timestamp>(); } for(String value: fieldValue){ l.add(Timestamp.valueOf(value)); } return l; }else if(innerType.equals("java.sql.Date")){ List<Date> l; if(arrayType == ARRAY_TYPE_VECTOR){ l = new Vector<Date>(); }else{ l = new ArrayList<Date>(); } for(String value: fieldValue){ l.add(Date.valueOf(value)); } return l; }else if(innerType.equals("java.sql.Time")){ List<Time> l; if(arrayType == ARRAY_TYPE_VECTOR){ l = new Vector<Time>(); }else{ l = new ArrayList<Time>(); } for(String value: fieldValue){ l.add(Time.valueOf(value)); } return l; }else{ throw new RuntimeException("unsupport type exception when get list, type:" + innerType); } } /** * 获取List、Vector,ArrayList中包含的具体类型, * 如gp="java.util.List<java.sql.Timestamp>",装换成"java.sql.Timestamp" * @param gp * @return */ private static String getInnerType(String gp){ int startIndex = gp.indexOf("<"); int endIndex = gp.indexOf(">"); if(startIndex == -1 || endIndex == -1 || startIndex >= endIndex){ return null; } return gp.substring(startIndex + 1, endIndex); } }
id:9527 name:name9527 friendsIds:[1 2 3 4 5] memTimes:[2000-01-02 03:04:05 2012-06-07 08:09:10]
- JavaFrame.rar (16 KB)
- 描述: 源代码
- 下载次数: 15
发表评论
-
Netty源代码框架剖析( 三 )
2011-04-06 14:35 2599本篇文章主要是为了想研究Netty打基础 一、http ... -
Netty源代码框架剖析( 二 )
2011-04-06 11:28 2862主要想介绍一下一般想研究开源软件的框架,源代码是如何下 ... -
Netty源代码框架剖析( 一 )
2011-04-06 11:14 1951一、前言 研究Netty源代码已经有了半个月左右,我想 ... -
从数据库得到的结果集存放到List集合中
2010-09-08 21:01 52372一、业务阐述 在开发中查询的数据库结果集,既要连接数据库 ... -
连接jdbc时sql语句统一设置参数
2010-09-07 16:37 13015各位网友java代码里面的注释怎么不变颜色,具体方法怎么操作, ...
相关推荐
数据库表映射类,DAO层向上传输数据使用 DTO Data Transfer Object 数据传输对象,Service层向上传输数据使用 BO Business Object 业务对象,Service输出的封装业务逻辑对象 AO Application Object 应用对象,Web层...
答:在Struts2里面是将每次页面的请求进行处理,然后将请求需要输出的数据转发到需要做数据显示的页面。Struts2只是起到一个数据接收和转接的功能,就是Controller控制器,而传来数据的页面叫view显示层,Struts2将...
//将提交的上传文件保存到数据表中 4. List getAllFile();//得到T_FILE所示记录 5. void write(OutputStream os,String fileId);//将某个文件的文件数据写出到输出流中 6. String getFileName(String fileId);//获取...
项目基于MVC架构模式。显示层要采用javascipt和JQuery 1.3.2.js+Ajax技术进行数据的保存和显示信息。例如AJAX异步请求;...使javabean和关系数据库映射,利用hibernate封装成Dao实现对数据库的操作。
一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的 Validate()验证后选择将请求发送到哪个...
从数据库元数据访问,到建表,创建约束,创建sequence等各种DDL操作进行了封装,用户无需编写各种SQL,可以直接通过API操作数据库结构。 尤其是ALTER TABLE等修改数据库的语句,各种不同的RDBMS都有较大语法差异。...
在数据库处理方面,不需要在数据层借助存储过程及数据库服务器端函数封装过多的业务逻辑,因此数据库系统采用相对精巧的MySQL[6]。 该在线博客系统服务器端如果需要布置到其他主机上,则该主机必备条件如下: 1. ...
* 定义需求:部门信息的页面数据要插入到数据库中 * 定义表 CREATE TABLE `sys_user_group` ( `id` INTEGER(11) NOT NULL AUTO_INCREMENT, #编号 `remark` TEXT, #备注 `name` VARCHAR(100) ...
4、sqlmapconfig.xml中传入参数和result的设置,只需要将得到的值result映射到有此属性的类对象. 5、JSP/Servlet中获得当前应用的相对路径和绝对路径 JSP中获得当前应用的相对路径和绝对路径 根目录所对应的绝对...
Hibernate是一个优秀的开放源代码的对象关系映射(O/R Mapping)框架,它对JDBC进行了非常轻量级的对象封装,提供了强大高性能的对象到关系数据库的持久化服务,使程序员可使用面向对象思维来操纵数据库。...
Hibernate是一个优秀的开放源代码的对象关系映射(O/R Mapping)框架,它对JDBC进行了非常轻量级的对象封装,提供了强大高性能的对象到关系数据库的持久化服务,使程序员可使用面向对象思维来操纵数据库。...
Hibernate是一个优秀的开放源代码的对象关系映射(O/R Mapping)框架,它对JDBC进行了非常轻量级的对象封装,提供了强大高性能的对象到关系数据库的持久化服务,使程序员可使用面向对象思维来操纵数据库。...
它是居于Spring容器之上,封装了DAO(含Hibernate和MongoDB)操作、多模块统一管理、统一配置管理、统一日志管理等优雅的工程管理开发模型,并提供大量工具包、Json操作、分页辅助工具。 开发工具在软件开发生命...
处理框架的核心逻辑,主要接管请求关系映射,实现了对物理资源的隐式访问,并提供了黑名单机制以便开发者屏蔽关键资源,提供了表单验证组件 XForm 以及 Convertor 简化了以往表单填充、验证等重复操作。 如果您对...
ado,dao,odbc数据库连接vc代码 演示了不同的数据库的各种操作(连接、删除、添加……等等) ATL开发指南源码 内部包含了atl控件的开发以及如何应用,演示了COM的包容与集合、自动化、事件和连接点、枚举器和集合...
1、struts2对servlet封装(request,response) ,资源调配和资源的映射 2、框架设计的思想 istruts 配置,过滤器,反射 istruts.properties 3、starts2的使用思路 1、jar 2、配置文件 3、常用类 ...
导入数据-dao.avi │ 13.索引库导入数据-完成.avi │ 淘淘商城第七天笔记.doc │ ├─08.第八天 │ 14.搜索服务切换到集群.avi │ 01.课程计划.avi │ 02.课程计划.avi │ 03.搜索服务-分析.avi │ 04.搜索服务-dao...
ado,dao,odbc数据库连接vc代码 演示了不同的数据库的各种操作(连接、删除、添加……等等) ATL开发指南源码 内部包含了atl控件的开发以及如何应用,演示了COM的包容与集合、自动化、事件和连接点、枚举器和集合...
ado,dao,odbc数据库连接vc代码 演示了不同的数据库的各种操作(连接、删除、添加……等等) ATL开发指南源码 内部包含了atl控件的开发以及如何应用,演示了COM的包容与集合、自动化、事件和连接点、枚举器和集合...