四海行唐的一阶段和二阶段的时候,再使用数据的时候总是使用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