在WEB工程的web层中的编程技巧
本篇以看传智播客方立勋老师的《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);
}
}
}
在WEB工程的web层中的编程技巧的更多相关文章
- 容器加載Web工程的Web.xml文件介紹
转 容器加載Web工程的Web.xml文件介紹 [-] 这篇文章主要是综合网上关于webxml的一些介绍希望对大家有所帮助也欢迎大家一起讨论 ---题记 一 Webxml详解 一 ...
- 如何将下载的web工程导入到eclipse中使用
如果你是喜欢编程的,在你的开发工具中一定有许多项目,就像小编一样(PS:小编只想默默地装一X): 我们选中其中的一个项目,然后[Ctrl + C]复制,再[Ctrl + V]粘贴到桌面: 那么 ...
- ZStack中的编程技巧
1. 像函数一样使用的宏 //这个宏,用来被其他宏使用,构造一个正确有效的表达式.这个适合于一些离散语句的组合,不适合函数的重新命名 #define st(x) do { x } while ...
- web工程导入MyEclipse 就变成Java工程 ———— 解决方案
Web 工程 导入到 MyEclipse 中后就变成 Java工程了 折腾大大半天,最后才发现是 .settings 里面文件的配置问题.. .settings 文件夹里面的 org.eclipse. ...
- Maven工程的Web调试
1.添加Server,将Web工程和Tomcat关联起来: 1)Windows->Show views->Other-->Servers,将会在下方弹出Server的窗口,然后右键添 ...
- OSGI插件(plugin)web工程建设步骤
所有资源下载(汇总) 底包的下载地址:https://pan.baidu.com/s/15JxHOHf0AyZaLKPJUkpeXA 提取码: bujz web-target.war下载地址: ht ...
- 购物商城学习--第三讲(tomcat插件启动web工程)
此处提到的tomcat插件即maven工程集成的tomcat插件,可以在添加maven的tomcat插件之后,在本地通过脚本或者命令行方式运行web工程,tomcat插件启动只需要修改一个端口即可,非 ...
- 搭建Dynamic Web Project(动态web项目)的springmvc工程1
本文转载自:http://blog.csdn.net/typa01_kk/article/details/45902955 此篇创建Dynamic Web Projec工程(动态web项目),下一篇, ...
- 15.自动部署web工程
用maven自动部署web工程 在pom.xml中写入以下: <build> <!--最终名称,进入网页时有http://localhost:8080/xxx/--> < ...
随机推荐
- BZOJ 1977: [BeiJing2010组队]次小生成树 Tree( MST + 树链剖分 + RMQ )
做一次MST, 枚举不在最小生成树上的每一条边(u,v), 然后加上这条边, 删掉(u,v)上的最大边(或严格次大边), 更新答案. 树链剖分然后ST维护最大值和严格次大值..倍增也是可以的... - ...
- USACO Ski Course Design 暴力
从Min到Max范围内暴力一下即可. /* ID: wushuai2 PROG: skidesign LANG: C++ */ //#pragma comment(linker, "/STA ...
- Codeforces 489C Given Length and Sum of Digits...
m位长度,S为各位的和 利用贪心的思想逐位判断过去即可 详细的注释已经在代码里啦~ //#pragma comment(linker, "/STACK:16777216") //f ...
- media_root以及static_root配置
# At the top of settings/base.pyfrom os.path import join, abspath, dirnamehere = lambda *x: join(abs ...
- Week4(9月30日):
Part I:提问 =========================== 1.什么是DRY? 2.解释下面的模型验证规则. public class Movie { public int ID { ...
- python IDE ulipad配置使用
一直认为认为python自带的编辑器idle实在是太简陋了,连显示行号的功能都没有,也非常不好编辑.找了下windows平台下的Ide,发现ulipad很多人推荐使用,就开始安装了. 首先去官网: h ...
- 《UNIX环境高级编程》笔记--sync、fsync和fdatasync函数
传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘 I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列 ...
- 基于html5 localStorage , web SQL, websocket的简单聊天程序
new function() { var ws = null; var connected = false; var serverUrl; var connectionStatus; var send ...
- Dockerfile指令总结
指令的一般格式为INSTRUCTION arguments,指令包含FROM.MAINTAINER.RUN等. FROM 格式为FROM <image>或FROM <image> ...
- 再造 “手机QQ” 侧滑菜单(三)——视图联动
代码示例:https://github.com/johnlui/SwiftSideslipLikeQQ 本 文中,我们将一起使用 UINavigationController 来管理主视图,并实现点击 ...