一:三层架构和MVC

1、三层架构:

表现层: 也就是我们常说的web层。它负责接收客户端请求,向客户端响应结果,通常客户端使用http协议请求web层,web需要接收http请求,完成http响应。 表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。 表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端。 表现层的设计一般都使用MVC模型。(MVC是表现层的设计模型,和其他层没有关系)

业务层: 也就是我们常说的service层。它负责业务逻辑处理。web层依赖业务层,但是业务层不依赖web层。 业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。(也就是我们说的,事务应该放到业务层来控制)

持久层: 也就是我们是常说的dao层。负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库中。通俗的讲,持久层就是和数据库交互,对数据库表进行曾删改查的。

SpringMVC在三层架构的位置
在这里插入图片描述

2、MVC

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)这三大部分的缩写,是一种用于设计创建 Web 应用程序表现层的模式。MVC中每个部分各司其职:

Model:数据模型,JavaBean的类,用来进行数据封装

View:指JSP、HTML用来展示数据给用户。

Controller:用来接收用户的请求,整个流程的控制器。用来进行数据校验等。

3、SpringMVC概述

  1. 是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级WEB框架
  2. Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供
    了构建 Web 应用程序的全功能 MVC 模块。
  3. 使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的
    SpringMVC框架或集成其他MVC开发框架
    ,如Struts1(现在一般不用),Struts2等。

    二:SpringMVC的入门案例

    SpringMVC是基于Spring在web层开发,所以需要创建web-app工程。

    1、DispatcherServlet

DispatcherServlet:前端控制器,也是整个SpringMVC的核心控制器,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

配置核心控制器 -一个Servlet

<!--  配置前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

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

2、创建SpringMVC配置文件

SpringMVC是基于Spring开发,所以在配置文件中,仍然与Spring一致,并且加入xmlns:mvc,同时使用注解开发方便,还需加入xmlns:context

xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"

同时与Spring一样要 开启注解的支持<mvc:annotation-driven注解要扫描的包<context:component-scan

在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为SpringMVC的三大组件。

使用mvc:annotation-driven自动加载RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter(处理适配器),可用在SpringMVC.xml配置文件中使用mvc:annotation-driven替代注解处理器和适配器的配置。

<!-- 开启springmvc框架注解的支持-->
<mvc:annotation-driven></mvc:annotation-driven>

<!-- 开启注解要扫描的包-->
<context:component-scan base-package="cn.itcast"></context:component-scan>

同时在核心控制器 DispatcherServlet 中加入 在应用加载时加载SpringMVC的配置文件contextConfigLocation

<!--  配置前端控制器-->
<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:springmvc.xml</param-value>
</init-param>

<!-- 启动服务器就创建springmvc配置文件-->
<load-on-startup>1</load-on-startup>
</servlet>

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

3、配置视图解析器InternalResourceViewResolver

View Resolver负责将处理结果生成View视图(jsp),View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

<!-- 试图的解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 找什么目录下的什么类型的文件-->
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>

4、创建控制器并使用注解配置

@Controller表示这是个控制器
@RequestMapping注解作用: 用于建立请求URL和处理请求方法之间的对应关系。

例如在类中加入/user,在方法中加入/hello,则当url为项目名称/user/hello时就加载控制器

/**
* 控制器类
* @author Mango
*/
@Controller
@RequestMapping(path = "/user")
public class HelloController {

@RequestMapping(path = "/hello")
public String sayHello() {
System.out.println("hellc StringMVC");
//默认表示jsp文件名字
return "success";
}

/**
* RequestMapping注解
* @return
*/
@RequestMapping(path = "/testRequestMapping")
public String testRequsetMapping() {
System.out.println("测试 RequestMapping注解...");
return "success";
}
}

5、RequestMapping注解

属性:

value / path:用于指定请求的URL。它和path属性的作用是一样的。

method:用于指定请求的方式。例如 method=RequestMethod.POST。就只能以post请求

params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样。

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

headers:用于指定限制请求消息头的条件。

6、入门案例的执行过程及原理分析

在这里插入图片描述

1、案例执行过程

1、服务器启动,应用被加载。读取到web.xml中的配置创建spring容器并且初始化容器中的对象

<web-app>
<display-name>Archetype Created Web Application</display-name>

<!-- 配置前端控制器-->
<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:springmvc.xml</param-value>
</init-param>

<!-- 启动服务器就创建springmvc配置文件-->
<load-on-startup>1</load-on-startup>
</servlet>

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

</web-app>

2、浏览器发送请求,被DispatherServlet捕获,该Servlet并不处理请求,而是把请求转发出去。转发的路径是根据请求URL,匹配@RequestMapping中的内容。

/**
* 控制器类
* @author Mango
*/
@Controller
@RequestMapping(path = "/user")
public class HelloController {

@RequestMapping(path = "/hello")
public String sayHello() {
System.out.println("hellc StringMVC");

// 默认表示jsp文件名字
return "success";
}

/**
* RequestMapping注解
* @return
*/
@RequestMapping(path = "/testRequestMapping")
public String testRequsetMapping() {
System.out.println("测试 RequestMapping注解...");
return "success";
}

}

3、匹配到了后,执行对应方法。该方法有一个返回值(例如:success)。

4、根据方法的返回值,借助InternalResourceViewResolver(试图解析器)找到对应的结果视图
在这里插入图片描述
5、渲染结果视图,响应浏览器。

2、SpringMVC的请求响应流程

在这里插入图片描述