DRP总结—Model1和Model2的区别
前言
上篇博客最后说道一个小例子,老师讲课的时候说,他曾经听说过一个项目,没有一个servlet,只用到了jsp就完成了,这实际上就是model1的执行过程。下面这篇博客就介绍一下model1是怎么发展为model2的。
mvc
说道model1和model2模式,就不得不提mvc,因为model1和model2都在一定程度上应用了mvc设计模式。mvc是一种混合模式,主要是为了 把视图和后台业务逻辑处理解耦合。当view向业务逻辑请求数据时,需要经过controller;业务逻辑向view返回数据时,同样需要经过controller,controller就像是二者之间的路由。
mvc模式也可以认为是一种思想,设计模式本来就是优化代码的思想,所以说mvc的思想在java中同样适用。
model1
model1虽然实现了mvc,但是实现的并不彻底。mvc模式中,分为view层、controller层和model层,而在model1中,view层和controller层合二为一了,也就是jsp,javabean则作为model层单独存在。这样的话,jsp既要做显示,又要处理一定的业务逻辑,对于单一职责的原则来说,这显然不符合。jsp的职责太重,就显得中间部分有些臃肿。
虽然model1模式没有很符合单一职责原则,但是model1实现比较简单,对程序员的要求也不高。但是jsp页面兼具view和controller两种角色,将控制逻辑和表现逻辑混合在一起,导致代码的重用性比较低,增加了扩展性和可维护的难度,所以适合小型项目的开发。
model1模式的代码,jsp页面的负担比较重,会承担一部分的业务逻辑,如下所示:
jsp代码:
string command = request.getparameter("command"); if("del".equals(command)){ string[] userids = request.getparametervalues("selectflag"); //for(int i=0;i pagemodel = usermanager.getinstance().finduserlist(pageno, pagesize);
manager代码:
/** * 分页查询 * @param pageno 第几页 * @param pagesize 每页多少条数据 * @return pagemodel */ public pagemodel finduserlist(int pageno, int pagesize) { stringbuffer sbsql = new stringbuffer(); sbsql.append("select user_id, user_name, password, contact_tel, email, create_date ") .append("from ") .append("( ") .append("select rownum rn, user_id, user_name, password, contact_tel, email, create_date ") .append("from ") .append("( ") .append("select user_id, user_name, password, contact_tel, email, create_date from t_user where user_id <> 'root' order by user_id ") .append(") where rownum <= ? ") .append(") where rn > ? "); connection conn = null; preparedstatement pstmt = null; resultset rs = null; pagemodel pagemodel = null; try { conn = dbutil.getconnection(); pstmt = conn.preparestatement(sbsql.tostring()); pstmt.setint(1, pageno * pagesize); pstmt.setint(2, (pageno - 1) * pagesize); rs = pstmt.executequery(); list userlist = new arraylist(); while (rs.next()) { user user = new user(); user.setuserid(rs.getstring("user_id")); user.setusername(rs.getstring("user_name")); user.setpassword(rs.getstring("password")); user.setcontacttel(rs.getstring("contact_tel")); user.setemail(rs.getstring("email")); user.setcreatedate(rs.gettimestamp("create_date")); userlist.add(user); } pagemodel = new pagemodel(); pagemodel.setlist(userlist); pagemodel.settotalrecords(gettotalrecords(conn)); pagemodel.setpagesize(pagesize); pagemodel.setpageno(pageno); }catch(sqlexception e) { e.printstacktrace(); }finally { dbutil.close(rs); dbutil.close(pstmt); dbutil.close(conn); } return pagemodel; }
model2
model2可以说完全实现了mvc模式,在model1的基础上,model2扩展了servlet,将控制逻辑放在servlet中,让它来做controller的工作,从而减少了jsp的负担。在model2模式中,jsp只负责显示页面,生成动态网页;servlet负责流程的控制,处理各种请求;javabeans则负责业务逻辑,以及对的操作。
在model2模式中,jsp相当于view的角色,servlet做的controller的工作,javabeans做的model层的工作。但是相对于model1,model2对程序员的要求要高,各层之间分工明确,各司其职。分层的结果是开发的粒度较细,代码的复用性提高了,后期维护也容易了,所以model2模式比较适合大型项目的开发。
model2模式是由servlet负责页面转向的,也就是说jsp请求数据时将请求发给servlet,servlet再去找相应的manager,如下所示:
servlet代码:
@override protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { //取得表单数据 string itemno = request.getparameter("itemno"); string itemname = request.getparameter("itemname"); string spec = request.getparameter("spec"); string pattern = request.getparameter("pattern"); string category = request.getparameter("category"); string unit = request.getparameter("unit"); //构造对象 item item = new item(); item.setitemno(itemno); item.setitemname(itemname); item.setspec(spec); item.setpattern(pattern); //构造物料类别 itemcategory itemcategory = new itemcategory(); itemcategory.setid(category); item.setitemcategory(itemcategory); //构造物料单位 itemunit itemunit = new itemunit(); itemunit.setid(unit); item.setitemunit(itemunit); itemmanager.additem(item); //重定向到查询页面 response.sendredirect(request.getcontextpath() + "/servlet/item/searchitemservlet"); }
manager代码:
@override public void additem(item item) { connection conn = null; try{ conn = dbutil.getconnection(); if(itemdao.finditembyid(conn, item.getitemno()) != null){ throw new applicationexception("物料代码已经存在,代码="+ item.getitemno()); } itemdao.additem(conn, item); }finally{ dbutil.close(conn); } }
model2模式jsp几乎没有代码,只需要在表单的action中填写servlet的配置路径就好了。经过servlet后,如果请求已经完成,则直接重定向到下一个页面;如果还需要下一个地址进行处理,则进行转发,将要处理的数据通过request携带。
总结
model1和model2的最根本的区别是,model是jsp+javabeans开发模式,model2是jsp+servlet+javabeans开发模式,两者都是mvc模式的应用,但是应用程度不同。在model2模式的开发下,基于分层思想,manager的代码也进行了抽象,原来manager是既做业务逻辑,也做数据持久化,既然分层,那么业务逻辑和数据持久化就得分开,这也就有了dao层,所以说dao层的出现也是策略模式的体现,将数据持久化进行封装,业务层使用时,不需要知道数据持久化的操作过程。在java中,数据持久化的基础是jdbc规范,不管是哪种封装,都是基于jdbc技术的。关于jdbc,详细介绍请看下篇博客。