本篇以看传智播客方立勋老师的《JDBC入门》之《实现客户关系管理案例》视频有感,从中提取方老师在设计管理系统的简单案例中对自己比较有用的部分,以便日后在开发过程中希望能有所帮助。
在这个视频中,该客户关系管理系统的界面由简单的“添加客户”和“查看客户”两个超链接构成。其中“查看客户”的功能涉及使用数据库来进行网页显示的分页效果,该功能的实现请看相关博客。
在“添加客户”的功能中,方老师很灵巧的将一个Servlet的doGet方法和doPost方法一起使用,这样减少了类的定义,优化了程序。我们知道在MVC设计模式下,一个来自客户端浏览器的请求应该是由Servlet先处理,然后转交给JSP显示给用户。因此在JSP页面中,“添加用户”的超链接地址是一个Servlet,表单提交的“action”属性也是一个Servlet,当然添加用户的超链接和添加用户的表单并不是同一个JSP页面,却是可以使用相同的Servlet来处理,这是非常巧秒的一个地方,如下图所示:
在web层处理添加用户的addCustomerServlet中,在doGet方法中,只有一行代码,那就是跳转(forward)到另一个JSP页面,这个JSP页面是添加用户的表单显示,当我们填写好表单之后并提交,设置提交地址还是刚才的addCustomerServlet,此时应该使用的是doPost方法,本来这个方法也是专门用来处理表单数据的。
在处理表单的doPost方法中,首先我们要先校验表单,表单校验通过了,要将请求中的表单对象封装到一个JavaBean中,为了能实现请求对象中无论是封装什么对象都将其数据完整的封装到一个实体JavaBean对象中,我们在web层构建一个工具类,在这个工具类中设计一个满足这样的方法,使用泛型、反射和BeanUtils工具类:
public class WebUtils {
public static <T> T request2Bean(HttpServletRequest request, Class<T> beanClass) {
try{
T bean = beanClass.newInstance();
Map paramMap = request.getParameterMap();
BeanUtils.populate(bean, paramMap);
return bean; }catch (Exception e) {
throw new RuntimeException(e);
}
}
}
如果要使用上面这个将请求中的对象封装到对应的JavaBean对象中,必须确保表单中的name属性、工程程序里domain包中对应JavaBean的属性名要一致,这样使用BeanUtils时才能正确复制数据。
但请注意,使用BeanUtils的populate方法只能将字符串转换为字符串和八大基本数据类型,对于bean对象中如果有Date类型这样的属性,那么一定要在使用BeanUtils的方法之前先使用转换器ConvertUtils进行注册要转换的类型。代码如下:
public class WebUtils {
public static <T> T request2Bean(HttpServletRequest request, Class<T> beanClass) {
try{
T bean = beanClass.newInstance();
Map paramMap = request.getParameterMap();
ConvertUtils.register(new Converter() {
@Override
public <T> T convert(Class<T> type, Object value) {
if(value == null) {
return null;
}
String dateStr = (String) value;
if(dateStr.trim().equals("")) {
return null;
}
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = format.parse(dateStr);
return (T) date;
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}, Date.class);
BeanUtils.populate(bean, paramMap);
return bean; }catch (Exception e) {
throw new RuntimeException(e);
}
}
}