资讯专栏INFORMATION COLUMN

SpringMVC框架概览

IT那活儿 / 1913人阅读
SpringMVC框架概览

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!! 




主流的软件设计思想——MVC


MVC(Model&View&Controller)是一种软件设计的思想,它采用持久层模型(Model)-服务层视图(View)-控制层控制器(controller)的方法把业务逻辑、数据与界面显示分开。把众多的业务逻辑聚集到一个个部件里面,MVC的理念就是把数据处理、数据展示(界面)和程序/用户的交互三者分离开的一种编程模式。
  • Model(模型)

    又被称为数据库持久层,存储项目所有的数据库文件,独立于视图层和控制层。一个模型可以为多个视图来提供数据,所以模型的代码重复性比较低。

  • View(视图)

    作用是呈现模型,视图会从模型中拿到需要展现的状态以及数据,对于相同的数据可以有多种不同的显示形式(视图)。

  • Controller(控制器)

    负责获取前端页面请求信息,进行解析并反馈给视图层,通常情况下一个视图具有一个控制器,控制器不会输出也不会做出任何处理,只会接受请求并调用模型构件去处理用户的请求,然后在确定用哪个视图去显示返回的数据。

 


Web程序中MVC模式的优点

 

1. 耦合性低:视图(页面)和业务层(数据处理)分离,一个应用的业务流程或者业务规则的改变只需要改动MVC中的模型即可,不会影响到控制器与视图。
2. 部署快,成本低:MVC使开发和维护用户接口的技术含量降低。使用MVC模式使开发时间得到相当大的缩减,它使开发人员集中精力于业务逻辑,前端开发人员集中精力于表现形式上。
3. 方便测试。MVC把一个应用程序按功能分为不同的层次,每个层次独立性高,在测试时,可以根据不同层分开测试,大大增加了测试任务的逻辑性。
4. 快速定位错误。由于每层之间独立性高,每层出现错误的原因也大不相同,可以根据错误报告迅速定位出哪一层出现错误。



Web程序中MVC模式的缺点


1. 不适合小型,中等规模的应用程序
在一个中小型的应用程序中,强制性的使用MVC进行开发,往往会花费大量时间,并且不能体现MVC的优势,同时会使开发变得繁琐。
2. 增加系统结构和实现的复杂性
对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
3. 视图与控制器间的过于紧密的连接并且降低了视图对模型数据的访问
视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能 。



Spring MVC框架

 

现在MVC框架已经有很多了,Struts、Webwork,新兴的MVC框架有Spring MVC、JSF等等。
Struts1.0是基于webwork的MVC框架,里面有很多类的继承关系,耦合性太高,之后推出了struts2.0,但是这个MVC框架对于视图的解析还是存在一些小的不妥之处,所以产生了Spring MVC。
Spring MVC简介及特点
Spring MVC采用了松散耦合的可插拔组件结构,比其他的MVC框架更具有灵活性和扩展性,Spring MVC通过使用一套注解,使一个Java类成为前端控制器(Controller),不需要实现任何接口,同时,Spring MVC支持RESTFUL形式的URL请求,除此之外,Spring MVC在在数据绑定、视图解析、本地化处理及静态资源处理上都有许多不俗的表现。
Spring MVC围绕DispatcherServlet(前端控制器)为中心展开,DispatcherServlet(前端控制器)是Spring MVC的中枢,和MVC的思想一样,它负责从视图获取用户请求并且分派给相应的处理器处理,并决定用哪个视图去把数据呈现给给用户。 



SpringMVC的九大组件

 

1. MultipartResolver(文件处理器),对应的初始化方法是initMultipartResolver(context),用于处理上传请求。处理方法是将普通的request包装成MultipartHttpServletRequest,后者可以直接调用getFile方法获取File。
2. LocaleResolver(当前环境处理器),对应的初始化方法是initLocaleResolver(context),这就相当于配置数据库的方言一样,有了这个就可以对不同区域的用户显示不同的结果。
SpringMVC主要有两个地方用到了Locale:一是ViewResolver视图解析的时候;二是用到国际化资源或者主题的时候。
3. ThemeResolver(主题处理器),对应的初始化方法是initThemeResolver(context),用于解析主题。SpringMVC中一个主题对应一个properties文件,里面存放着跟当前主题相关的所有资源,如图片、css样式等。SpringMVC的主题也支持国际化。
4. HandlerMappings(处理器映射器),对应的初始化方法是initHandlerMappings(context),这就是根据用户请求的资源uri来查找Handler的。在SpringMVC中会有很多请求,每个请求都需要一个Handler处理,具体接收到一个请求之后使用哪个Handler进行处理就需要处理器映射器来映射。
5. HandlerAdapters(处理器适配器),对应的初始化方法是initHandlerAdapters(context),从名字上看,它就是一个适配器。Servlet需要的处理方法的结构却是固定的,都是以request和response为参数的方法。HandlerAdapters要做的事情是如何让固定的Servlet处理方法调用灵活的Handler来进行处理。
6. HandlerExceptionResolvers(异常处理器),对应的初始化方法是initHandlerExceptionResolvers(context),在SpringMVC中就是HandlerExceptionResolver对异常情况进行处理。
7. RequestToViewNameTranslator(视图名称翻译器),对应的初始化方法是initRequestToViewNameTranslator(context),有的Handler处理完后并没有设置View也没有设置ViewName,这时就需要从request获取ViewName了,如何从request中获取ViewName就是RequestToViewNameTranslator要做的事情了。
8. ViewResolvers(页面渲染处理器),对应的初始化方法是initViewResolvers(context),ViewResolver用来将String类型的视图名和Locale解析为View类型的视图。View是用来渲染页面的,也就是将程序返回的参数填入模板里,生成html(也可能是其它类型)文件。
9. FlashMapManager(参数传递管理器),对应的初始化方法是initFlashMapManager(context),用来管理FlashMap的,FlashMap主要用在redirect重定向中传递参数。

 


Spring MVC的执行步骤

 

  • 发起请求到前端控制器(DispatcherServlet)。

  • 前端控制器请求HandlerMapping查找 Handler,可以根据xml配置、注解进行查找。

  • 处理器映射器HandlerMapping向前端控制器返回Handler。

  • 前端控制器调用处理器适配器去执行Handler。

  • 处理器适配器去执行Handler。

  • Handler执行完成给适配器返回ModelAndView。

  • 处理器适配器向前端控制器返回ModelAndView,ModelAndView是springmvc框架的一个底层对象,包括 Model和view。

  • 前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图(jsp)。

  • 视图解析器向前端控制器返回View。

  • 前端控制器进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域。

  • 前端控制器向用户响应结果。

 


SpringMVC在IDEA中的配置

 

1. 首先,导入SpringMVC需要的jar包。
2. 添加Web.xml配置文件中关于SpringMVC的配置。
<servlet>
<servlet-name>springmvcservlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springmvc-servlet.xmlparam-value>
init-param>

servlet>

<servlet-mapping>
<servlet-name>springmvcservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
3. 在resources下添加springmvc-servlet.xml配置文件。
<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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"
>


<context:component-scan base-package="test.SpringMVC"/>

<mvc:default-servlet-handler />

<mvc:annotation-driven />


<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">


<property name="prefix" value="/WEB-INF/jsp/" />

<property name="suffix" value=".jsp" />
bean>

beans>
4. 在WEB-INF文件夹下创建名为jsp的文件夹,用来存放jsp视图。创建一个hello.jsp,在body中添加“Hello World”。
5. 建立包及Controller。
6. 编写Controller代码,如下所示:
@Controller
@RequestMapping("/mvc")
public class mvcController {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
}

 


SpringMVC的注解

 

@Controller
    负责注册一个bean 到spring 上下文中。
@RequestMapping
    注解为控制器指定可以处理哪些 URL 请求。
@RequestBody
    该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
@ResponseBody
    该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
@ModelAttribute    
    在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法。
    在方法的入参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数绑定到对象中,再传入入参将方法入参对象添加到模型中。
@RequestParam 
    在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法。
@PathVariable
    绑定 URL 占位符到参数。
@ExceptionHandler
    注解到方法上,出现异常时会执行该方法。
@ControllerAdvice
    使一个Contoller成为全局的异常处理类,类中用@ExceptionHandler方法注解的方法可以处理所有Controller发生的异常。

END



本文作者:朱凯方

本文来源:IT那活儿(上海新炬王翦团队)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129476.html

相关文章

  • 猫头鹰的深夜翻译:为什么要使用Spring Boot?

    摘要:初次使用的人往往会困惑,不知道该使用哪种方法。目前来说,团队推荐使用基于的方法来提供更高的灵活性。配置,从而在应用启动时执行脚本来初始化数据库。目前为止我们没有任何消息需要配置,所以只在文件夹中创建一个空的文件。将配置为,它包含的上下文。 前言 spring是一个用于创建web和企业应用的一个很流行的框架。和别的只关注于一点的框架不同,Spring框架通过投资并组合项目提供了大量的功能...

    Jaden 评论0 收藏0
  • 两年了,我写了这些干货!

    摘要:开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章系列处理登录请求前后端分离一使用完美处理权限问题前后端分离二使用完美处理权限问题前后端分离三中密码加盐与中异常统一处理 开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章! Spring Boo...

    huayeluoliuhen 评论0 收藏0
  • 不用 Spring Security 可否?试试这个小而美的安全框架

    摘要:写在前面在一款应用的整个生命周期,我们都会谈及该应用的数据安全问题。用户的合法性与数据的可见性是数据安全中非常重要的一部分。 写在前面 在一款应用的整个生命周期,我们都会谈及该应用的数据安全问题。用户的合法性与数据的可见性是数据安全中非常重要的一部分。但是,一方面,不同的应用对于数据的合法性和可见性要求的维度与粒度都有所区别;另一方面,以当前微服务、多服务的架构方式,如何共享Sessi...

    toddmark 评论0 收藏0
  • 手撕面试官系列(二):开源框架面试题Spring+SpringMVC+MyBatis

    摘要:跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来期间也没有准备充分,到底是因为技术原因影响自己的发展,偏移自己规划的轨迹,还是钱给少了,不受重视。 跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技...

    Flink_China 评论0 收藏0
  • springmvc简介和快速搭建

    摘要:简介和众多其他框架一样,它基于的设计理念,此外,它采用可松散耦合可插拔组件结构,比其他框架更具扩展性和灵活性。框架围绕核心展开,是框架的总导演,总策划,它负责截获请求并将其分派给相应的处理器处理。 springmvc简介 springmvc和众多其他web框架一样,它基于MVC的设计理念,此外,它采用可松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性。 springmvc通过...

    Sike 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<