[技巧篇]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这里就不说了,这个不是重点
胖先生 原创出品,必是精品!
[技巧篇]17.那些年一直再逃避的问题,还债Web阶段!的更多相关文章
- FastReport 使用技巧篇
使用技巧篇 1.FastReport中如果访问报表中的对象? 可以使用FindObject方法. TfrxMemoView(frxReport1.FindObject('memo ...
- 《手把手教你》系列技巧篇(六)-java+ selenium自动化测试-阅读selenium源码(详细教程)
1.简介 前面几篇基础系列文章,足够你迈进了Selenium门槛,再不济你也至少知道如何写你第一个基于Java的Selenium自动化测试脚本.接下来宏哥介绍Selenium技巧篇,主要是介绍一些常用 ...
- 《手把手教你》系列技巧篇(十五)-java+ selenium自动化测试-元素定位大法之By xpath中卷(详细教程)
1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath.xpath 的定位方法, 非常强大. 使用这种方法几乎可以定位到页面上的任意元素. ...
- 《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)
1.简介 本文主要介绍两个在测试过程中可能会用到的功能:Actions类中的拖拽操作和Actions类中的划取字段操作.例如:需要在一堆log字符中随机划取一段文字,然后右键选择摘取功能. 2.拖拽操 ...
- 《手把手教你》系列技巧篇(二十五)-java+ selenium自动化测试-FluentWait(详细教程)
1.简介 其实今天介绍也讲解的也是一种等待的方法,有些童鞋或者小伙伴们会问宏哥,这也是一种等待方法,为什么不在上一篇文章中竹筒倒豆子一股脑的全部说完,反而又在这里单独写了一篇.那是因为这个比较重要,所 ...
- 《手把手教你》系列技巧篇(四十二)-java+ selenium自动化测试 - 处理iframe -下篇(详解教程)
1.简介 经过宏哥长时间的查找,终于找到了一个含有iframe的网页.所以今天这一篇的主要内容就是用这个网页的iframe,宏哥给小伙伴或者童鞋们演示一下,在处理过程中遇到的问题以及宏哥是如何解决的. ...
- 《手把手教你》系列技巧篇(四十四)-java+ selenium自动化测试-处理https 安全问题或者非信任站点-下篇(详解教程)
1.简介 这一篇宏哥主要介绍webdriver在IE.Chrome和Firefox三个浏览器上处理不信任证书的情况,我们知道,有些网站打开是弹窗,SSL证书不可信任,但是你可以点击高级选项,继续打 ...
- 《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)
1.简介 在使用appium写app自动化的时候介绍toast的相关元素的定位,在Web UI测试过程中,也经常遇到一些toast,那么这个toast我们这边如何进行测试呢?今天宏哥就分两篇介绍一下. ...
- 《手把手教你》系列技巧篇(四十六)-java+ selenium自动化测试-web页面定位toast-下篇(详解教程)
1.简介 终于经过宏哥的不懈努力,偶然发现了一个toast的web页面,所以直接就用这个页面来夯实一下,上一篇学过的知识-处理toast元素. 2.安居客 事先声明啊,宏哥没有收他们的广告费啊,纯粹是 ...
随机推荐
- python常用命令—‘\r’
# \r 默认表示将输出的内容返回到第一个指针,这样的话,后面的内容会覆盖前面的内容 如常用的显示程序完成进度!!
- 棋盘问题:dfs
Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...
- js实现滑动器效果
最近公司在做一个项目,页面中要用到滑动器效果,我的第一反应是使用HTML5 input类型中的range类型,但马上我就否定了这个想法,因为range类型存在浏览器的兼容性问题(在主流浏览器中).但又 ...
- Thunder团队第二周 - Scrum会议7
Scrum会议7 小组名称:Thunder 项目名称:i阅app Scrum Master:杨梓瑞 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传 ...
- spring 国际化i18n配置
i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称.在资讯领域,国际化(i18n)指让产品(出版物,软件,硬件等)无需做大的改 ...
- Spring学习(三)—— 自动装配案例分析
Spring_Autowiring collaborators 在Spring3.2.2中自动装配类型,分别为:no(default)(不采用自动装配).byName,byType,construct ...
- <Effective C++>读书摘要--Designs and Declarations<一>
<Item 18> Make interfaces easy to use correctly and hard to use incorrectly 1.That being the c ...
- jconsole工具监控java运行情况
jconsole是jdk自带的工具.所以要先安装jdk 1.jconsole工具的路径: 通过which jconsole来查看 /usr/local/jdk1.7.0_79/bin/jconsol ...
- G# GUID
GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可 ...
- 【Maven】Snapshot和Release版本的区别
Snapshot版本代表不稳定.尚处于开发中的版本,快照版本. Release版本则代表稳定的版本,发行版本. 什么时候用Snapshot版本? 依赖库中的jar正处于开发的阶段,会被经常被更新,这种 ...