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,详细介绍请看下篇博客。相关文章推荐
- 冒泡/选择/插入排序简介
- 深入探索AsyncTask
- C. Sorting Railway Cars
- 后缀数组 POJ 3693 Maximum repetition substring
- 开发者引用
- 2016 UESTC Training for Data Structures G - 郭大侠与阴阳家 CDOJ 1337 强行map
- visual studio 2010 出现问题,不能设置断点调试了,一运行就未响应,然后程序退出
- Ubuntu+Django+mod_wsgi+Apache配置过程
- HTTP服务介绍
- 引用内容
- Quick-sort quiz
- CentOS6.5安装Tomcat8.0
- tomcat7动态部署项目
- 回调函数透彻理解Java
- C#调用Geos的C函数接口进行空间拓扑操作
- iPhone开发各种demo
- 如何在博文中添加超链接之随笔小技巧--超链接的使用
- 【数据结构与算法】十五 二叉树遍历 DFS 深度优先 递归算法
- 线程与进程
- 为什么样本方差里面要除以(n-1)而不是n?