1.创建Spring Boot项目

摘要:摘要: 使用Spring Initializr创建空的Spring Boot项目,介绍文件夹结构,使用Thymeleaf模板引擎编写Hello World页面

创建Spring Boot项目

通过使用IDEA自带Spring Initializr(或登录http://start.spring.io/)创建Spring Boot项目。

Create New Project->Spring Initializr,选择SDK 设置Group(同包名)和Artifact(项目名称,据 @15 计科 孙涵斌 说这玩意里不能有大写字母),选择Maven Project。JAR和WAR的选择是开发用JAR部署用WAR。接下来是一些其他设置,这些设置可以之后在pom.xml文件中修改。 接下来就是令人激动的添加引用环节。DevTools用来启用热启动。Web的Web项则包含了网站开发的全栈工具,包括Tomcat和Spring MVC。同时,项目决定使用Thymeleaf作为模板引擎。 找个地方放置新项目。项目会以location文件夹为根目录。应使用一个空目录。 项目创建完成。可以通过左下角的Maven Projects查看导包情况。 pom.xml

<?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> <groupId>org.wzyjerry.springboot.demo</groupId> <artifactId>springboot-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot-demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

可以看到,生成的pom文件十分简洁。通过parent节定义了spring boot的版本号,之后所有的dependency中与spring boot有关的项都将继承该版本号,并通过各自的pom将所需包导入到项目中。

文件夹结构

现在可以执行生成的test方法,如果测试通过,可以看到输出一个Spring Boot的logo。

. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.5.3.RELEASE)

得到最终的文件夹结构如下。

蓝色的是代码根目录,绿色的是测试根目录,黄色横杠的是资源根目录。C是类文件,有电源图标的C是SpringBoot应用程序的启动类,这个类上有@SpringBootApplication注解,当你启动这个类(通过点击左边的小绿箭头),服务器会启动,并将部署到默认的8080端口。可以通过浏览器访问localhost:8080,不过因为我们什么都没有写,因此只会得到一个错误页面,小叶子表明这是一个Spring应用程序。尽管如此,这已经是一个可以运行的网站了。

2017-05-18 22:50:50.411 INFO 7760 --- [ restartedMain] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 2017-05-18 22:50:50.414 INFO 7760 --- [ restartedMain] o.w.s.demo.SpringbootDemoApplication : Started SpringbootDemoApplication in 2.319 seconds (JVM running for 2.702)

路由与URL

如果我们访问这样的URL

http://cn.bing.com/ http://localhost:8080/home/index/

实际上会发生什么事呢?大致的过程是这样的:

浏览器看到http://,认识到这是一个基于超文本传输协议的URL访问。之后的字符串被按/划分为节。 浏览器获取第一节,这一节被定义为域名:port,其中,域名段会由DNS服务器解析为对应的IP地址,port则指定了网页的端口号。如果没有port段,则使用默认端口:对于HTTP协议,端口是80;而对于HTTPS协议,端口是443.浏览器向这个终端发起HTTP的GET请求。 接下来由Tomcat做一些工作,交给Servlet,通过之后的节进行路由,最终找到一个控制器的方法或者失败:后者将会产生一个404 NotFound。 一个通用路由可能是这样的:controller默认值为home,index默认值为index,id为可选项

/{controller}/{action}/{id}

对于这样一个路由,上述第一个URL将访问home控制器的index方法(全部使用默认值),第二个URL也将访问home控制器的index方法(显示指定controller与action)。你会发现,一个基于MVC的网页访问实质上是在进行一个对控制器方法的远程过程调用(Remote Procedure Call,RPC)过程。

最终,控制器方法将返回一些东西,完成页面访问过程。

Hello world页面

根据上面的过程描述,我们来尝试编写一个hello world页面。

新建Controller方法,位于controller包内。 控制器使用@Controller注解,使用@RequestMapping注解设定路由。由上面的通用路由可以得到,/home/index应当被同时映射到三个URL上,其中,第一个URL一般被当做一个网站的主页。

http://localhost:8080/ http://localhost:8080/home/ http://localhost:8080/home/index/

@Controller public class HomeController { @RequestMapping(value = {"/", "/home", "/home/index"}) public ModelAndView index() { ModelAndView modelAndView = new ModelAndView("home/index"); return modelAndView; } } 控制器方法返回一个ModelAndView。这里对应的模板文件为

src/main/resources/templates/home/index.html 暂时不要管这是如何得出的,现在对应的文件夹中新建文件。 编写模板文件home/index

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Title</title> </head> <body> <p>Hello world~!</p> </body> </html> 运行程序,访问页面

​​​​​​​

可以看到结果与预期一致。注意这里的URL要与映射URL严格匹配大小写。