动手开发自己的mvc-2----完善控制层,提供自动注入和注解上传等功能
来源:互联网 发布:win10 centos 双系统 编辑:程序博客网 时间:2024/05/21 06:43
当表单提交的内容过多 ,让懒惰的程序员一个个getParameter()是很让人抓狂的,所以自动注入表单域是mvc不可或缺的功能,另外,文件上传也是一个特殊的表单域,你想看到程序员发觉上传只需要注入就能完成功能时的那种欣喜吗 ? 我们一起做做看。
我们依然从最简单的开始做,慢慢的润色。
注入表单的思路比较简单:
1,在form里面的name需要设置成诸如userinfo.username这类的,userinfo表示注入的目标对象,username表示userinfo对象的属性。这个对象必须是Action里面声明的
2,MainServlet在接收表单时,从getParameterMap()得到所有表单域,拆分出目标对象和属性,通过反射执行set方法
注意:由于每个请求都会产生一个Action的新实例,所以在Action类的属性不会被多个请求共享,是线程安全的。
实现方式如下:
1,打开MainServlet,首先声明
handField方法用来处理注入功能。
方法体和详细注释如下:
我们依然从最简单的开始做,慢慢的润色。
注入表单的思路比较简单:
1,在form里面的name需要设置成诸如userinfo.username这类的,userinfo表示注入的目标对象,username表示userinfo对象的属性。这个对象必须是Action里面声明的
2,MainServlet在接收表单时,从getParameterMap()得到所有表单域,拆分出目标对象和属性,通过反射执行set方法
注意:由于每个请求都会产生一个Action的新实例,所以在Action类的属性不会被多个请求共享,是线程安全的。
实现方式如下:
1,打开MainServlet,首先声明
- Map<String,Object[]> paramMap = request.getParameterMap();
- //此map对象用来缓存单页面的目标注入对象,比如此页面有多个Userinfo的属性需要注入,不可能每次注入都要生成Userinfo对象,肯定得在同一个对象中注入(小细节)
- Map<String, Object> fieldMap = new HashMap<String, Object>();
- 得到请求信息后进行迭代
- Set<Entry<String,Object[]>> paramSet = paramMap.entrySet();
- for (Entry<String,Object[]> ent : paramSet) {
- String paramName = (String) ent.getKey();
- Object[] paramValue = ent.getValue();
- handField(fieldMap,paramName,paramValue,action);
- }
Map<String,Object[]> paramMap = request.getParameterMap();//此map对象用来缓存单页面的目标注入对象,比如此页面有多个Userinfo的属性需要注入,不可能每次注入都要生成Userinfo对象,肯定得在同一个对象中注入(小细节)Map<String, Object> fieldMap = new HashMap<String, Object>();得到请求信息后进行迭代Set<Entry<String,Object[]>> paramSet = paramMap.entrySet();for (Entry<String,Object[]> ent : paramSet) { String paramName = (String) ent.getKey(); Object[] paramValue = ent.getValue(); handField(fieldMap,paramName,paramValue,action);}
handField方法用来处理注入功能。
方法体和详细注释如下:
- //.这个字符是不能直接用正则的,需要转义
- String[] paramVos = paramName.split("\\.");
- //这里只支持 对象.属性的表单注入,对于多级的大家可以自行实现,相信不是难事儿。
- if (paramVos. length == 2) {
- Class actionClass = action.getClass();
- Object fieldObj = fieldMap.get(paramVos[0]);
- //从你的action得到目标注入对象
- Field field = actionClass.getDeclaredField(paramVos[0]);;
- if (fieldObj == null) {
- //假如是第一次注入,为空,则实例化目标对象
- Class fieldClass = field.getType();
- fieldObj = fieldClass.newInstance();
- //放入缓存,第二次直接从缓存取,保证同一个form注入的是同一个对象
- fieldMap.put(paramVos[0], fieldObj);
- }
- //构造目标属性的set方法
- String setMethod = "set"
- + paramVos[1].substring(0, 1).toUpperCase()
- + paramVos[1].substring(1);
- Field fieldField = null;
- fieldField = fieldObj.getClass().getDeclaredField(
- paramVos[1]);
- if(realValue!= null){
- InvocakeHelp. invokeMethod(fieldObj, setMethod,
- new Object[] { paramValue });
- }
- }
//.这个字符是不能直接用正则的,需要转义 String[] paramVos = paramName.split("\\."); //这里只支持 对象.属性的表单注入,对于多级的大家可以自行实现,相信不是难事儿。 if (paramVos. length == 2) { Class actionClass = action.getClass(); Object fieldObj = fieldMap.get(paramVos[0]); //从你的action得到目标注入对象 Field field = actionClass.getDeclaredField(paramVos[0]);; if (fieldObj == null) { //假如是第一次注入,为空,则实例化目标对象 Class fieldClass = field.getType(); fieldObj = fieldClass.newInstance(); //放入缓存,第二次直接从缓存取,保证同一个form注入的是同一个对象 fieldMap.put(paramVos[0], fieldObj); } //构造目标属性的set方法 String setMethod = "set" + paramVos[1].substring(0, 1).toUpperCase() + paramVos[1].substring(1); Field fieldField = null; fieldField = fieldObj.getClass().getDeclaredField( paramVos[1]); if(realValue!= null){ InvocakeHelp. invokeMethod(fieldObj, setMethod, new Object[] { paramValue }); } }
- 动手开发自己的mvc-2----完善控制层,提供自动注入和注解上传等功能
- 动手开发自己的mvc-1----实现初步的控制层,实现各种配置和资源获取
- 构建自己的Linux 之三 初步完善(提供网络功能等)
- 我的两个自动注入@Autowired,在控制层和服务层
- 在网上找到的一个附件上传功能,自己完善了一下,记录防止忘记
- 动手写Jquery之--自动关闭的层
- Spring MVC和shiro整合时自动注入的问题
- Android开发:相册读取、拍照、图片裁剪和图片上传服务器等功能的实现
- Spring Bean自动装配和注解注入
- spring自动注入和注解配置
- spring mvc控制层(非注解方式)
- Spring MVC学习---JSON转换功能(启动Spring MVC的注解功能,完成请求和注解POJO的映射)
- Spring MVC实现文件的上传和下载的功能
- 16.3 媒体播放器——完善退出和音量控制功能
- 从零开始搭建一个完善的MVP开发框架(四) —对View(Activity,Fragment等)层组件进行封装简化View层的开发
- 方便的自动Spring注解注入
- MVC中V和C的区分识别_控制层与显示层的剥离
- 控制层用的注解问题
- java中增强型for循环之解谜
- bit 1012 poj 1887 hdu 1275
- Java线程:并发协作-生产者消费者模型
- Unclosed group near index
- CControlBar::GetDockingFrame的一点问题
- 动手开发自己的mvc-2----完善控制层,提供自动注入和注解上传等功能
- 软件开发人员的内功修炼之道
- 动手开发自己的mvc-1----实现初步的控制层,实现各种配置和资源获取
- Static class
- OCJP(1Z0-851) 模拟题分析(八)
- Java静态对象和非静态对象有什么区别??
- java_volatitle关键字
- Java静态对象和非静态对象有什么区别??
- 千年创业潜规则——人际关系与利益分配