我交了个新朋友——TA叫MVC设计模式(附加小型面试问答)附加使用注解案例

MVC全名是Model View Controller,是Model(模型)- View(视图)-Controller(控制器)的缩写。MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特地发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中,详细介绍如下。

MVC简介

MVC是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,已被广泛使用。后来被推荐为Oracle旗下Sun公司Java EE平台的设计模式,并且受到越来越多的使用ColdFusion和PHP的开发者的欢迎。MVC模式是一个有用的工具箱,它有很多好处,但也有一些缺点。

那么Model、View、Controller分别在应用程序中代表什么呢?

  • (1)Model(模型)是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
  • (2)View(视图)是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
  • (3)Controller(控制器)是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

为什么要把应用程序分为三层呢?

  • (1)MVC分层有助于管理复杂的应用程序,因为用户可以在一段时间内专门关注一个方面。例如,用户可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。
  • (2)MVC分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。

MVC框架的主要内容

MVC指MVC模式的某种框架,它强制性地使应用程序的输入、处理和输出分开。使用MVC的应用程序被分成三个核心部件:模型、视图、控制器,它们各自处理自己的任务。最典型的MVC就是JSP +Servlet + JavaBean的模式,其工作原理图如下图所示
在这里插入图片描述
视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术层出不穷,它们包括Adobe Flash和像XHTML、XML/XSL、WML等一些标识语言和JSP等。

模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如,它可能用像EJBs和ColdFusion Components这样的构件对象来处理数据库,被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

控制器接受用户的输入并调用模型和视图去完成用户的需求,所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

框架、设计模式和架构

框架、设计模式这两个概念总容易被混淆,其实它们之间还是有区别的。框架通常是代码重用,而设计模式是设计重用,架构则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。在软件生产中有三种级别的重用:①内部重用,即在同一应用中能公共使用的抽象块;②代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域中都能使用;③应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得最高级别的重用性。

1、成熟框架

  • 1)Hibernate框架
    Hibernate是一种ORM框架,全称为Object-Relative Database-Mapping,在Java对象与关系型数据库之间建立某种映射,以实现直接存取Java对象(POJO)。ORM框架是不同于MVC的另一种思想框架,适用范围也与MVC截然不同。
    使用JDBC连接来读写数据库,我们最常见的就是打开数据库连接,使用复杂的SQL语句进行读写,关闭连接,获得的数据又需要转换或封装后往外传,这是一个非常烦琐的过程。
    这时出现了Hibernate框架,它需要用户创建一系列的持久化类,每个类的属性都可以被简单地看作和一张数据库表的属性一一对应,当然也可以实现关系数据库的各种表间关联的对应。当我们需要相关操作时,不用再关注数据库表。不用再去一行行地查询数据库,只需要持久化类就可以完成增删改查的功能。这就使我们的软件开发真正面向对象,而不是面向混乱的代码。使用Hibernate比JDBC方式减少了80%的编程量。
  • 2)Struts 2框架
    Struts 2以WebWork优秀的设计思想为核心,吸收了Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web应用程序框架。
    Struts 2引入了几个新的框架特性:从逻辑中分离出横切关注点的拦截器、减少或者消除配置文件、贯穿整个框架的强大表达式语言、支持可变更和可重用的基于MVC模式的标签API。Struts 2充分利用了从其他MVC框架学到的经验和教训,使得Struts 2框架更加清晰灵活。
  • 3)Struts框架(目前已淘汰)
    Struts框架是一个完美的MVC实现,它有一个中央控制类(一个Servlet),针对不同的业务,需要一个Action类负责页面跳转和后台逻辑运算,一个或几个JSP页面负责数据的输入和输出显示,还有一个Form类负责传递Action和JSP中间的数据。JSP中可以使用Struts框架提供的一组标签,就像使用HTML标签一样简单,但是可以完成非常复杂的逻辑。从此JSP页面中不需要出现一行<%%>包围的Java代码了。可是所有的运算逻辑都放在Struts的Action里将使得Action类复用度低和逻辑混乱,所以通常人们会把整个Web应用程序分为三层:Struts负责显示层,它调用业务层完成运算逻辑,业务层再调用持久层完成数据库的读写。
  • 4)MyBatis框架
    MyBatis本是Apache的一个开源项目iBATIS,2010年这个项目由ApacheSoftware Foundation迁移到了Google Code,并且改名为MyBatis。2013年11月迁移到GitHub。
    iBATIS一词来源于“Internet”和“Abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。
  • 5)Spring框架
    调用者依赖被调用者,它们之间形成了强耦合,如果想在其他地方复用某个类,则这个类依赖的其他类也需要包含,程序就会变得很混乱,每个类互相依赖互相调用,复用度极低。如果一个类做了修改,则依赖它的很多类都会受到牵连。为此,出现了Spring框架。
    Spring的作用就是完全解耦类之间的依赖关系,一个类如果要依赖什么,那就是一个接口。至于如何实现这个接口,这都不重要了。只要拿到一个实现了这个接口的类,就可以轻松地通过XML配置文件把实现类注射到调用接口的那个类里。所有类之间的这种依赖关系就完全通过配置文件的方式替代了。所以Spring框架最核心的就是所谓的依赖注射和控制反转。
  • 6)Spring MVC框架
    Spring MVC属于Spring FrameWork的后续产品,已经融合在Spring Web Flow里面。Spring框架提供了构建Web应用程序的全功能MVC模块。使用Spring可插入的MVC架构,从而在使用Spring进行Web开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts 1、Struts 2等。
    它是一个典型的教科书式的MVC框架,而不像Struts等都是变种或者不是完全基于MVC系统的框架,对于初学者或者想了解MVC的人来说Spring是最好的,它的实现就是教科书!第二,它和Tapestry一样是一个纯正的Servlet系统,这也是它和Tapestry相比Struts所具有的优势。而且框架本身有代码,看起来容易理解。
  • 7)ZF框架
    Zend Framework(简写ZF)是由Zend公司支持开发的完全基于PHP 5的开源PHP开发框架,可用于开发Web程序和服务。ZF采用MVC架构模式来分离应用程序中不同的部分以方便程序的开发和维护。
  • 8).NET框架
    .NET MVC是微软官方提供的以MVC模式为基础的.NET Web应用程序(WebApplication)框架,它由Castle的MonoRail而来(Castle的MonoRail由Java而来)。

2、正在兴起的框架

  • 1)Jersey框架
    Jersey框架是开源的RESTful框架,实现了JAX-RS(JSR 311 & JSR 339)规范。它扩展了JAX-RS参考实现,提供了更多的特性和工具,可以进一步地简化RESTfulService和Client开发。尽管相对年轻,它已经是一个产品级的RESTful Service和Client框架。与Struts类似,它同样可以和Hibernate、Spring框架整合。
    由于Struts 2+Hibernate+Spring整合在市场的占有率太高,所以只有很少一部分人去关注Jersey。所以网上有关于Jersey的介绍很少。但是它确实是一个非常不错的框架。对于请求式服务,对于GET、DELETE请求,甚至只需要给出一个URI即可完成操作。
    举个简单的例子,如果想获得服务器数据库中的所有数据,那么可以在浏览器或者利用AJAX的GET方法,将路径设置好,例如,localhost:8080/Student(项目名称)/studentinfo(项目服务总体前缀)/student(处理student对象的签注)/getStudentInfo(最后前缀),这样就可以获取所有学生信息。可以选择GET获取的数据的返回类型:JSON, XML, TEXT_HTML(String)…获取之后,可以通过JS将这些数据塞到HTML或者JSP页面上。
  • 2)Spring Boot框架
    Spring Boot框架,被称作一栈式解决方案,比较轻量,也是当前微服务下的趋势。Spring Boot本身就是构建于Spring之上,各种思想和特性无须多说,去掉了Spring烦琐的配置,简化了原有Spring开发的流程,提供了各种实用的特性,如metric、actuctor等。最重要的是,Spring Boot附带了整个Spring Cloud生态。两个框架对解决大、中、小项目都没有任何问题。
  • 3)Play框架
    Play可能更加偏向于Scala,本身轻量,性能高,随着逐步的优化,其易用性以及扩展性都变得越来越好。
  • 4)JFinal框架
    JFinal是基于Java语言的极速Web开发框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有Ruby、Python等动态语言的开发效率。

MVC入门小实例

1、导入JAR包

在这里插入图片描述

2、配置前端控制器

web.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  
  <servlet>
  	<!-- 配置前端过滤器 -->
  	<servlet-name>Spring</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	
  	<!-- 初始化时加载配置文件 -->
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:Springmvc_config.xml</param-value>
  	</init-param>
  	
  	<!-- 表示容器在启动时立即加载Servlet -->
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>Spring</servlet-name>
  	<url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

3、创建Controller类

FirstController.java

package beginner;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class FirstController implements Controller {

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub

		ModelAndView mav = new ModelAndView();
		mav.addObject("msg", "This is my first Spring MVC program");
		mav.setViewName("/WEB-INF/jsp/First.jsp");

		return mav;
	}

}

4、创建配置文件

Springmvc_config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"> 
	<!-- 配置处理器Handler -->
	<bean name="/FirstController" class="beginner.FirstController" />
	<!-- 处理器映射器 -->
	<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
	<!-- 处理器适配器 -->
	<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
	<!-- 视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" />
</beans>
	

5、创建视图

First.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Beginner</title>
</head>
<body>
	${msg }
</body>
</html>

大体框架
在这里插入图片描述
运行结果如下:
在这里插入图片描述

数形结合代码总结与归纳

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注解的使用

DispatcherServlet

在这里插入图片描述
在这里插入图片描述

Controller注解类型

在这里插入图片描述
在这里插入图片描述
再上一个实例的基础上,把控制器类改一改,如下:
在这里插入图片描述
不需要再实现Controller接口,然后通过配置文件中扫描机制找到该注解,如下

Springmvc_config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans
	   http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
	   http://www.springframework.org/schema/context 
  http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	<!-- 指定需要扫描的包 -->
	<context:component-scan base-package="beginner" />

RequestMapping注解类型

1、标注在方法上

在这里插入图片描述

2、标注在类上

在这里插入图片描述
我的全局配置如下:
在这里插入图片描述
控制器类如下
在这里插入图片描述

RequestMapping注解的属性

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

组合注解

在这里插入图片描述
在这里插入图片描述

请求处理方法的参数类型和返回值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ViewResolver视图解析器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

基于注解的Spring MVC应用小案例

FirstController.java

package beginner;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value = "/hello")
public class FirstController {
	@RequestMapping(value = "/FirstController")

	public String handleRequest(HttpServletRequest request, HttpServletResponse response, Model model)
			throws Exception {
		// TODO Auto-generated method stub

		model.addAttribute("msg", "This is my first Spring MVC program");

		return "First";
	}

}

Springmvc_config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans
	   http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
	   http://www.springframework.org/schema/context 
  http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	<!-- 指定需要扫描的包 -->
	<context:component-scan base-package="beginner" />
	<!-- 定义视图解析器 -->
	<bean id="viewResolver" class=
    "org.springframework.web.servlet.view.InternalResourceViewResolver">
	     <!-- 设置前缀 -->
	     <property name="prefix" value="/WEB-INF/jsp/" />
	     <!-- 设置后缀 -->
	     <property name="suffix" value=".jsp" />
	</bean>
</beans>  

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  
  <servlet>
  	<!-- 配置前端过滤器 -->
  	<servlet-name>Spring</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	
  	<!-- 初始化时加载配置文件 -->
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:Springmvc_config.xml</param-value>
  	</init-param>
  	
  	<!-- 表示容器在启动时立即加载Servlet -->
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>Spring</servlet-name>
  	<url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

First.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Beginner</title>
</head>
<body>
	${msg }
</body>
</html>

全局配置:
在这里插入图片描述
运行结果如下:
在这里插入图片描述

添加了注解后的运行流程图

在这里插入图片描述
在这里插入图片描述

容易犯的错误

在这里插入图片描述

小型面试题

面试官:你能解释下MVC的完整流程吗?

应聘者:MVC(模型、视图、控制器)架构的控制流程为:所有的终端用户请求被发送到控制器,控制器依赖请求去选择加载哪个模型,并把模型附加到对应的视图,附加了模型数据的最终视图作为响应发送给终端用户。

面试官:使用MVC有哪些好处?

应聘者:MVC有以下两个大的好处。
(1)分离了关注点。后台代码被移到单独的类文件,可以最大限度地重复利用代码。
(2)自动化UI测试成为可能,因为后台代码移到了.NET类,这让我们更容易进行单元测试和自动化测试。

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值