前言
上篇博客最后说道一个小例子,老师讲课的时候说,他曾经听说过一个项目,没有一个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,详细介绍请看下篇博客。
孙二娘她妹夫