作者:享学Peter老师
Spring Boot
是一个非常棒的应用程序开发框架。大多数人可能会使用这个框架来创建基于 Web
的应用程序 - MVC应用程序或基于 RESTFul API
的应用程序。 这些应用程序可以部署到Docker容器中,成为微服务。
本教程将向同学们展示使用Spring Boot创建基于Web应用程序的过程。它是一个独立的Java应用程序。内置一个嵌入式 Tomcat
服务器。可以处理Web页面的各种请求。 对于新手来说,每个新起项目,最困难的部分就是项目环境配置部分。 但跟随本教程,你将发现使用 Spring Boot
创建 web
项目与使用 Spring v3 / v4 MVC
创建应用程序相比,简直要简单得不要不要的。
在开始之前,先展示项目的目录和文件结构:
<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注释来进行配置。
让我们从 POM XML
文件开始。 POM XML
文件用于 Maven
构建。它指定了如何编译和打包项目。以下是此文件的内容:
<?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
存档的行:
<packaging>war</packaging> 复制代码
第二个是 POM
文件具有父 POM
依赖性。 这允许下载许多 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
的属性定义:
<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
视图和运行嵌入式应用程序服务器。
接下来,开始我们程序编码。 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】 ,获取精选准备的架构学习资料(视频+文档+架构笔记)