SpringMVC

Posted 草莓牛奶~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC相关的知识,希望对你有一定的参考价值。

一、Sprig MVC简介

1.1介绍

Spring MVC是Spring Framework提供的Web组件,全称是Spring Web MVC,是目前主流的实现MVC设计模式的框架,提供前端路由映射、视图解析等功能。

Java Web开发者必须要掌握的技术框架

1.2为什么要使用SpringMVC?

很多应用程序的问题在于处理业务数据的对象和显示业务数据的视图之间存在紧密耦合,通常,更新业务对象的命令都是从视图本身发起的,使视图对任何业务对象更改都有高度敏感性。而且,当多个视图依赖于同一个业务对象时是没有灵活性的。
SpringMVC是一种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将Web层进行职责解耦。基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringMVC也是要简化我们日常Web开发。(简单一句话:减少耦合性,简化开发)

1.3MVC设计模式

MVC设计模式的任务是将包含业务数据的模块与显示模块的视图解耦。这是怎样发生的?在模型和视图之间引入重定向层可以解决问题。此重定向层是控制器,控制器将接收请求,执行更新模型的操作,然后通知视图关于模型更改的消息。

1.3springMVC的执行流程如下:

详细流程: SpringMVC 的执行流程如下。
1. 用户点击某个请求路径,发起一个 HTTP request 请求,该请求会被提交到 DispatcherServlet(前端控制器); 2. 由 DispatcherServlet 请求一个或多个 HandlerMapping(处理器映射器),并返回一个执 行链(HandlerExecutionChain)。 3. DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配 器); 4. HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(常称为 Controller); 5. Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的 底层对象,包括 Model 数据模型和 View 视图信息); 6. HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ; 7. DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对 视图进行解析; 8. ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet; 9. DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充 到 View 视图中的 request 域,生成最终的 View(视图); 10. 视图负责将结果显示到浏览器(客户端)。

 二、操作步骤

1. 创建 web 项目,并导入需要的 jar

 

 2.index.jsp页面中创建一个a标签,执行一个地址请求

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
<h2>欢迎来到项目首页</h2>
<h3><a href="test">请求测试</a></h3>
</body>
</html
3. web.xml 中配置 springMVC 的核心控制器 DispatcherServlet ,同时设置它创建的时候加载 springmvc 的核心配置文件 springmvc.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_4_0.xsd"
         version="4.0">
<!--配置springMVC的核心控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--初始化:DispatcherServlet创建的时候加载springmvc.xml配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!--配置加载的时机:非0表示服务器启动是就进行加载-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
4. src 目录下创建核心配置文件 springmvc.xml ,扫描控 制器的包、配置视图解析器、开启注解驱动支持(默认配置 HandlerMapping 映射器 和 HandlerAdapter 适配 器)
<?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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <context:component-scan base-package="com.su.controller"/>
<!--视图解析器-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--视图查找的位置-->
        <property name="prefix" value="/"/>
        <!--视图对应的后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
<!--开启注解支持:默认配置 HandlerMapping映射器 和 HandlerAdapter适配器-->
    <mvc:annotation-driven/>
</beans>
5. 书写处理器,即我们的 Controller ,首先把类使用 @Controller 标识,标识该类交给 IOC 容器管理,其次在方 法上指定映射关系。
package com.su.controller;

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

@Controller
public class TestController 
    @RequestMapping("/test")
    public String test()
        System.out.println("TestController...test");
        return "zhuye";
    

SpringMVC概述+SpringMVC运行流程+SpringMVC搭建

SpringMVC

SpringMVC概述

首先我们了解一下经典的MVC模式,MVC全称Model View Controller,M指业务模型,V指用户界面,C指控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。Spring MVC属于SpringFrameWork的后续产品。

SpringMVC是Spring框架的一个模块,SpringMVC和Spring无需通过中间整合层进行统一整合,已经融合在Spring Web Flow里面。SpringMVC是一个基于MVC的web框架,方便前后端进行数据的传输。SpringMVC拥有控制器,接收外部请求,解析参数传给服务层。

SpringMVC的运行流程

我们回顾一下我们使用Servlet来完成web项目,如下图:

在这里插入图片描述

使用Servlet来完成web项目时,我们通过Servlet来处理用户页面和数据库之间的数据交互,那时候我们所有的Servlet层代码都需要我们自己去写入,并且会有大量的“重复”代码,严重降低了我们开发的效率,使我们不能专注于业务,SpringMVC就可以很好的为我们解决这一问题。

在这里插入图片描述

1.用户向服务器发送请求,请求被Spring前置控制器DispatcherServlet捕获;

2.前端控制器DispatcherServlet接收到请求后,调用映射处理器HandlerMapping。处理器HandlerMapping根据请求的url找到处理该请求的处理器Handler(即Controller),将处理器Handler返回给前端控制器DispatcherServlet。

3.DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。在填充Handler的入参过程中,根据配置,Spring会做出一些额外的工作:

(1)HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应消息。

(2)数据转换:对请求消息进行数据转换。如String转换为Integer、Double等。

(3)数据格式化:对请求消息进行数据格式化。如将字符串转换为格式化数字或格式化日期等等。

(4)数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。

4.Handler控制器执行完毕后,会向DispatcherServlet返回一个ModelAndView对象。

5.根据返回的ModelAndView,选择一个适合的ViewResolver视图解析器(必须是已经注册到Spring中的视图解析器)返回给DispacherServlet;

6.ViewResolver结合Model和View来渲染视图;

7.将渲染后的结果响应给客户端。

搭建SpringMVC

搭建完整的SpringMVC项目需要在spring的基础上进行,大家可以阅读我的这几篇文章进行学习

学习Spring之前必读的文章,Spring框架第0章(Spring核心+优点+体系结构+简单搭建)

Spring框架的IOC设计思想+Spring的Bean管理

一文搞懂SpringAOP(面向切面编程)

Spring事务特征+Spring事务管理+实现+Spring七种事务传播行为+集成MyBatis

1.导入SpringMVC的相关jar包

<!--SpringMVC依赖的jar包-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

如果使用jsp的el表达式,还需要导入jstl的jar包

<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

<!--加servlet-->
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.0</version>
    <scope>provided</scope>
</dependency>

2.配置DispatcherServlet

DispatcherServlet是从HttpServlet中继承而来。所以它是一个标准的Servlet,因此我们需要在web.xml文件中进行配置,使它在启动时加载Spring配置文件。

在web.xml文件中配置:

	<!--配置spring核心请求分发的的DisPatcherServlet-->
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!--把Spring的配置文件交给contextConfogLocation-->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring.xml</param-value>
        </init-param>
        <!--服务器启动时就初始化DispatcherServlet和启动 spring-->
        <load-on-startup>0</load-on-startup>
    </servlet>
    <!--
        请求映射
        所有的请求都会进入DispatcherServlet(分发器)
    -->
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

3.开启SpringMVC注解

在Spring.xml文件中配置开启SpringMVC注解

<!--开启SpringMVC的注解功能-->
<mvc:annotation-driven></mvc:annotation-driven>

4.配置视图解析器

在Spring.xml文件中配置视图解析器

<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
    <!--控制器返回的所有视图界面的prefix(前缀)都要为value-->
    <property name="prefix" value="/WEB-INF/pages/"></property>
    <!--控制器返回的所有视图界面的suffix(后缀)都要为value-->
    <property name="suffix" value=".jsp"></property>
</bean>

5.控制器类的搭建

我们使用@Controller注解标签标记SpringMVC的Controller对象,即控制器类。同时,我们也要使用RequestMapping注解来标记请求地址映射,可用在类或方法上。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;


@Controller//扫描到这个类后交给IOC管理,用于创建对象,默认是单例的,多线程情况下线程不安全
@RequestMapping(path = "/user")//指定一个映射的地址,属性为value或path都一样,可以指定多个,
public class UserController {

    @RequestMapping(path = "/toLogin")//指定请求方式
    public ModelAndView toLogin() {
        System.out.println("toLogin");
        ModelAndView mv = new ModelAndView("login");;
        return mv;
    }

}

这时当我们要访问toLogin()方法是的路径就是/user/toLogin

以上是关于SpringMVC的主要内容,如果未能解决你的问题,请参考以下文章

6.30学习进度

Spring概念

[转]Spring面试题

spring面试题

69道Spring面试题和答案

BATJ面试必会之 Spring 篇(一)