[技巧篇]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这里就不说了,这个不是重点

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

时间: 2024-11-07 14:42:44

[技巧篇]17.那些年一直再逃避的问题,还债Web阶段!的相关文章

FastReport 使用技巧篇

FastReport 使用技巧篇 使用技巧篇 1.FastReport中如果访问报表中的对象? 可以使用FindObject方法. TfrxMemoView(frxReport1.FindObject('memo1')).Text:='FastReport'; 2.FastReport中如何使用上下标? 设置frxmemoview.AllowHTMLTags:= True;在Text输入如下 上标:mm<sup>2</sup> 下表:k<sub>6</sub>

2天驾驭DIV+CSS (技巧篇)(转)

这是去年看到的一片文章,感觉在我的学习中,有不少的影响.于是把它分享给想很快了解css的兄弟们.本文是技巧篇. 基础篇[知识一] “DIV+CSS” 的叫法是不准确的[知识二] “DIV+CSS” 将你引入两大误区[知识三] 什么是W3C标准?[基础一] CSS如何控制页面[基础二] CSS选择器[基础三] CSS选择器命名及常用命名[基础四] 盒子模型[基础五] 块状元素和内联元素 实战篇[第一课] 实战小热身[第二课] 浮动[第三课] 清除浮动[第四课] 导航条(上) | 导航条(下)[大练

移动前端工作的那些事---前端制作之微信小技巧篇

移动前端工作的那些事---前端制作之微信小技巧篇_WebApp赵海洋_新浪博客 移动前端工作的那些事---前端制作之微信小技巧篇 (2013-11-15 15:20:47) 转载▼移动前端工作的那些事---前端制作之微信小技巧篇,布布扣,bubuko.com

2000条你应知的WPF小姿势 基础篇&lt;1-7&gt;

在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,000 Things You Should Know About WPF .听到博客名字就懂这个人有多伟大了吧.他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识.Follow他的博客也有一段日子了,很希望能够分享给大家. 本系列我不仅会翻译

Visual Studio调试之断点技巧篇补遗

原文链接地址:http://blog.csdn.net/Donjuan/article/details/4649372 讲完Visual Studio调试之断点技巧篇以后,翻翻以前看得一些资料和自己写的一些文章,发现还有几个关于中断程序的技巧在前面的文章里面遗漏了,决定还是在这里总结一下.当然啦,如果你知道这些技巧,忽略这篇文章好了,:) 在程序启动的时候将调试器附加上去 可能有人会对这个问题有一些争议,因为大部分情况下我们只需要在调试器(Debugger)里面直接启动被调试程序(Debugge

经济--理财--银行理财技巧篇

银行理财技巧篇 避开银保产品 银行卖的产品,有银行自己发行的产品,还有合作类的产品(银信(与信托公司合作),银保(与保险公司合作),银证信(与证卷.信托合作)) 合作类的产品,银行只是个超市.银保类产品投诉很高哦.买了银保产品,1.有15天犹豫期.2.12378来进行投诉. 期限搭配,让”钱“变活 有没有办法提高流动性呢? 将大额资金拆分成几分,分别购买. 12单法.60单法 上海车牌   7   8 万. 这样做,以后每个月都有一笔7W的资金到期. 巧选时点,收益大增 什么时候买最划算呢? 在

来篇文章:ASP。NET程序中动态修改web.config中的设置项目 (后台CS代码)

朋友们可以自行测试,我这里都没有问题了,鳖了一上午的问题总算解决了 using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; usi

XSS的原理分析与解剖:第三章(技巧篇)**************未看*****************

??0×01 前言: 关于前两节url: 第一章:http://www.freebuf.com/articles/web/40520.html 第二章:http://www.freebuf.com/articles/web/42727.html 说的xss的原理及不同环境的构造方法.和XSS的分类及挖掘方法.那么本期则说XSS技巧,前面两个干货不太多,讲的都是比较基础的.而这期则是满满的干货. 从本期开始,XSS我就开始深入了.至 于下一章XSS编码,已经被0xExploit写过了( http:

【Unity技巧】开发技巧(技巧篇)

写在前面 和备忘录篇一样,这篇文章旨在总结Unity开发中的一些设计技巧,当然这里只是我通过所见所闻总结的东西,如果有不对之处欢迎指出. 技巧1:把全局常量放到一个单独的脚本中 很多时候我们需要一些常量,例如是否输出Log,正式服务器和测试服务器的IP等等,我们可以把这些常量写在同一个脚本里,并设置属性为public static,然后在其他脚本里直接访问该变量即可.当代码量越来越大时,你会发现这样会减少很多查找常量的时间.而且,这样更改时也非常方便,例如当需要发布新版本时,你只要把该脚本中的l