您的位置:首页 > 其它

Model1和Model2的区别

2016-05-01 14:25 471 查看

前言

    上篇博客最后说道一个小例子,老师讲课的时候说,他曾经听说过一个项目,没有一个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<userIds.length;i++){
//UserManager.getInstance().delUser(userIds[i]);
//}
UserManager.getInstance().delUser(userIds);
}
int pageNo = 1;
int pageSize = 2;
String pageNoString = request.getParameter("pageNo");
if (pageNoString != null) {
pageNo = Integer.parseInt(pageNoString);
}
PageModel<User> pageModel = UserManager.getInstance().findUserList(pageNo, pageSize);


Manager代码:

/**
* 分页查询
* @param pageNo 第几页
* @param pageSize 每页多少条数据
* @return pageModel
*/
public PageModel<User> 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<User> 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<User> userList = new ArrayList<User>();
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<User>();
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,详细介绍请看下篇博客。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: