之前在写Spring入门的学习笔记,但是深深感受到单单是“硬学”,即便有穿插一些生动的小例子,还是远远不能用好Spring,更不用谈掌握其核心,深入理解它的思想了。不得不承认,项目是进步的原动力,很复杂的思想、理念,经历几个项目,相信大家都能用的很熟,也会有一定的理解了,辅之以一些参考文档,大神的思想解析,便能够做到游刃有余地利用Spring,而不是被Spring的各种配置,各种思想、各种模式搞得晕头转向。
因此,这一系列的文章,将立足于实战,着眼于项目,以项目作为推动来逐步学习和理解Spring,当然,我们从简单易于上手的Spring-boot开始我们的旅程。我们采用MAVEN构建项目,使用的是Intellij IDEA作为环境,如果不熟悉MAVEN的朋友可以先学习MAVEN的简单使用。
Spring-boot入门
大部分实战的开头都是HelloWorld,我们也不例外,从最简单的程序着手介绍Spring-boot项目的构建过程,当然我们后面会做一点小小的扩展。
1、首先是项目的创建:我们用MAVEN来构建项目,创建完成后的项目结构:;
2、接下来我们配置pom文件,配置源码如下:
<?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.seu.cambridgewoo</groupId> <artifactId>SpringWebDemo</artifactId> <version>1.0-SNAPSHOT</version> <!-- Spring Boot 启动父依赖 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.3.RELEASE</version> </parent> <dependencies> <!-- Spring Boot web依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Junit 单元测试依赖--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </project>
3、配置完pom文件后我们开始编写主代码和测试代码,这里需要注意的一点是,Springboot要求我们的源码必须要在package下,因此直接在java文件下创建源文件是不能够通过编译的。所以我们创建两个package然后在package下编写我们的主代码,项目结构如图所示:
,target文件夹是生成后的文件,这里不需要多做考虑;
4、个各类的代码如下:
HelloWorld类,接受http请求并返回数据
package org.seu.cambridge; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * Created by Cambridgewoo on 2017/3/15. */ @RestController /*将收到的http请求根据路径分发给对应的controller,RestController是特殊的Controller, 其返回值直接作为http的response的body返回给浏览器*/ public class HelloWorld { @RequestMapping("/") //定位路由信息 public String sayHello(){ return "Hello,World!"; } }Application类:Spring-boot会做一些准备工作并启动服务器
package org.seu.cambridge; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * Created by Cambridgewoo on 2017/3/15. */ @SpringBootApplication //是一个注解集合 public class Application { public static void main(String[] args){ SpringApplication.run(Application.class,args); } }HellowWorldTest类:测试了sayHello
package org.seu.cambridge; import org.junit.Test; import static junit.framework.Assert.assertEquals; /** * Created by Cambridgewoo on 2017/3/15. */ public class HelloWorldTest { @Test public void testsayHello(){ assertEquals("Hello,World!",new HelloWorld().sayHello()); } }其中Application类中的@SpringBootApplication是一个注解集合,可以看到其内容如下:
5、接下来我们在命令行中输入mvn clean test进行测试得到如下结果:测试通过,接下来我们启动服务器看一看我们的成果,在命令行中输入mvn spring-boot:run,看到结果如下:
从红框标出来的位置可以看到服务器已经启动,我们可以从http://localhost:8080/的位置看到我们的成果了!结果截图如下:
6、至此,我们已经完成了最简单的项目,接下来我们稍作一些些扩展,在前面的HelloWorld类里,有@requestmapping注解,其目的是告知目标url,这里有很多应用方式,比如嵌套使用:;多个url并列:;当我们遇到url呈如下情况时:www.github.io/user1;www.github.io/user2;如果我们针对每一个url逐条创建将会十分的繁琐,因此我们会使用@PathVariable使其自动识别url:;同时我们经常会遇到get或者post不同的请求,我们可以使用对@RequestMapping添加属性的方式,来对不同的请求进行相应:;
以上我们例举了不少的情况,具体的实现和结果请大家亲自动手试一试,对于不理解的地方动手后会变得很清晰。
7、下面我们再细致一点,看一看@RestController这个注解,谈这个注解之前,我们看一看项目的结构,test类暂且不谈,Application的目的实际上就是Spring-boot的准备工作,并且启动的服务器,真正的“业务逻辑”是HelloWorld中实现的,但实际应用中,我们会将这个接受http请求并返回数据的接口同业务逻辑分离开来,使得项目更加的模块化和松耦合,便于维护和复用,这里不再展开细说。回到@RestController,这个注解的意思是直接将return的信息以字符串返回给网页,所以我们看到了“HelloWorld!”这一串字符,但刚才也说了,实际应用中,这里往往只是调用各种业务的接口,自然也不会使用@RestController,下面我们简单地试一下@Controller,代码如下:,并且我们需在resources中添加templates文件夹,其中添加hello.html,结构如图:,hello.html的代码如下:
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Getting Started: Serving Web Content</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <p th:text="'Hello, ' + ${name} + '!'" /> </body> </html>在HelloWorld类中修改代码如下:
@Controller public class HelloWorld { @RequestMapping("/hello/{name}") public String hello(@PathVariable("name") String name, Model model) { model.addAttribute("name", name); return "hello"; //寻找名字为hello的模板进行渲染 } }完成后我们启动服务器,在网页中浏览到结果: .
至此,我们的第一个Spring-boot程序全部完成。