四海行唐的一阶段和二阶段的时候,再使用数据的时候总是使用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这里就不说了,这个不是重点

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

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

  1. FastReport 使用技巧篇

    使用技巧篇 1.FastReport中如果访问报表中的对象?       可以使用FindObject方法.      TfrxMemoView(frxReport1.FindObject('memo ...

  2. 《手把手教你》系列技巧篇(六)-java+ selenium自动化测试-阅读selenium源码(详细教程)

    1.简介 前面几篇基础系列文章,足够你迈进了Selenium门槛,再不济你也至少知道如何写你第一个基于Java的Selenium自动化测试脚本.接下来宏哥介绍Selenium技巧篇,主要是介绍一些常用 ...

  3. 《手把手教你》系列技巧篇(十五)-java+ selenium自动化测试-元素定位大法之By xpath中卷(详细教程)

    1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath.xpath 的定位方法, 非常强大.  使用这种方法几乎可以定位到页面上的任意元素. ...

  4. 《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)

    1.简介 本文主要介绍两个在测试过程中可能会用到的功能:Actions类中的拖拽操作和Actions类中的划取字段操作.例如:需要在一堆log字符中随机划取一段文字,然后右键选择摘取功能. 2.拖拽操 ...

  5. 《手把手教你》系列技巧篇(二十五)-java+ selenium自动化测试-FluentWait(详细教程)

    1.简介 其实今天介绍也讲解的也是一种等待的方法,有些童鞋或者小伙伴们会问宏哥,这也是一种等待方法,为什么不在上一篇文章中竹筒倒豆子一股脑的全部说完,反而又在这里单独写了一篇.那是因为这个比较重要,所 ...

  6. 《手把手教你》系列技巧篇(四十二)-java+ selenium自动化测试 - 处理iframe -下篇(详解教程)

    1.简介 经过宏哥长时间的查找,终于找到了一个含有iframe的网页.所以今天这一篇的主要内容就是用这个网页的iframe,宏哥给小伙伴或者童鞋们演示一下,在处理过程中遇到的问题以及宏哥是如何解决的. ...

  7. 《手把手教你》系列技巧篇(四十四)-java+ selenium自动化测试-处理https 安全问题或者非信任站点-下篇(详解教程)

    1.简介   这一篇宏哥主要介绍webdriver在IE.Chrome和Firefox三个浏览器上处理不信任证书的情况,我们知道,有些网站打开是弹窗,SSL证书不可信任,但是你可以点击高级选项,继续打 ...

  8. 《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)

    1.简介 在使用appium写app自动化的时候介绍toast的相关元素的定位,在Web UI测试过程中,也经常遇到一些toast,那么这个toast我们这边如何进行测试呢?今天宏哥就分两篇介绍一下. ...

  9. 《手把手教你》系列技巧篇(四十六)-java+ selenium自动化测试-web页面定位toast-下篇(详解教程)

    1.简介 终于经过宏哥的不懈努力,偶然发现了一个toast的web页面,所以直接就用这个页面来夯实一下,上一篇学过的知识-处理toast元素. 2.安居客 事先声明啊,宏哥没有收他们的广告费啊,纯粹是 ...

随机推荐

  1. MyBatis 注解配置及动态SQL

      一.注解配置 目前MyBatis支持注解配置,用注解方式来替代映射文件,但是注解配置还是有点不完善,在开发中使用比较少,大部分的企业还是在用映射文件来进行配置.不完善的地方体现在于当数据表中的字段 ...

  2. 人脸识别 ArcFace Demo [Windows]

    Arcsoft ArcfaceDemo for Windows, VS2013 C++   使用虹软技术开发完成 使用步骤: 1.下载SDK包,32位Windows平台将五个SDK包里lib中的文件到 ...

  3. Solium代码测试框架

    Solium, 在solid中,Linter用于标识和修复样式&安全问题 //调用测试 solium -d contracts --fix 源代码名称:Solium 源代码网址:http:// ...

  4. jquery中的$(document).ready()、JavaScript中的window.onload()以及body中的onload()、DomContentLoaded()区别

    $().ready().$(handler).$(document).ready(handler)均不是原生JS中的,都是jQuery中封装的方法.这些事件在当页面的dom节点加载完毕后就执行,无需等 ...

  5. nginx配置和网站的部署

    环境: CentOS Linux release 7.3.1611 (Core) nginx version: nginx/1.13.4 PHP 5.4.16 (cli) (built: Nov 6 ...

  6. C++ STL victor

    一.介绍 vector是表示可变大小数组的序列容器. 就像数组一样,vector也采用的连续存储空间来存储元素.也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效.但是又不像数组,它 ...

  7. 视频播放截图及简要文字介绍——Thunder团队

    视频播放截图及简要文字介绍 图一:团队Logo ——从此我们有了自己的标志 图二:扫描本地书籍 ——可阅读本地的喜爱书籍 图三:在本地添加自己喜爱的图书 ——将自己喜爱的书籍加入书架,方便阅读 图四: ...

  8. hustoj题目标准xml格式

    具体格式可见google code. 分析了一下发现像<time_limit></time_limit><memory_limit></memory_limi ...

  9. iOS- 如何将非ARC的项目转换成ARC项目(实战)

    1.前言   因为公司有个国外餐饮系统,编程开发了3-4年,之前用的都是非ARC,开发到今年,第一批迭代开发的人员早已不见,目前发现了有许多的内存泄露之类的,系统没有自动释放该释放的内存.一旦app长 ...

  10. iOS- UITableViewCell对象是怎么重用的 ?

    iOS设备的内存有限,如果用UITableView显示成千上万条数据, 就需要成千上万个UITableViewCell对象的话, 那将会耗尽iOS设备的内存.要解决该问题,需要重用UITableVie ...