zoukankan      html  css  js  c++  java
  • JAVA学习篇--JAVA两种编程模式控制


    Drp项目中,解说了两种编程模式Model 1Model2。以下是对这两种模式的简单理解。以及因为Model2是基于MVC架构的模式,就将我们易混淆的MVC与我们之前学的三层架构进行对照学习一下。


    Model1

     

    所谓Model1就是JSP大行其道的时代,在Model1模式下,整个Web应用差点儿所有由JSP页面组成,JSP页面接收处理client请求,对请求处理后直接做出响应。用少量的JavaBean来处理数据库连接、数据库訪问等操作。


                       


    代码演示样例:改动用户信息

     

    主页面的js跳转:


    function modifyUser() {
    	
    		var selectFlags=document.getElementsByName("selectFlag");
    		var count=0;
    		var j=0;
    		for(var i=0;i<selectFlags.length;i++){
    			if(selectFlags[i].checked){
    				j=i;
    				count++;
    			}
    		}
    		if(count==0){
    			alert("请选择须要改动的用户");
    			return;
    		}
    		if(count>1){
    			alert("一次仅仅能改动一个用户");
    			return;
    		}
    		//alert(selectFlags[j].value);
    		window.self.location = "user_modify.jsp?userId="+selectFlags[j].value;;
    	}
    

    jsp页面的java代码:负责的任务为获取http协议传递的參数,然后调用业务逻辑方法
     

    <% 
        request.setCharacterEncoding("GB18030");
        String command = request.getParameter("command");
    	//当点击改动button后。运行到此
    	if("modify".equals(command)){
    		User user=new User();
    		user.setUserId(request.getParameter("userId"));
    		user.setUserName(request.getParameter("userName"));
    		user.setPassword(request.getParameter("password"));
    		user.setContactTel(request.getParameter("contactTel"));
    		user.setEmail(request.getParameter("email"));
    		
    		UserManager.getInstance().modifyUser(user);
    		out.println("改动用户成功!

    "); } //显示要改动的用户信息 String userId=request.getParameter("userId"); User user=UserManager.getInstance().findUserById(userId); %>


    /**
     * 改动用户
     * @param user
     */
    public void modifyUser(User user){
    	StringBuilder sbSql=new StringBuilder();
    
    	sbSql.append("update t_user ")
    	.append("set    user_name   = ?

    , ") .append("password = ?

    , ") .append("contact_tel = ?, ") .append("email = ? ") .append("where user_id = ? "); Connection conn=null; PreparedStatement pstmt=null; try{ conn=DbUtil.getConnection(); pstmt=conn.prepareStatement(sbSql.toString()); pstmt.setString(1, user.getUserName()); pstmt.setString(2, user.getPassword()); pstmt.setString(3, user.getContactTel()); pstmt.setString(4, user.getEmail()); pstmt.setString(5, user.getUserId()); pstmt.executeUpdate(); }catch(SQLException e){ e.printStackTrace(); }finally{ DbUtil.close(pstmt); DbUtil.close(conn); } }


    Model1模式的实现比較简单,适用于高速开发小规模项目。但从project化的角度看,它的局限性很明显:JSP页面身兼View和Controller两种角色。将控制逻辑和表现逻辑混杂在一起,从而导致代码的重用性很低,添加了应用的扩展性和维护的难度。

     

    由此而出现Model 2模型

     

    Model2已经是基于MVC架构的设计模式。在Model2架构中。Servlet作为前端控制器。负责接收client发送的请求,在Servlet中仅仅包括控制逻辑和简单的前端处理;然后,调用后端JavaBean来完毕实际的逻辑处理;最后,转发到对应的JSP页面处理显示逻辑。


                     


    代码演示样例:

     

    主页面的js跳转


    function modifyItem() {
    		
    		var selectFlags  = document.getElementsByName("selectFlag");
    		var count = 0;
    		var j = 0;
    		for (var i=0; i<selectFlags.length; i++) {
    			if (selectFlags[i].checked) {
    			    j = i;
    				count++;
    			}
    		}
    		if (count == 0) {
    			alert("请选择须要改动的物料!");
    			return;
    		}
    		if (count > 1) {
    			alert("一次仅仅能改动一个物料!

    "); return; } alert(j); alert(selectFlags[j].value); //window.self.location = "<%=basePath%>servlet/item/ShowModifyItemServlet?

    itemNo=" + selectFlags[j].value; window.self.location = "<%=basePath%>servlet/item/ShowModifyItemServlet?itemNo=" + selectFlags[j].value; }


    ShowModifyItemServlet:当中从servlet调用业务逻辑的代码省略


    @Override
    	protected void service(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		//取得物料代码
    		String itemNo=request.getParameter("itemNo");
    		
    		//依据物料代码查询
    		Item item=itemManager.findItemById(itemNo);
    		
    		//将物料信息设置到request中
    		request.setAttribute("item", item);
    		
    		//取得物料类别列表
    		List itemCategoryList=DataDictManager.getInstance().findItemCategoryList();
    		
    		//取得物料单位列表
    		List itemUnitList=DataDictManager.getInstance().findItemUnitList();
    		
    		request.setAttribute("itemCategoryList", itemCategoryList);
    		request.setAttribute("itemUnitList", itemUnitList);
    		
    		request.getRequestDispatcher("/basedata/item_modify.jsp").forward(request, response);
    	}
    
    item_modify.jsp:
    

    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    	
    	Item item = (Item)request.getAttribute("item");	
    	List itemCategoryList = (List)request.getAttribute("itemCategoryList");
    	List itemUnitList = (List)request.getAttribute("itemUnitList");
    %>
    

    Model 2下JSP不再承担控制器的责任,依据代码我们也能够看出,jsp中的处理降低很多,此时它不过表现层角色,只用于将结果呈现给用户。JSP页面的请求与Servlet(控制器)交互,而Servlet负责与后台的JavaBean通信。在Model2模式下。模型(Model)由JavaBean 充当,视图(View)由JSP页面充当,而控制器(Controller)则由Servlet充当。

     

    因为引入了MVC模式,使Model2具有组件化的特点,更适用于大规模应用的开发,使程序猿各司其职,互不干涉。有利于开发中的分工,有利于组件的重用。

    当中缺点就是添加了应用开发的复杂程度。原本须要一个简单的JSP页面就能实现的应用。在Model2中被分解成多个协同工作的部分,需花很多其它时间才干真正掌握其设计和实现过程。


    三层与MVC

     

    对于Model2模型中引入的MVC模式。相信很多人都层都曾为三层与MVC关系搞得一头雾水,以下我就来简介一下它们二者的关系

     

    首先三层架构绝不是MVC。!它们二者并没有关系

     

    三层架构:界面层(UI)业务逻辑层(BLL)和数据訪问层(DAL)构成的

    MVC:模型层(M)界面层(View)和控制层(Controller)构成的,并且他们之间也不正确应。

     

    假设硬要给他们相应的话,那么三层架构中的UI相应MVC中的view(jsp),都是用于显示以及获取界面的数据;三层架构中的BLL层和DAL层相应MVC中的Model(javabean)层都是用于处理上层传递来的数据以及从数据库获取的数据的。MVC中的Controller(Servlet)最多算是三层架构中的UI的一部分,也就我们常说的是Servlet。

    例如以下图所看到的:

     

              


       三层架构的目的着重点是“高内聚。低耦合”,即解耦。它是系统级的架构设计,側重于整个应用程序分层解耦

       MVC的目的则是实现Web系统的职能分工。即职责划分。它仅仅是一种设计模式,更加側重web页面显示的解耦。

     

       事实上职责划分也是解耦,可是三层側重的是总体的一个解耦,而MVC側重的是web系统的解耦,即側重jsp和Servlet的一个解耦,它把展示数据的HTML 页面尽可能的和业务代码分离。

    它将纯净的界面展示逻辑(用户界面)独立到一些文件里(JSP--Views),把一些和用户交互的程序逻辑(Servlet--Controller)单独放在一些文件里。方便进行指责划分。

    比方一般美工仅仅做jsp的页面部分,而对于页面与后台代码的处理则放在servlet中。让专门一部分人来做servlet。但从三层来讲。jsp和servlet都属于界面层,所以在这里使用MVC就实现了指责的划分

     

    三层能够应用于不论什么语言、不论什么技术的应用程序。而MVC仅仅是为了解决BS应用程序视图层各部分的耦合关系。它们互不冲突,能够同一时候存在,也可依据情况使用当中一种。

     

     

    事实上三层架构和MVC还是一个东西。!

     

    事实上三层架构和MVC是一样的。!!

    我们所示不一样仅仅是表面上的不一样。

    核心的东西是一致的,那么什么是核心?

    答曰:分层。解耦!

    假设从解耦的角度来看三层架构和MVC事实上他们是一致的,只不过划分的方法不一样罢了,就像上面的图所看到的(将UI层再次细分)。从这一点说他们能够说是一个东西。这就相当于我们看到馒头和面条一样,表面上看他们不一样(注意不过表面)可是他们核心是一致的,都是面……

     

     

    我们的架构--三层结合MVC模式


                    


    总结:

     

    对于Model 1Model 2模型来说,两种模型各有优缺点,各自有各自的用武之地,仅仅要我们理解各自的优缺点(Model1模式的实现比較简单。适用于高速开发小规模项目。Model 2具有组件化的特点,耦合性小,更适用于大规模应用的开发)。在实际应用中依据需求,合理选择就可以。

    对于三层与MVC来说。刚開始接触的时候相信大家都搞不清楚。可能一直以为它们是一样的。这都没有错,由于学习本就是一个过程,对于知识的理解须要不断的加深认识。每一步的加深或许会推翻曾经的自己,可是每次推翻都代表着进步,代表着理解的更深一层!

     



    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    探索ASP.NET MVC5系列之~~~3.视图篇(下)---包含常用表单和暴力解猜防御
    探索ASP.NET MVC5系列之~~~2.视图篇(上)---包含XSS防御和异步分部视图的处理
    SVN:Previous operation has not finished; run 'cleanup' if it was interrupted
    探索ASP.NET MVC5系列之~~~1.基础篇---必须知道的小技能
    MVC:The name 'Scripts' does not exist in the current context
    Dapper.Contrib:GetAsync<T> only supports an entity with a [Key] or an [ExplicitKey] property
    Dapper扩展之~~~Dapper.Contrib
    AutoFac在项目中的应用
    群福利:百度云管家-本地SVIP
    【声明】前方不设坑位,不收费!~ 我为NET狂官方学习计划
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4820154.html
Copyright © 2011-2022 走看看