欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring入门(十二):Spring MVC使用讲解

程序员文章站 2022-05-29 09:54:50
1. Spring MVC介绍 提到MVC,参与过Web应用程序开发的同学都很熟悉,它是展现层(也可以理解成直接展现给用户的那一层)开发的一种架构模式,M全称是Model,指的是数据模型,V全称是View,指的是视图页面,如JSP、Thymeleaf等,C全称是Controller,指的是控制器,用 ......

1. spring mvc介绍

提到mvc,参与过web应用程序开发的同学都很熟悉,它是展现层(也可以理解成直接展现给用户的那一层)开发的一种架构模式,m全称是model,指的是数据模型,v全称是view,指的是视图页面,如jsp、thymeleaf等,c全称是controller,指的是控制器,用来处理用户在客户端(浏览器)发起的请求。

spring mvc就是基于mvc模式实现,能够帮你构建像spring框架那样灵活和松耦合的web应用程序。

也就是说,spring mvc是基于spring的,它主要用来开发web应用程序。

2. spring mvc请求流程

在web应用程序中,请求是必不可少的,每次请求由用户(客户端)发起,到用户(客户端)接收到响应结束,下图展示了一个请求在spring mvc中所经历的每个流程:

Spring入门(十二):Spring MVC使用讲解

接下来我们对图中的每个流程做下讲解:

  1. 请求离开浏览器时(图中的①),会带有用户所请求内容的信息,比如请求的url和提交的表单信息。
  2. 然后进入到请求的第一站,即spring的dispatcherservlet,它的任务是将请求发送给spring mvc控制器。
  3. 因为在应用程序中会有多个控制器,因此dispatcherservlet会查询一个或多个处理器映射(handler mapping),处理器映射会根据请求所携带的url来确定应该将请求发送给哪个控制器(图中的②)。
  4. 确定好控制器后,dispatcherservlet会将请求发送给确定好的控制器,然后等待控制器处理用户提交的信息,不过一般情况下,控制器本身几乎不处理工作,而是将业务逻辑委托给一个或多个服务对象进行处理(图中的③)。
  5. 控制器完成业务逻辑处理后,通常会产生一些模型(model)信息,这些信息需要返回给用户并在浏览器上显示,为了更友好的展示这些信息,比如以html形式展示,我们需要将信息发送给一个视图(view),比如jsp、thymeleaf。
  6. 控制器所做的最后一件事就是将模型数据打包,并且标示出用于渲染输出的视图名,它会将请求连同模型和视图名发送回dispatcherservlet(图中的④),不过控制器只会返回一个视图的逻辑名称,而不是返回具体的某个特定视图,这个逻辑名称将会用来查找产生结果的真正视图。dispatcherservlet会使用视图解析器(view resolver)来将逻辑视图名匹配为某个特定视图(图中的⑤),比如jsp或者thymeleaf。
  7. 请求的最后一站是视图的实现(图中的⑥),在这里视图将使用模型数据渲染输出,这个输出会通过响应对象传递给用户/客户端(图中的⑦)。

了解了spring mvc的请求流程后,我们来接着了解下如何搭建和配置spring mvc项目。

3. 搭建spring mvc项目

我们仍然延用之前博客中新建的spring-action项目,有兴趣的同学可以看下本系列的前11篇博客或者直接下载源码:。

3.1 添加依赖

要想使用spring mvc,首先我们需要在pom.xml中添加如下依赖:

<dependency>
    <groupid>org.springframework</groupid>
    <artifactid>spring-webmvc</artifactid>
    <version>4.3.18.release</version>
</dependency>

<!-- 其他web依赖 -->
<dependency>
    <groupid>javax.servlet</groupid>
    <artifactid>jstl</artifactid>
    <version>1.2</version>
</dependency>
<dependency>
    <groupid>javax.servlet</groupid>
    <artifactid>javax.servlet-api</artifactid>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

因为后面要将项目部署到tomcat,所以我们在pom.xml中配置下打包方式为war包:

<packaging>war</packaging>

<build>
    <plugins>
        <!--其他配置-->
        <plugin>
            <groupid>org.apache.maven.plugins</groupid>
            <artifactid>maven-war-plugin</artifactid>
            <version>3.2.3</version>
            <configuration>
                <failonmissingwebxml>false</failonmissingwebxml>
            </configuration>
        </plugin>
    </plugins>
</build>

3.2 新建演示页面

在src/main/resources下新建views目录,然后在此目录下新建index.jsp页面如下所示:

<%@ page contenttype="text/html;charset=utf-8" language="java" pageencoding="utf-8" %>
<html>
<head>
    <title>spring mvc</title>
</head>
<body>
    <pre>
        welcome to spring mvc world
    </pre>
</body>
</html>

这里可能存在的问题是,右键新建jsp文件时,没有jsp文件模板,就像下面这样:

Spring入门(十二):Spring MVC使用讲解

解决方案如下所示:

依次点击file--project structure,打开project structure对话框,左侧选中modules,然后点击+号,选择web

Spring入门(十二):Spring MVC使用讲解

Spring入门(十二):Spring MVC使用讲解

Spring入门(十二):Spring MVC使用讲解

此时再次右键新增jsp文件,就会看到jsp文件模板:

Spring入门(十二):Spring MVC使用讲解

此时项目根目录会生成1个web文件夹,可以将其删除。

Spring入门(十二):Spring MVC使用讲解

Spring入门(十二):Spring MVC使用讲解

3.3 spring mvc配置

新建配置类mymvcconfig如下所示:

package chapter05.config;

import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.componentscan;
import org.springframework.context.annotation.configuration;
import org.springframework.web.servlet.config.annotation.enablewebmvc;
import org.springframework.web.servlet.view.internalresourceviewresolver;
import org.springframework.web.servlet.view.jstlview;

/**
 * spring mvc配置
 */
@configuration
@enablewebmvc
@componentscan("chapter05")
public class mymvcconfig {
    /**
     * 视图解析器配置
     *
     * @return
     */
    @bean
    public internalresourceviewresolver viewresolver() {
        internalresourceviewresolver viewresolver = new internalresourceviewresolver();

        viewresolver.setprefix("/web-inf/classes/views/");
        viewresolver.setsuffix(".jsp");
        viewresolver.setviewclass(jstlview.class);

        return viewresolver;
    }
}

注意事项:

1)该配置类使用了@enablewebmvc注解来启用spring mvc,它会开启一些默认配置。

2)该配置类配置了视图解析器,这里我们配置的是jsp的视图解析器。

视图解析器中,我们设置了前缀和后缀,如果控制器中返回的逻辑视图名称是index,实际渲染时找的视图就是/web-inf/classes/views/index.jsp,为什么设置的前缀是/web-inf/classes/views/而不是/src/main/resources/views/呢,那是因为项目编译完运行时的目录是/web-inf/classes/views/。

Spring入门(十二):Spring MVC使用讲解

如果编译完成该目录下没有jsp文件,则需要在pom.xml中添加如下配置:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.jsp</include>
                <include>**/*.js</include>
            </includes>
        </resource>
    </resources>
</build>

3.4 web配置

新建web配置类webinitializer如下所示:

package chapter05.config;

import org.springframework.web.webapplicationinitializer;
import org.springframework.web.context.support.annotationconfigwebapplicationcontext;
import org.springframework.web.servlet.dispatcherservlet;

import javax.servlet.servletcontext;
import javax.servlet.servletexception;
import javax.servlet.servletregistration.dynamic;

public class webinitializer implements webapplicationinitializer {
    @override
    public void onstartup(servletcontext servletcontext) throws servletexception {
        annotationconfigwebapplicationcontext context = new annotationconfigwebapplicationcontext();
        context.register(mymvcconfig.class);
        context.setservletcontext(servletcontext);

        dynamic servlet = servletcontext.addservlet("dispatcher", new dispatcherservlet(context));
        servlet.addmapping("/");
        servlet.setloadonstartup(1);
    }
}

这里重点要关注的是,该类实现了接口webapplicationinitializer并重写了onstartup()方法,webapplicationinitializer类是spring提供用来配置servlet 3.0+版本配置的接口,从而可以替代掉web.xml。

3.5 新建控制器

新建控制器hellocontroller如下所示:

package chapter05.controller;

import org.springframework.stereotype.controller;
import org.springframework.web.bind.annotation.requestmapping;

@controller
public class hellocontroller {
    @requestmapping("/index")
    public string hello() {
        // 这里返回的逻辑视图名
        return "index";
    }
}

上面代码中的@controller注解声明这是1个控制器,@requestmapping("/index")用来配置url映射,现在问题来了,我们如何查看代码的运行效果呢?

这就涉及到了项目打包和项目部署,我们继续往下看。

4. 项目部署到tomcat中

4.1 打包(war包)

因为我们的项目是通过maven管理的,在pom.xml中也配置了打包方式为war包和打包插件,所以我们可以在idea的右侧找到maven资源管理器,然后如下图所示,点击clean:

Spring入门(十二):Spring MVC使用讲解

然后再点击package:

Spring入门(十二):Spring MVC使用讲解

Spring入门(十二):Spring MVC使用讲解

最后生成的war包如下所示:

Spring入门(十二):Spring MVC使用讲解

这就是我们要部署到tomcat中的war包。

4.2 tomcat安装及部署

既然要部署到tomcat中,那么就有2个问题需要解答:

  1. 什么是tomcat?
  2. tomcat如何安装?

先回答第1个问题,tomcat是一个免费的开放源代码的轻量级的web应用服务器,如果你接触过.net的web开发,它就类似于iis。

再回答第2个问题,可以参考如下步骤安装tomcat。

打开tomcat官网,找到你要下载的tomcat版本,我这里选择的是tomcat 8.5.45 released版本:

Spring入门(十二):Spring MVC使用讲解

然后选择合适的版本下载,因为我的开发机器是windows 64位操作系统,所以我选择的是如下所示的版本:

Spring入门(十二):Spring MVC使用讲解

下载完成后,将其解压到你喜欢的目录,我解压到的目录是e:\tools\apache-tomcat-8.5.45-windows-x64\apache-tomcat-8.5.45,解压完成后长如下这样:

Spring入门(十二):Spring MVC使用讲解

其中webapps就是网站要部署的目录。

安装完成后,考虑的问题就是如何启动tomcat?

第1种方法是双击bin目录下的tomcat8.exe:

Spring入门(十二):Spring MVC使用讲解

Spring入门(十二):Spring MVC使用讲解

然后在浏览器输入地址http://localhost:8080/,看到如下界面,代表tomcat安装部署成功。

Spring入门(十二):Spring MVC使用讲解

使用这种方法的缺点就是,如果把tomcat8.exe打开的窗口关闭了,tomcat也就关闭了,非常不方便,因此建议使用第2种方法,将tomcat安装成一个后台服务,让其在后台运行,操作方法如下所示:

依次打开计算机--属性--高级系统设置--高级--环境变量,新增系统变量:

变量名:catalina_home

变量值:e:\tools\apache-tomcat-8.5.45-windows-x64\apache-tomcat-8.5.45(你将tomcat解压的目录)

Spring入门(十二):Spring MVC使用讲解

然后编辑系统变量path,在其最后添加如下内容:

;%catalina_home%\lib;%catalina_home%\bin

Spring入门(十二):Spring MVC使用讲解

然后以管理员身份打开cmd窗口,切换到tomcat的bin目录,执行命令:service.bat install。

Spring入门(十二):Spring MVC使用讲解

然后打开windows的服务列表,会看到一个tomcat8的服务:

Spring入门(十二):Spring MVC使用讲解

将服务修改成自动启动并启动该服务即可在后台一直运行tomcat服务器。

Spring入门(十二):Spring MVC使用讲解

如果你好奇新建的系统变量为什么必须是catalina_home,那么可以用记事本打开bin目录下的service.bat,看到如下内容你就明白了:

Spring入门(十二):Spring MVC使用讲解

从上图也可以看出,运行tomcat需要依赖环境变量java_home(配置java sdk路径),不过我之前已经配置过了,如下所示:

Spring入门(十二):Spring MVC使用讲解

4.3 将war包部署到tomcat中

将之前打包好的spring-action-1.0-snapshot.war复制到tomcat的webapps目录:

Spring入门(十二):Spring MVC使用讲解

因为我们的tomcat服务器设置成了后台运行,过一会该目录就会生成1个和war包名相同的spring-action-1.0-snapshot文件夹,目录结构如下所示:

Spring入门(十二):Spring MVC使用讲解

我们的代码和jsp视图文件都在web-inf目录下的classes文件夹下:

Spring入门(十二):Spring MVC使用讲解

在浏览器中输入地址http://localhost:8080/spring-action-1.0-snapshot/index,页面展示如下所示:

Spring入门(十二):Spring MVC使用讲解

5. 源码及参考

源码地址:,欢迎下载。

craig walls 《spring实战(第4版)》

汪云飞《java ee开发的颠覆者:spring boot实战》

【intellij idea】使用idea解决新建jsp文件而找不到jsp文件模版的新建选项

tomcat安装及配置教程

tomcat安装及后台运行的方法

6. 最后

欢迎扫码关注微信公众号:「申城异乡人」,定期分享java技术干货,让我们一起进步。

Spring入门(十二):Spring MVC使用讲解