理解MVC及快速入门

共 6221字,需浏览 13分钟

 ·

2022-07-10 17:50


来源 | 个人博客| 作者 | MrSaber

说明:

传统MVC——>JSPModel2——>Front Controller + Application Controller + Page Controller + Context 三种模式是JavaWeb设计模式的逐渐适配和演进。本文分别讲述了这三种模式,作为了解即可。SpringMVC正是采用了第三种设计模式。


MVC


  MVC是Xerox PARC在20世纪80年代为编程语言SmallTalk发明的一种软件设计模式。
  MVC是一种设计模式,它强制性地把应用程序的数据展示、数据处理和流程控制分开
  MVC将应用程序分成3个核心模块:模型、视图、控制器,他们相互联结又分别担当不同的任务,如图示所示。

图示

  


理解

  模型:数据模型,提供要展示的数据,因此包含数据和行为,可以认为是JavaBean,一个模型可以为多个视图提供数据。
  视图:负责模型的展示,一般就是我们见到的用户界面,客户想要看到的东西。
  控制器:控制器负责应用的流程控制,所谓流程控制就是接受用户请求,委托给模型进场处理,后获取模型数据交由视图展示。

JSPModel2


  在早期的Web应用中,JSP负责处理业务逻辑、控制网页流程并创建HTML页面。基本上JSP包揽的所有的模块,这无疑造成了不少的困扰:
  比如:

  1.可维护性差
  2.调试困难
  3.HTML与Java程序代码强耦合在一起
  4.内嵌的流程控制逻辑,要理解应用程序的逻辑必须浏览所有的JSP页面。


  为了解决这些问题,SUN公司先后制定了两种设计模式,分别为Model1和Model2。虽然Model1在一定程序上实现了MVC中的视图和模型,但是他的运用并不理想,知道Model2的出现才改变了这种局面。
  Model2中用JSP技术实现了视图的功能、用Servlet技术实现了控制器的功能、用JavaBean技术实现了模型的功能
图示

  


实例

  

  

  

Front Controller + Application Controller + Page Controller + Context


说明
  前端控制器+应用控制器+页面控制器(也有称其为动作)+上下文,也是一种WebMVC模型,只是责任更加明确,SpringMVC正是这种模式
运行流程图

  

  Front Controller:前端控制器,负责为表现层提供统一访问点,从而避免Model2中出现的重复的控制逻辑(由前端控制器统一回调相应的功能方法,如前边的根据submitFlag=login转调login方法);并且可以为多个请求提供共用的逻辑(如准备上下文等等),将选择具体视图和具体的功能处理(如login里边封装请求参数到模型,并调用业务逻辑对象)分离。
 
  Application Controller:应用控制器,前端控制器分离选择具体视图和具体的功能处理之后,需要有人来管理,应用控制器就是用来选择具体视图技术(视图的管理)和具体的功能处理(页面控制器/命令对象/动作管理),一种策略设计模式的应用,可以很容易的切换视图/页面控制器,相互不产生影响。
 
  Page Controller(Command):页面控制器/动作/处理器:功能处理代码,收集参数、封装参数到模型,转调业务对象处理模型,返回逻辑视图名交给前端控制器(和具体的视图技术解耦),由前端控制器委托给应用控制器选择具体的视图来展示,可以是命令设计模式的实现。页面控制器也被称为处理器或动作。
 
  Context:上下文,还记得Model2中为视图准备要展示的模型数据吗,我们直接放在request中(Servlet API相关),有了上下文之后,我们就可以将相关数据放置在上下文,从而与协议无关(如Servlet API)的访问/设置模型数据,一般通过ThreadLocal模式实现。

HelloWorld


 0.说明

  现在我们以前了解了MVC编程模型,接下来我们实际地编写一个SpringMVC入门实例,我们现在还不能解所有的技术细节,但是在接下来的博客一定会有相关解释。

 1.加入Jar包

  

说明:

(http://projects.spring.io/spring-framework/)进入官方网站,页面右侧选择4.0版本进行下载,下载完毕后添加以上Jar包到Java环境变量中。

2.配置Web.xml文件

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
        version="3.1">

   <!--配置DispatcherServlet-->
   <servlet>
       <servlet-name>dispatcherServlet</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <!--配置初始化参数:作用是配置SpringMVC配置文件的位置和名称-->
       <init-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>classpath:dispatcherServlet-servlet.xml</param-value>
       </init-param>
       <load-on-startup>1</load-on-startup>
   </servlet>

   <servlet-mapping>
       <servlet-name>dispatcherServlet</servlet-name>
       <url-pattern>/</url-pattern>
   </servlet-mapping>
</web-app>


说明:

  DispatcherServlet是前端控制器设计模式的实现,提供了Spring Web MVC的集中访问点。 

  与其它web MVC框架一样,Spring的web MVC框架是一个请求驱动的web框架,其设计围绕一个中心的servlet进行, 它能将请求分发给控制器,并提供其它功能帮助web应用开发。然而,Spring的DispatcherServlet 所做的不仅仅是这些,它和Spring的IoC容器完全集成在一起,从而允许你使用Spring的其它功能

  请求处理流程:

    

 

3.加入SpringMVC的配置文件

<?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.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
>

   <!--配置自动扫描的包-->
   <context:component-scan base-package="handles"/>
   <!--配置视图解析器:如何把handle方法返回值解析为实际的物理视图-->
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <property name="prefix" value="/WEB-INF/views/"/>
       <property name="suffix" value=".jsp"/>
   </bean></beans>


说明:

  视图解析器用来解析视图。如上视图解析器配置有前缀和后缀两个属性,这样一来,view路径将会缩短。

4.创建请求处理器类(编写控制器)

说明:

  这里我们使用了注解@Controller ,可以表明了该类作为一个控制器,而不需要你扩展任何控制器基类或者引用ServletAPI。当然,如果需要还是可以引用特定Servlet功能。注解@Controller的基本目标是担任所注解的类的原型的角色,指明它的职责。

  所注解的控制器Bean可以被显示定义。@Controller也允许自动侦测。要实现队所注解的控制器的自动侦测,必须要像配置中加入组件扫描的部分的语句。  

<?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:p="http://www.springframework.org/schema/p"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd"
>


   <context:component-scan base-package="org.springframework.samples.petclinic.web"/>

   <!-- ... --></beans>

5.编写JSP页面(编写视图)

/WEB-INF/views/success.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>Title</title>
</head>
<body>
   Hello,World!
</body>
</html>

6.简单说明及测试

  控制器return返回了视图的名称,我们在SpringMVC 中设置了如何解析处理器返回值为视图。

  所以当我们访问/helloworld后我们会被处理器跳转到success.jsp页面。

如有文章对你有帮助,

在看”和转发是对我最大的支持!

刚刚整理好了的第五版《Java大厂面试题》,而且已经分类 25 PDF累计 2098页!

整理的面试题,内容列表


互联网大厂面试题,怎么领取?

 注意,不要乱回复 
(一定要回复 面试题 )否则获取不了

(加好友,还能邀请进Java群 


觉得不错,请点个在看

浏览 36
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报