Spring学习手册(15)—— Hello Spring MVC

目前为止我们通过Sprint学习手册系列,学习了Spring核心框架技术: IOCAOP技术,同时我们学习了如何在Spring框架体系下整合mybatis数据持久框架和log4j2日志框架。通过这些学习和实践,我们已经可以使用Spring核心框架完成JAVA后台服务开发工作。本文我们学习Spring MVC框架的使用入门。

一、 创建Web项目

本文依然使用IDEA创建WEB项目,使用旗舰版(官网提供30天试用版)可以直接创建web项目,当然我们也可以使用社区版创建项目然后修改相应配置。若安装的为社区版,建议直接下载文末提供的工程示例,在此工程基础上进行编写自己的代码。
我们在HelloSpring一文中比较详细的介绍了IDEA创建Gradle工程的步骤,若有疑惑可在此查看此文。IDEA创建WEB项目需要注意的是我们需要勾选Web选项,如下图所示:

创建Web项目

这样完成项目创建后,IDEA会自动创建webapp目录并设置好build.gradle文件。

二、增加依赖jar包

我们的项目需要增加spring-mvcspring-webmvc两个jar包的依赖,增加完成,build.gradle文件内依赖关系配置如下:

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    testCompile group: 'junit', name: 'junit', version: '4.12'

    compile 'org.springframework:spring-webmvc:4.3.6.RELEASE'
    compile 'org.springframework:spring-web:4.3.6.RELEASE'
    compile 'org.springframework:spring-core:4.3.6.RELEASE'
}

项目工程目录下运行如下命令

gradle build

或等待IDEA自动下载并加载解析相关依赖jar包。

三、Spring MVC基础知识

Spring MVC(model-view-controller)框架围绕着DispatcherServlet进行设计,该Servlet将请求转发给相应的控制器,然后使用控制器处理后的模型进行视图渲染。像大多数MVC框架一样,它很好的将业务逻辑和视图解耦,除此之外,它还完美的支持Spring核心框架技术:IOC和AOP,在Spring MVC框架中你可以像简单的通过配置使用Spring的IOC和AOP技术。
Spring 3.0以后,提供了@Controller@RequestMapping等注解的方式来完成控制器的定义等工作,这使开发更加简便。

Servlet内部逻辑流转

四、Hello Spring MVC实战

配置DispatcherServlet(定义web.xml)

webapp/WEB-INF文件夹下(若不存在WEB-INF文件夹则创建)下创建web.xml文件,文件配置如下:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="
                http://java.sun.com/xml/ns/javaee
                http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

    <display-name>Spring MVC Application</display-name>


    <servlet>
        <servlet-name>HelloWeb</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>

        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWeb</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

如上所示,我们使用<servlet>标签配置DispatcherServlet并且使用<servlet-name>标签为该servlet命名为HelloWeb。接下来我们使用<servlet-mapping>标签为该servlet配置映射关系,如上所示,所有路径以/开始的都会被名为HelloWeb的servlet进行处理。

定义HelloWeb-servlet.xml文件

我们在web.xml文件里定义了名为HelloWeb的servlet,Spring MVC框架启动是会初始化该Servlet,默认情况下框架使用[servlet-name]-servlet.xml的文件格式查找该servlet的配置信息。为简便起见,我们使用该约束方式创建HelloWeb-servlet.xml并配置,该文件内容如下:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="com.liangwei.learning" />

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

如上所示,该配置文件与以前学习到的Spring配置文件相同,这里值得一提的是,Spring 3.0 增加了@Controller等注解,使得我们可以直接使用注解的方式进行定义配置控制器,而Spring MVC也提供一种配置方式,使得Spring MVC在加载时自动扫描所有有@Controller@RequestMapping注解的类,并将其注册为控制器(bean)。我们使用该配置<context:component-scan base-package="com.liangwei.learning" />,并制定base-package,框架会自动在该包名下扫描并注册控制器。
除上述配置外,我们需要配置为该Servlet配置ViewResolver,这里我们使用InternalResourceViewResolver,并且配置前缀为/WEB-INF/jsp/,后缀为.jsp,这样当控制器返回一个hello的String类型实例时,框架会将其解析为/WEB-INF/jsp/hello.jsp,然后查找该视图文件并使用渲染器渲染视图。

定义控制器(HelloController)

前面我们定义了Servlet并且完成了其配置工作,接下来我们定义一个控制器:HelloController:

@Controller
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping(method = RequestMethod.GET)
    public String printHello(ModelMap model) {
        model.addAttribute("message", "Hello Spring MVC Framework!");
        return "hello";
    }
}

如上所示,我们使用@Controller注解注解HelloController,由于我们前面已经配置了<context:component-scan>标签,框架会自动扫描并注册控制器。我们使用@RequestMapping注解并设置"/hello"值,这是的所有的请求路径为/hello的请求被分发到该控制器。这里我们将@RequestMapping路径设置在类上,当然我们也可以将该注解设置在具体方法上,我们会在后面的文章讲解它们之间的区别。我们的控制器类提供了printHello方法,该方法签名拥有一个ModelMap类型参数,并且返回String类型值。该方法使用@RequestMapping(method = RequestMethod.GET)设置只接受GET方法。这样的配置使得我们的控制器会接受/hello路径的GET请求。

定义视图文件hello.jsp

我们配置好了Servlet,且定义了控制器,接下来我们需要配置视图文件hello.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
    <title>Hello World</title>
</head>
<body>
<h2>${message}</h2>
</body>
</html>

该文件存储在/WEB-INF/jsp路径下,命名为hello.jsp:这跟我们前面的HelloWeb-servlet.xml的配置有关。该文件为简单的JSP视图文件,它会从模型中获取名为message的信息,并交给渲染器进行渲染。

以上我们就完成了Hello Spring MVC项目的开发和配置工作。接下来我们需要学习如何将它部署在Tomcat服务上并通过浏览器访问。

五、部署到Tomcat

安装配置Tomcat

本文非Tomcat学习文章,所以这里我们只简单介绍如何安装和配置Tomcat。我们可以直接访问官网查找下载相应版本。该项目我使用的是Tomcat9.0版,在该页面下下载Core下的.zip包,当然如果你是windows环境可下载相应版本。下载完成后我将其解压到~/Library/Tomcat9/目录下,然后将该路径设置到Path路径下:

export PATH=$HOME/Library/Tomcat9/bin:$PATH

作者使用的是zsh,因此该命令配置在~路径下的.zshrc文件内,如果读者使用不同的shell或使用windows平台需使用相应设置方式。
这样我们就完成了Tomcat的安装和简单配置。这个时候我们进入~/Library/Tomcat9/目录,使用如下命令可以看到tomcat启动信息。

startup.sh

我们可以使用shutdown.sh来关闭服务。

Tip :在Unix或Linux系统情况下,可能出现无法启动,此时需要使用如下命令修改文件权限
chmod 755 ~/Library/Tomcat9/bin/*.sh

IDEA 部署项目设置

选择Run/EditConfigurations打开配置页面:

打开配置项

将弹出如下图所示结果:
配置页面

点击+号,选择Tomcat Server/Local,将弹出如下配置页面:
配置Tomcat

我们首先为该配置命名为HelloSpringMVC,然后点击Configure设置Tomcat根目录。这个时候你会发现右下角有一个红色Fix按钮,点击它,选择将要部署的war包,页面会跳转到Deployment选项卡:
Deployment

在Application context配置上/HelloSpringMVC ,点击OK,完成配置。这样我们的项目根目录将为localhost:8080/HelloSpringMVC

启动项目

回到IDEA工程目录下,点击绿色按钮将启动项目并将项目war包部署到Tomcat,控制台会输出启动日志,稍等一会项目启动完成。


启动项目

访问项目

启动浏览器,将http://localhost:8080/HelloSpringMVC/hello输入到地址栏,我们将看到如下界面:

HelloSpringMVC访问结果

恭喜你,你已经完成了helloSpringMVC项目的开发和部署工作。

直接部署到Tomcat安装目录

除了上述部署方式外,我们可以直接将war包拷贝到~/Library/Tomcat9/webapps/目录下,然后启动Tomcat服务器,服务器会自动将war包解压。如HelloSpringMVC.war 包,会被解压~/Library/Tomcat9/webapps/HelloSpringMVC目录下,此时我们可以使用localhost:8080/HelloSpringMVC/hello来访问,其中HelloSpringMVC为解压后的名字。另外我们可以在工程build/libs目录下找到编译好的war包。

六、总结

本文我们学习了Spring MVC框架的实用,通过实战的方式定义Servlet、配置Servlet、定义Controller和定义视图文件完成HelloSpringMVC项目的开发,最后我们通过使用IDEA部署和直接Tomcat部署的方式完成项目的部署。这样我们就完成了一个最简单的Spring MVC项目,通过HelloSpringMVC项目我们踏入了Spring MVC框架的大门。

项目源码地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,590评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,727评论 6 342
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,169评论 11 349
  • 牛奶是丝丝入扣成如鲠在喉不觉五十七度的温柔面包是五谷丰收成糟糠零碎糟践味蕾丰满的舌头煎蛋是性感灵肉成味同嚼蜡少了油...
    尹渝释阅读 275评论 2 2
  • 今天是第三天,开始练倒车。原来在驾驶座看后视镜的效果跟在副驾完全不同,心里真的踏实了很多。 教练夸我后视镜观察得好...
    杨一同学阅读 214评论 0 1