Model1和Model2的区别

18 篇文章 2 订阅

前言


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

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值