做者:享学Peter老师
Spring Boot
是一个很是棒的应用程序开发框架。大多数人可能会使用这个框架来建立基于Web
的应用程序 - MVC应用程序或基于RESTFul API
的应用程序。这些应用程序能够部署到Docker容器中,成为微服务。javascript
本教程将向同窗们展现使用Spring Boot建立基于Web应用程序的过程。它是一个独立的Java应用程序。内置一个嵌入式Tomcat
服务器。能够处理Web页面的各类请求。对于新手来讲,每一个新起项目,最困难的部分就是项目环境配置部分。但跟随本教程,你将发现使用Spring Boot
建立web
项目与使用Spring v3 / v4 MVC
建立应用程序相比,简直要简单得不要不要的。php
在开始以前,先展现项目的目录和文件结构:css
<base-dir>/src/main/java/org/hanbo/boot/app/controllers/HelloController.java
<base-dir>/src/main/java/org/hanbo/boot/app/App.java
<base-dir>/src/main/resources/application.properties
<base-dir>/src/main/resources/static/test.html
<base-dir>/src/main/resources/static/assets/css/index.css
<base-dir>/src/main/resources/static/assets/js/test.js
<base-dir>/src/main/webapp/WEB-INF/jsp/testme.jsp
复制代码
两个Java文件。一个是程序入口类。另外一个是MVC控制器。
一个properties属性文件,里面是一些项目配置值。
三个静态文件,可在请求时直接提供给用户。
一个JSP文件,用做MVC应用程序的视图模板。
若是咱们使用springmvc的旧方法来配置web项目,则须要在项目web.xml
里配置spring
容器和spring mvc
容器,这至少须要两个pring xml
配置文件。而在这里,一切都使用Java注释来进行配置。html
让咱们从POM XML
文件开始。POM XML
文件用于Maven
构建。它指定了如何编译和打包项目。如下是此文件的内容:java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>boot-war</artifactId>
<packaging>war</packaging>
<name>Hanbo Boot War Sample App</name>
<description>An example of Spring Boot, JSP and WAR</description>
<version>1.0.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
复制代码
这个POM
文件有几个重要的事情。第一个是指定maven
构建将建立WAR
存档的行:web
<packaging>war</packaging>
复制代码
第二个是POM
文件具备父POM
依赖性。这容许下载许多Spring
和非Spring
依赖项并将其连接到此项目中:spring
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
复制代码
三个是将Java
编译设置为使用JDK 1.8
的属性定义:apache
<properties>
<java.version>1.8</java.version>
</properties>
复制代码
最后一个是使用Spring Boot maven
插件进行编译和打包:浏览器
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
复制代码
依赖项部分定义了此应用程序所需的额外依赖项。我须要的是Spring MVC
,并做为J2EE Web
应用程序运行。添加的依赖项用于编译JSP
视图和运行嵌入式应用程序服务器。tomcat
接下来,开始咱们程序编码。spring boot
项目,程序都有必须有一个入口主类,如下是主类的完整源代码:
package org.hanbo.boot.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class App extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder appBuilder) {
return appBuilder.sources(App.class);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(App.class, args);
}
}
复制代码
该App类从SpringBootServletInitializer
扩展而来。它能被Spring Framework
识别,并将类App做为传统的WAR包进行初始化和执行。它还告诉Spring Framework
将有WEB-INF
文件夹及其中的资源供使用。
在App类中,有一个名为configure()的受保护方法。它用于指定任何特定于应用程序的配置。它只有一行,它接受App类的类型并建立一个SpringApplicationBuilder
对象并返回。这样作的是,建立的SpringApplicationBuilder
对象将自动扫描App
类,它所在的包,以及任何带注释的类的子包,以及包含Spring
配置的注释。而后它将基于这些配置构建Spring
应用程序。这是按惯例进行集成的典型示例。而且一切都经过依赖注入耦合。
静态main方法
只有一行,它将类App的类型和任何其余命令行参数传递给SpringApplication.run()
。在幕后,这门课作了不少。它将隐式地对当前包和全部子包进行组件扫描。若是须要,开发人员还能够添加其它路径包为扫描目标。开发人员能够为所需的任何其余配置添加额外的注释。对于这个简单的程序,只有MVC控制器类能够处理用户对页面的请求。
接下来是咱们的MVC
控制器类。这是一个很是简单的类,只有一个方法能够处理来自用户的HTTP GET
请求,并带有一些查询参数。它经过使用JSP
页面做为视图来响应。源代码以下:
package org.hanbo.boot.app.controllers;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
@RequestMapping(value = "/meow", method = RequestMethod.GET)
public ModelAndView hello(@RequestParam("sayit") String sayit) {
ModelAndView retVal = new ModelAndView();
retVal.setViewName("testme");
retVal.addObject("mymessage", sayit);
return retVal;
}
}
复制代码
类中代码没有什么新鲜的。也就是说,该控制器类的定义与任何Spring MVC
控制器的定义相同。咱们简单走读一下类实现:
类用@controller
注释:表示它是一个控制器类。
类只有一个方法来处理HTTP GET
请求。它用@requestmapping
注释。注释定义了请求的子路径以及它能够处理的http
方法get
请求。
方法建立一个ModelAndView
对象并返回。视图页面称为“testme”。数据模型只是一个将显示在页面上的字符串。
该方法接受一个参数,该参数来自查询参数,称为“sayit”。
整个类的功能,就是当用户在浏览器地址栏输入如下路径时,进行响应处理:
http://localhost:8080/meow?sayit=This+is+pretty+crazy
复制代码
为了让这个控制器按预期工做,还须要一些额外的配置。它在application.properties
文件中完成。
application.properties
须要指定视图模板文件的前缀和后缀。
若是您作过spring mvc
项目,或者你知道,web
项目须要建立和配置一个org.springframework.web.servlet.view.internalResourceViewResolver
类型的对象,而这个对象须要指定两个属性:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
复制代码
意思是应用程序在“WEB-INF/JSP/”
文件夹中查找视图模板。文件扩展名是“.jsp”
。
ok,如今咱们已经有了主程序入口类、控制器类和内部资源视图解析器的设置。最后一块是视图模板。
本教程的视图模板很是简单,只有一个JSP文件演示如何显示视图模型中的数据:
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html lang="en">
<head>
<c:url value="/assets/css/index.css" var="jstlCss"/>
<link href="${jstlCss}" rel="stylesheet"/>
</head>
<body>
<p>What did you say?</p>
<p>I said: <span class="text-underline">"${mymessage}."</span></p>
<script type="text/javascript" src="/assets/js/test.js"></script>
</body>
</html>
复制代码
在这个JSP文件中,有三件事:
有级联样式表文件。它是一个静态文件,经过JSTL
标记添加。这要求JSTL
库已经正确地引入到了项目中。
视图模型只有一个元素,并经过$mymessage
添加到视图中。
在HTML内容的末尾添加了一个javascript
文件,加载后将执行该文件。这是为了演示在这个项目中静态文件的使用。
让示例应用程序提供静态内容是很是重要的。它提供了超越Spring MVC
的方法——静态页面和javascript
可用于单页Web
应用程序。并且,使用Spring
引导很容易得到静态内容,后面会再解释这一点。
Spring Boot
提供了不少便利,让开发人员可以快速上手开发。
这些便利是经过一个约定来实现的:
当您使用Spring Boot
开发的应用程序指定为基于Web
的应用程序时,您所须要作的就是在src/main/resources
下建立一个名为“static”
的文件夹。
在这个“静态”文件夹中,只需根据须要添加任何子文件夹,并将任何静态内容文件放入其中,就能够为它们提供服务。以本案例程序为例,我有三个指定为静态内容的文件:
级联样式表的文件——src/resources/static/assets/css/index.css
一个javascript文件——src/resources/static/assets/js/test.js
一个HTML文件——src/resources/static/test.html
那么,用户如何经过浏览器访问这些静态内容呢?这很容易。假设应用程序正在运行,而且假设应用程序运行的网站的URL是http://localhost:8080/(在这没有特定的应用程序上下文),那么用户可使用如下URL查看这些静态内容文件的实际内容:
http://localhost:8080/assets/js/test.js
http://localhost:8080/assets/css/index.css.
http://localhost:8080/assets/test.html.
有一些方法能够配置Spring
引导应用程序在其余位置查找静态内容文件,WEB-INF
和JSP
位置也是如此,应用程序如何初始化,以及Spring
引导应用程序如何工做的许多其余方面。这些不是本教程中讨论的主题,可是若是你对Spring Boot
有足够的了解,这些主题就微不足道了。我可能会在之后的文章中介绍其中的一些。
在构建项目以前,请转到src/main/resources/static/assets/js
文件夹,并将文件“test.sj”
重命名为“test.js”
。
要构建此应用程序,请在命令行控制台中运行如下命令:
mvn clean install
复制代码
当您第一次运行此应用程序时,它将下载用于构建此应用程序的全部依赖项,这可能须要一些时间。以后,后续的构建将花费更少的时间。
要运行Web
应用程序,还可使用命令行控制台:
java -jar target\boot-war-1.0.0.war
复制代码
若是一切顺利,而且您能够构建应用程序,那么执行将在最后输出相似这样的结果:
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.0.5.RELEASE) 2018-10-14 22:51:11.356 INFO 6124 --- [ main] org.hanbo.boot.app.App : Starting App v1.0.0 on U3DTEST-PC with PID 6124 (C:\Users\u3dadmin\workspace-mars8\SpringBootJspWar\target\boot-war-1.0.0.war started by u3dadmin in C:\Users\u3dadmin\workspace-mars8\SpringBootJspWar) .... .... .... 2018-10-14 22:51:28.730 INFO 6124 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2018-10-14 22:51:28.745 INFO 6124 --- [ main] org.hanbo.boot.app.App : Started App in 20.84 seconds (JVM running for 23.398) 复制代码
正如我以前提到的,使用Spring
引导建立Web
应用程序很是简单、方便。这种便利性的关键是去掉全部杂乱无章的配置,这样人们就能够专一于开发过程当中最重要的部分,设计出符合最终产品愿景的产品。除此以外,Spring Boot
还有一个很酷的地方,那就是它能够快速部署到Docker
虚拟机中。所以,它很是适合开发微服务。
那么,接下来的即是编写那些更加复杂的关于Spring的工做,例如数据访问、身份验证和受权。敬请期待。
END
欢迎长按下图关注公众号:享学课堂online!
公众号后台回复【java】,获取精选准备的架构学习资料(视频+文档+架构笔记)