多数人JavaWeb的入门是学习SSH:struts+spring+hibernate;我在十年前(2006年)学习的,那时火的是struts1.x ,struts2还没诞生。
这三个框架组合,我用了大概有5年时间。现在回想起来,用这三大框架做项目真是痛苦不堪;但那时也没别的选择,一律的MVC框架;相比纯Servlet与JSP已经是有很大的进步
所谓的痛苦主要来源于控制层,视图,及数据查询。在3年前我就不再采用struts与hibernate框架,有很多功能用不上,因为都只是做小项目,数据表基本不超200张。
struts的JSP标签真是不好用,包括其他的JSP标签;
MVC框架对request,session,response 验证器,拦截器的封装与抽象会让初级开发者在里面绕不出来,建议初学者先把servlet学透了再学SSH,不然你会看不到技术的本质。struts只是servlet的一个外壳、一件衣服;你谈个对象,不会是想研究她的衣服是怎么做的吧?
hibernate的自动生成Bean,让初学者眼前一亮,原来数据库操作就这么简单、这么方便。看似方便实是画地为牢,get一条记录真需要把所有字段都提出来吗?如果多查其他表的一个字段呢?HQL的兼容多数据库有用过吗?强行OO等于困在hql中,把简单的问题复杂化了;犹如种田带手拷,各种不自由。
spring是我一直推崇的。它的对象管理、ioc、配置管理、事务、调度真在是太实用了;至今我的任何项目都有spring身影。
其实我想说的是,芝麻大的小项目你分那么多层有鸟用?实现一个功能得建个view、action、service、dao,真有按严格意义上的分层吗?我曾经看到一个电信外包项目在增加一个简单的查询,需要创建9个类或配置文件,那个项目只能用一个乱字来形容,一群人围着这项目瞎扯腾,实际上已经没有一个人掌握,举步维艰。
到了现在我变成了只写JSP,我是分为view与handler。数据交互多用ajax,数据格式是JSON
handler.jsp
String cmd=request.getParameter("c"); ApplicationContext spring = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext()); JdbcTemplate jdbc=spring.getBean("jdbcTemplate",JdbcTemplate.class); UserBean userBean=(UserBean)session.getAttribute(Constants.SESSION_USER); Map<String,Object> ret=new HashMap<String,Object>(); ret.put("success", true); ret.put("code", 1); ret.put("message", "操作成功"); java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyyMM"); if("getJobList".equals(cmd)){ List<Map<String,Object>> list=jdbc.queryForList(sql); for(Map<String,Object> map:list){ String c=colors[random.nextInt(colors.length)]; map.put("bordercolor", c); map.put("bgcolor", c); } out.println(JSON.toJSONString(list)); }else if("drop".equals(cmd)){ String id=request.getParameter("id"); String stime=request.getParameter("stime"); String etime=request.getParameter("etime"); jdbc.update("update toa_onduty set stime=?,etime=? where id=?",stime,etime,id); out.println(JSON.toJSONString(ret)); }else if("editable".equals(cmd)){ String stime=request.getParameter("stime"); String etime=request.getParameter("etime"); //ret.put("editable",gridService.isEditAble(userBean.getId(), stime, etime)); out.println(JSON.toJSONString(ret)); }else{ System.out.println("参数c的值["+cmd+"]有误,system/workflow/manager/handler.jsp"); out.println(JSON.toJSONString(ret)); }
view.jsp
function reload(id,type){ cache={id:id,type:type}; $("#calendar").fullCalendar(‘removeEvents‘); $.post(handlerJsp,{c:"getJobList",id:id,type:type},function(data){ if(data.length==0){lgxInfo("没有排班数据");}else{ alert("有"+data.length+"条排班记录"); } for(var i=0;i<data.length;i++) { var obj = new Object(); obj.id = data[i].id; obj.title = data[i].title; obj.start = parseDate( data[i].stime ); obj.end = parseDate( data[i].etime ); // obj.description = data[i].description; obj.backgroundColor=data[i].bgcolor; obj.borderColor=data[i].bordercolor; obj.allDay =false; // if(data[i].allday==1){ // obj.allDay =true; // }else{ // obj.allDay =false; // } $("#calendar").fullCalendar(‘renderEvent‘,obj,true); } },"JSON"); }
总体上我还是使用平台来开发;用平台来把控全局,只是在局部功能采用这样的写法。复杂的业务逻辑我也会面向接口编程写个Service,让Spring统一管理;
以这样的写法来方现一般的小操作,如行云流水、简单快捷。