【Java学习笔记(四十七)】之SpringMVC原理,开发步骤,组件调用流程,注解解析

本文章由公号【开发小鸽】发布!欢迎关注!!!


老规矩–妹妹镇楼:

一. Spring集成web环境

(一) ApplicationContext应用上下文获取方式

       应用上下文对象是通过new ClassPathXmlApplicationContext(Spring配置文件)方式获取的,但是这样每次从容器中获取Bean对象时都要创建一次应用上下文对象,很麻烦,且十分低效。

       因此,我们想到将应用上下文对象放到最大的域中共享。在Web项目中,可以使用ServletContextListener监听Web应用的启动,我们可以在Web项目启动时,就加在Spring的配置文件,创建应用上下文对象ApplicationContext,再将该对象存储到最大的域servletContext域中,这样既可以在任意位置从域中获取应用上下文对象ApplicationContext了。

(二) 自定义监听器

       自定义一个监听器监听服务器的启动,加载配置文件,存储app应用上下文对象。

public class ContextLoaderListener implements ServletContextListener{
		public void contextInitialized(ServletContextEvent servletContextEvent){
			ApplicationContext app = new ClassPathXmlApplicationContext(“applicationContext.xml”);
			ServletContext servletContext = servletContextEvent.getServletContext();
			servletContext.setAttribute(“app”, app);
		}
}

(三) Spring封装监听器

       Spring提供了一个监听器ContextLoaderListener,该监听器加载了Spring配置文件,创建应用上下文对象,并存储到ServletContext域中,并且提供了一个工具WebApplicationContextUtils供使用者获取应用上下文对象。

       这样一来,我们要做的事情就少了很多,只需要:

       1. 在web.xml中配置ContextLoaderListener监听器,提供配置文件的名称给监听器,同时还要导入spring-web的坐标。

配置监听器的class:

<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

       还要在web.xml中提供配置文件的名称给监听器,用全局初始化参数来配置:

<!—全局初始化参数-->
<context-parm>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:applicationContext.xml</param-value>
</context-parm>

注意,路径名前面要加上classpath:

       2. 使用WebApplicationContextUtils获取应用上下文对象ApplicationContext。

ServletContext servletContext =this.getServletContext();
ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(servletContext);

二. SpringMVC

(一) 概述

       SpringMVC是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架。

(二) SpringMVC原理

       客户端向服务器发送请求 ,服务器接收到了请求后,会封装代表请求的request对象,和代表响应的response对象,并调用服务器中相应的Servlet资源。

       web层中Servlet的行为分为公有行为和特有行为,公有行为如接受数据,指定视图等等,特有行为指的是不同的特有功能,如表单数据的校验,Cookie的编写。因此,我们可以把公有行为抽取为一个前端控制器,SpringMVC框架中的前端控制器是一个Servlet。特有行为抽取为POJO(简单JavaBean对象),用于不同的功能。因此,服务器在请求资源时,先经过前端控制器使用一些共有的功能,再通过POJO来调用不同的功能。

(三) SpringMVC的开发步骤

       1. 导入SpringMVC的包,注意,要导入spring-webmvc和spring-web的坐标。

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>5.0.5.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.0.5.RELEASE</version>
</dependency>

       2. SpringMVC使用Servlet作为前端控制器,因此要配置Servlet,即SpringMVC的核心DispatcherServlet。在web.xml中配置Servlet,像一般的Servlet一样进行配置,配置就是创建一个DispatcherServlet。

<servlet>
		<servlet-name>DispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>DispatcherServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

       注意: url-pattern 取为“/”意思是所有的请求都要经过DiapatcherServlet

       3. 编写POJO特有功能,在SpringMVC中,把POJO称为控制器Controller,控制每种功能特有的工作,如调用业务层,指派视图。
       创建controller包,在包中创建各个功能类,如创建UserController类,返回success,jsp视图:

package com.springmvc.controller;


public class UserController {

    public String save(){
        System.out.println("Controller save running");
        return "success.jsp";
    }
}

       4. 将Controller控制器,使用注解配置到Spring容器中,由于这是web层,因此可以使用@Controller。同时还要配置Controller类中业务方法的映射地址,因为请求需要知道要调用哪个Controller类中的哪个方法才能实现功能。在save方法上用注解@RequestMapping(“/quick”),表示服务器在访问quick资源时就会映射到UserController类中的save方法了。

package com.springmvc.controller;

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

@Controller
public class UserController {

    @RequestMapping("/quick")
    public String save(){
        System.out.println("Controller save running");
        return "success.jsp";
    }
}

       5. 有了注解,就要配置组件扫描,使用context命名空间的component-scan,定义在Spring-mvc.xml文件进行配置,这是SpringMVC自己的配置文件。因此只需要设置base-package为controller包即可,service层,dao层的组件扫描可以在applicationContext.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.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">

<!--    Controller组件扫描-->
    <context:component-scan base-package="com.springmvc.controller"/>

</beans>

       同时,还要让spring-mvc.xml这个配置文件加载到springMVC中,而SpringMVC的核心是DispatcherServlet,因此在配置Servlet时加载spring-mvc.xml,因此在web.xml中同样是使用全局初始化参数:

<servlet>
  <servlet-name>DispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-mvc.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>

(四) SpringMVC的流程操作

       1. 客户端发送请求到Tomcat引擎,该引擎接受请求,解析请求资源地址。

       2. Tomcat引擎封装请求对象request,响应对象response,调用目标资源。

       3. 通过Service(req, resp)方法获取请求资源的地址,映射访问真实资源,即Controller类中的方法。

       4. 方法执行后,响应对象response封装成http响应返回给客户端。


三. SpringMVC的组件

(一) SpringMVC的组件调用

       1. 前端控制器DispatcherServlet只是一个调度器,并没有执行具体的功能,它只是调用SpringMVC中的不同组件。

       2. 前端控制器通过请求查询Handler到HandlerMapping处理器映射器中查询要执行哪些资源,才能拿到请求的资源,处理器映射器返回的是处理器执行链HandlerExecutionChain,这是一连串的资源执行顺序。

       3. 前端控制器拿到HandlerExecution处理器执行链后,再去通过请求执行Handler调用HandlerAdaptor处理器适配器,然后它会请求处理器Handler,即我们写的POJO(Controller)执行相应的操作。Handler返回响应给HandlerAdaptor,HandlerAdaptro返回模型和视图ModelAndView给前端控制器。

       4. 前端控制器拿到ModelAndView之后,要展示视图,因此通过请求视图解析器ViewResolver,解析视图并返回View视图对象给前端控制器。

       5. 前端控制器拿到View对象后,请求渲染视图页面,即将模型数据填充到视图中,并将渲染后的视图返回给客户端。

(二) SpringMVC的注解解析

1. @RequestMapping

       用于建立请求URL和Controller类中的处理请求方法之间的对应关系,一般放置在Controller类上或者方法上。

(1) 放在Controller类上

       当注解@RequestMapping()放在Controller类上时,代表这是请求URL的第一级访问目录,如果此处不写注解,那么就相当于应用的根目录。

       如,@RequestMapping(“/first”)代表着请求URL的第一级访问目录为first,则在浏览器中输入请求URL时,就要先输入/first。

(2) 放在方法上

       @RequestMapping()注解放在方法上,代表着请求URL的第二级访问目录,与类上定义的一级访问目录一起组成了访问的虚拟路径。

       如,@RequestMapping(“/second”),如果没有第一级路径,则直接用localhost:8080/quick访问这个方法;如果类上的注解定义第一级路径为/first,则访问路径为 localhost:8080/first/second

(3) 属性

value属性
       用于指定请求的URL,就是上面所说的一级二级目录。

method属性
       用于指定请求的方式,如GET或者POST,且只能够以这种方式请求访问,如果以其他的方式则会报错。

       如,method=RequestMethod.GET

params属性
       params用于指定限制请求参数的条件,可以限制必须有什么参数或者不能有什么参数。

       如,params={“accountName”}表示请求参数中必须有accountName

       params={“money!100”}表示请求参数中money不能是100

(三) SpringMVC的XML配置解析

       SpringMVC有默认的组件配置,默认组件都是在DispatcherServlet.properties配置文件中配置的,该配置文件的地址是 org.springframework.web.servlet.DispatcherServlet.properties,该文件中配置了默认的视图解析器

如:

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResovler

       要想配置内部资源解析器,通过在spring-mvc.xml文件中创建一个bean对象,设置资源的前缀prefix和后缀suffix,如设置只解析前缀为/jsp/,后缀为.jsp的视图。

<bean id=”viewResolver” class=”org.springframework.web.servlet.view.InternalResourceViewResolver”>
		<property name=”prefix” value=”/jsp/”></property>
		<property name=”suffix” value=”.jsp”></property>
</bean>
©️2020 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页