zoukankan      html  css  js  c++  java
  • [技巧篇]17.那些年一直再逃避的问题,还债Web阶段!

      四海行唐的一阶段和二阶段的时候,再使用数据的时候总是使用List<Map<String,Object>>的东西,但是胖先生一直不怎么喜欢!

      所以我再凌云17的Web阶段的时候,使用了从前端表单提交数据,直接再Servlet变成对象,后台从数据库查询的数据也直接编程对象,例如List<User> 形式

      我们没有自己去写ORM框架,而是再现有的开源的基础上来搞定,因为再Web阶段说ORM是一种比较扯的,风险比较大!


      一开始的时候,我们使用先使用实例化号对象,再通过 request.getParameter("表单的name对应的值"); 每个属性进行setter操作,并且还需要判断,重复的操作实在是浪费我们的学习生命。

      所以我使用了Apache提供的开源的工具BeanUtils,让我解决了这个问题


      从前台传递数据的  form 表单中name属性对应的值 实体Bean中的值 以及数据的字段,三者保持一致,这是我们的约定!

      并且使用了大家不太使用的 request.getParameterMap() ,搞定!

      形式如下 : 

    /**
    胖先生的核心代码
    **/
    //获取客户端的数据
    Map<String, String[]> map = request.getParameterMap();
    //对象实例化
    TestData testData = new TestData();
    //数据转换
    BeanUtils.populate(testData, map);

      当时有一些同学再这里遇到了问题,这里我们不考虑大数据类型!但是日期这类型就没有办法转换为java.util.Date类型,当时我让我的学生再实体Bean中改成了String类型,解决了这个问题,其实是偷懒的方式,当时没有过多的去研究,所以抱歉了!

      由于BeanUtils中中没有对日期类型的处理,我自己写了一个转换日期处理的类,模仿写的BeanUtils中的转换器写的

    package com.p5hui.utils;
    
    import java.text.ParseException;
    
    import org.apache.commons.beanutils.Converter;
    import org.apache.commons.lang3.time.DateUtils;
    
    public class DateConvert implements Converter {
        private String[] parsePatterns = {
            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", 
            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
    
        @SuppressWarnings("unchecked")
        @Override
        public <T> T convert(Class<T> arg0, Object arg1) {
             String p = (String)arg1;
                if(p== null || p.trim().length()==0){
                    return null;
                }   
                try{
                    return (T) DateUtils.parseDate(p, parsePatterns);
                }
                catch(Exception e){
                    try {
                        return (T) DateUtils.parseDate(p, parsePatterns);
                    } catch (ParseException ex) {
                        return null;
                    }
                }
                
            }
        }

      在这里我使用了import org.apache.commons.lang3.time.DateUtils;对日期格式化,但是这个时候就有一个问题,如果让转换器好使呢?百度了一下资料,可以继承BeanUtils之后,进行注册操作

    package com.p5hui.utils;
    
    import java.lang.reflect.InvocationTargetException;
    import java.util.Map;
    
    import org.apache.commons.beanutils.BeanUtils;
    import org.apache.commons.beanutils.ConvertUtils;
    
    public class BeanUtilEx extends BeanUtils {
    
        private BeanUtilEx() {
        }
    
        static {
            // 注册sql.date的转换器,即允许BeanUtils.copyProperties时的源目标的sql类型的值允许为空
            // ConvertUtils.register(new SqlDateConverter(), java.util.Date.class);
            // ConvertUtils.register(new SqlTimestampConverter(),
            // java.sql.Timestamp.class);
            // 注册util.date的转换器,即允许BeanUtils.copyProperties时的源目标的util类型的值允许为空
            // ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);
    
            ConvertUtils.register(new DateConvert(), java.util.Date.class);
        }
    
        public static void populate(Object target, Map source)
                throws InvocationTargetException, IllegalAccessException {
            
            org.apache.commons.beanutils.BeanUtils.populate(target, source);
        }
    }

    如何再Servlet当中使用呢?核心代码如下:

    public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            request.setCharacterEncoding("UTF-8");
            //request.getParameter("表单的name对应的值");
            
            Map<String, String[]> map = request.getParameterMap();
            
            TestData testData = new TestData();
            
            try {
                BeanUtilEx.populate(testData, map);
                //BeanUtilsBean.getInstance().populate(arg0, arg1);
                //BeanUtilsBean2.getInstance().populate(arg0, arg1);
                System.out.println(testData);
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            response.setContentType("text/html;charset=UTF-8");
       
        }

    jsp页面代码如下

      <form action="test01.shxt" method="post">
            整型:<input type="text" name="age"> <br/>  
            字符串:<input type="text" name="name"/><br/>   
            日期:<input type="text" name="create_date"> <br/>    
              金额:<input type="text" name="salary"> <br/>    
                长度:<input type="text" name="length"> <br/>   
                爱好:<input type="checkbox" name="hobbys"value="1"> <br/>    
                <input type="checkbox" name="hobbys" value="football"> <br/>     
            <button type="submit">提交</button>
        </form>

    TestData.java的实体Bean如下

    package com.p5hui.model;
    
    import java.util.Arrays;
    import java.util.Date;
    
    public class TestData {
        
        private Integer age;
        private String account;
        private Date create_date;
        private Float salary;
        private Long length; 
        private String[] hobbys; 
        public String[] getHobbys() {
            return hobbys;
        }
        public void setHobbys(String[] hobbys) {
            this.hobbys = hobbys;
        }
        public Long getLength() {
            return length;
        }
        public void setLength(Long length) {
            this.length = length;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        public String getAccount() {
            return account;
        }
        public void setAccount(String account) {
            this.account = account;
        }
        public Date getCreate_date() {
            return create_date;
        }
        public void setCreate_date(Date create_date) {
            this.create_date = create_date;
        }
        public Float getSalary() {
            return salary;
        }
        public void setSalary(Float salary) {
            this.salary = salary;
        }
        @Override
        public String toString() {
            return "TestData [age=" + age + ", account=" + account
                    + ", create_date=" + create_date + ", salary=" + salary
                    + ", length=" + length + ", hobbys=" + Arrays.toString(hobbys)
                    + "]";
        }
    
    }

    这个过程我还测试一下如何使用SQLite这里就不说了,这个不是重点

     胖先生 原创出品,必是精品!  

  • 相关阅读:
    使用comet架构实现了一个基于网页的视频监控prototype!!!!哇哈哈庆祝一下
    Pixysoft.Framework.Noebe.Datamining 数据挖掘开发实录
    论创业成功!让大家的青春充满着无限美好的回忆
    新年第一篇 数据库备份恢复系统上线的挫折
    .Net FrameWork 4.0中使用EF向数据库插入数据报datatime2类型错误的解决办法
    RoRoWoBlog 开源博客系统介绍
    第一次偶然出现的“System.Data.Entity.dll”类型的异常
    序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
    我也来说说Entity Frame Work 4中的数据库优先和代码优先两种方式(2)
    Asp.net MVC 2 + Castle + NHibernate 项目实战(1)
  • 原文地址:https://www.cnblogs.com/pangxiansheng/p/4840911.html
Copyright © 2011-2022 走看看