javaee springmvc

Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型。SpringMVC是Spring框架的一个模块,SpringMVC和Spring无需通过中间整合层进行整合。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

Spring 的 Web MVC 框架是围绕DispatcherServlet 设计的,它把请求分派给处理程序,同时带有可配置的处理程序映射、视图解析、本地语言、主题解析以及上载文件支持。应用控制器其实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理,页面控制器是非常简单的 Controller 接口,只有一个方法 ModelAndView handleRequest(request, response)。Spring 提供了一个控制器层次结构,可以派生子类。如果应用程序需要处理用户输入表单,那么可以继承 AbstractFormController。如果需要把多页输入处理到一个表单,那么可以继承 AbstractWizardFormController。

一、Sverlet注册
我们需要在web.xml中注册DispatcherServlet,DispatcherServlet是springMVC中唯一的一个Servlet.

配置 Spring MVC的DispatcherServlet
在这里插入图片描述在这里插入图片描述

这里有两个配置文件——“init-param”与“context-param”,区别如下:

中的配置文件的作用对象是整个application,是上下文参数,spring框架在加载web配置文件的时候,首先加载的是配置的内容,而并不会去初始化servlet。而中的文件是属于Dispatcher-servlet的,只有进行了网站的跳转,经过了DispatcherServlet的导航的时候,才会初始化servlet,从而加载中的内容。

配置需要通过DIspatcherServlet处理的URL
在这里插入图片描述

二、IoC容器创建
IOC:也即控制反转,DI即依赖注入,控制反转IOC和依赖注入DI其实就是同个概念的两个不同角度的解释。

控制反转可以理解为获取依赖对象的控制反转过来。

若有两个类,类A和类B,若类A依赖与类B,则类A要获取类B的方法,这时我们可以按照传统的JavaSE思想,在A类里,写代码B b = new B();,通过new关键字获取A类的依赖对象,或者通过工厂模式进行获取,当然还有等等其它方法。这些方法,就属于正转的方法,因为A类获取B类就是通过主动的方法进行获取的,统称为正转的方法。
然后,什么是反转呢?既然正转是主动的方式,那么反转就是被动的方式。也即我们要获取某个类的依赖对象,不需要类主动去获取。然后在Spring框架里是怎么实现的呢?在Spring框架里,是通过IOC容器实现的,由IOC容器负责创建和获取依赖对象,对象只是被动地接受依赖对象。

org.springframework.context.ApplicationContext接口代表了Spring Ioc容器,它负责实例化、配置、组装之前的beans。容器通过读取配置元数据获取对象的实例化、配置和组装的描述信息。它配置的元数据用xml、Java注解或Java代码表示。它允许你表示组成你应用的对象以及这些对象之间丰富的内部依赖关系。

Spring提供几个开箱即用的ApplicationContext接口的实现类。在独立应用程序中通常创建一个ClassPathXmlApplicationContext或FileSystemXmlApplicationContext实例对象。虽然XML是用于定义配置元数据的传统格式,你也可以指示容器使用Java注解或代码作为元数据格式,但要通过提供少量XML配置来声明启用对这些附加元数据格式的支持。

根据xml文件创建IoC容器

如果是通过xml文件配置的bean,则通过以下两种方式创建IoC容器

在这里插入图片描述
根据注解创建IoC文件

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(org.example.spring.mvc.jdbc.StudentHomeWorkJdbc.class);

三、Bean初始化

1、Bean基本概念
在Spring中,由Spring IoC容器管理的对象叫做beans。 bean就是由Spring IoC容器实例化、组装和以其他方式管理的对象。此外bean只是你应用中许多对象中的一个。Spring框架中,一旦把一个Bean纳入到Spring IoC容器之中,这个Bean的生命周期就会交由容器进行管理。

bean 定义包含称为配置元数据的信息,下述容器也需要知道配置元数据:
如何创建一个 bean
bean 的生命周期的详细信息
bean 的依赖关系
上述所有的配置元数据转换成一组构成每个 bean 定义的下列属性。

属性
class 这个属性是强制性的,并且指定用来创建 bean 的 bean 类。
name 这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符。
scope 这个属性指定由特定的 bean 定义创建的对象的作用域
constructor-arg 它是用来注入依赖关系的
properties 它是用来注入依赖关系的
autowiring mode 它是用来注入依赖关系的
lazy-initialization mode 延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例。
initialization 方法 在 bean 的所有必需的属性被容器设置之后,调用回调方法。
destruction 方法 当包含该 bean 的容器被销毁时,使用回调方法。

2、Bean的作用域
当在 Spring 中定义一个 时,你必须声明该 bean 的作用域的选项。例如,为了强制 Spring 在每次需要时都产生一个新的 bean 实例,你应该声明 bean 的作用域的属性为 prototype。同理,如果你想让 Spring 在每次需要时都返回同一个bean实例,你应该声明 bean 的作用域的属性为 singleton。

Spring 框架支持以下五个作用域,如果你使用 web-aware ApplicationContext 时,其中三个是可用的。

作用域 描述
singleton 该作用域将 bean 的定义的限制在每一个 Spring IoC 容器中的一个单一实例(默认)。
prototype 该作用域将单一 bean 的定义限制在任意数量的对象实例。
request 该作用域将 bean 的定义限制为 HTTP 请求。只有在web 应用中才会生效
session 该作用域将 bean 的定义限制为 HTTP 会话。 只有在web 应用中才会生效
global-session 该作用域将 bean 的定义限制为全局 HTTP 会话。只有在portlet context中有效
singleton 作用域:

如果作用域设置为 singleton,那么 Spring IoC 容器刚好创建一个由该 bean 定义的对象的实例。该单一实例将存储在这种单例 bean 的高速缓存中,以及针对该 bean 的所有后续的请求和引用都返回缓存对象。

prototype 作用域

如果作用域设置为 prototype,那么每次特定的 bean 发出请求时 Spring IoC 容器就创建对象的新的 Bean 实例。一般说来,满状态的 bean 使用 prototype 作用域和没有状态的 bean 使用 singleton 作用域。

3、Bean的生命周期
实例化一个Bean(由BeanFactory读取Bean定义文件,并生成各个实例)--也就是我们常说的new;
按照Spring上下文对实例化的Bean的属性值进行设置--也就是IOC注入;
如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值
如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);
如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);
如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法
初始化之前构造注入依赖之后执行

如果Bean类实现了org.springframework.beans.factory.InitializingBean接口,则执行其afterPropertiesSet()方法。
一般是用来在实例构造完成后,实例的应该注入的依赖属性已经完成注入,需要对不需要注入的实例属性进行自定义初始化配置;当然也可指定一个init-method方法完成初始化,两者的作用一样,都是完成用户自定义初始化。对于单例,如果bean实现了InitializingBean接口则afterPropertiesSet方法只会被调用一次;否则每次创建bean时afterPropertiesSet方法都会被重新调用。

如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。
或者使用@PostConstruct后构造注解来将任意方法名称的方法标明为一个init-method方法

如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法;
注:以上工作完成以后就可以应用这个Bean了,如果这个Bean是一个Singleton的,则将这准备就绪的Bean放入Spring缓存池中,已被下次使用,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,此时不会将Bean放入缓存池中,而是直接将控制权交给Bean的使用者。

当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;
最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
可以使用@PreDestroy前销毁注解,标明一个方法为destroy-method

说明如果Bean是由BeanFactory管理,则没有第五步,同样如果由ApplicationContext管理,则没有第四步。

4、bean的配置

  1. 通过xml文件配置
  2. 通过注解方式配置
    首先在spring配置文件中开启注解扫描
    在这里插入图片描述

使用注解声明bean

@Component(“jdbc”)
public class StudentHomeWorkJdbc {
//
}

  1. 基于java类的配置
    使用@Configuration注解需要作为配置的类,表示该类将定义Bean的元数据
    使用@Bean注解相应的方法,该方法名默认就是Bean的名称,该方法返回值就是Bean的对象。
    AnnotationConfigApplicationContext或子类进行加载基于java类的配置
    一个用@Configuration注解的类说明这个类的主要是作为一个bean定义的资源文件。进一步的讲,被@Configuration注解的类通过简单地在调用同一个类中其他的@Bean方法来定义bean之间的依赖关系。简单的@Configuration配置类如下所示:

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

在这里插入图片描述
上面的AppConfig类和Spring XML 的配置是等价的:

四、MVC的流程
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。
通过策略接口,Spring MVC是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)、Velocity、Tiles、iText和POI。
使用 Spring 可插入的MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。
Spring MVC是一个完全基于MVC模式(Model、View、Controller)的框架。
Spring MVC 的工作流程图

流程
① 用户发送请求至前端控制器 DispatcherServlet。前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;

② DispatcherServlet访问HandlerMapping(处理器映射器), HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;

③ 返回HandlerExecutionChain对象

④ DispatcherServlet调用HandlerAdapter(处理器适配器),HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;

⑤ HandlerAdapter调用处理器相应功能处理方法,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名)

⑥ 返回ModelAndView对象

⑦ HandlerAdapter将ModelAndView对象返回到前端控制器DispatcherServlet。

⑧ DispatcherServlet将ModelAndView的逻辑视图名发送给ViewResolver(视图解析器), ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;

⑨返回视图对象

⑩ View进行视图渲染,View会根据传进来的Model模型数据进行渲染。

⑪ 返回渲染后的视图

⑫ 返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

相关组件
前端控制器DispatcherServlet(不需要程序员开发) 作用:接收请求,响应结果,相当于转发器,中央处理器。 有了DispatcherServlet减少了其它组件之间的耦合度。
处理器映射器HandlerMapping(不需要程序员开发) 作用:根据请求的url查找Handler
处理器适配器HandlerAdapter 作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
处理器Handler(需要程序员开发) 编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
视图解析器View resolver(不需要程序员开发) 作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
视图View(需要程序员开发jsp) View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值