2019-03-19 22:07:55 +0000   |     spring mvc web   |   Viewed times   |    

初始化Spring项目

可以在线初始化,也可以通过命令行。目的都是下载一个启动包。在线配置可视化选配置简单点。命令行配置完全手动设,累一点。

在线initializr安装

地址:https://start.spring.io

我的初步配置: initialize-spring-initializr

命令行安装

curl https://start.spring.io/starter.tgz -d groupId=com.ciaoshen -d artifactId=sia-ch01-taco -d name=sia-ch01-taco -d packageName=com.ciaoshen.sia_ch01_taco -d dependencies=web,thymeleaf -d type=gradle-project -d packaging=war -d baseDir=ch01/sia-ch01-taco | tar -xzvf-

初始化包结构

.
└── sia-ch01-taco
    ├── HELP.md
    ├── build.gradle
    ├── gradle
    │   └── wrapper
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradlew
    ├── gradlew.bat
    ├── settings.gradle
    └── src
        ├── main
        │   ├── java
        │   │   └── com
        │   │       └── ciaoshen
        │   │           └── sia_ch01_taco
        │   │               ├── ServletInitializer.java
        │   │               └── SiaCh01TacoApplication.java
        │   └── resources
        │       ├── application.properties
        │       ├── static
        │       └── templates
        └── test
            └── java
                └── com
                    └── ciaoshen
                        └── sia_ch01_taco
                            └── SiaCh01TacoApplicationTests.java

最简单的HelloWorld项目

我们的目的是:在浏览器输入地址localhost:8080/sia-ch01-taco,显示如下主页, jetty-run-taco

初始化包里还缺3个组件,

  1. 负责显示html页面的viewtemplates/home.html
  2. html页面里的这张图片TacoCloud.pngresources/static/images/TacoCloud.png
  3. 跳转到指定view的一个controllerSiaCh01TacoHomeController.java

首先这个页面按理可以直接是一个前端网页,但书上提供了另一种做法,用thymeleaf模板。这就是为什么在初始化的时候加上了thymeleaf库依赖。现在只需要在resources/templates文件夹下提供一个html模板即可。

home.html页面里的图片TacoCloud.png需要储存。gradle项目默认图片资源位置在resources/static文件夹下,根据home.html里给出的相对路径为images/TacoCloud.png,因此图片具体位置为:resources/static/images/TacoCloud.png

最后Spring MVC需要一个controller来跳转到默认主页home.html这个view。所以要写一个SiaCh01TacoHomeController.java来干这个事。

home.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">

    <head>
        <title>Taco Cloud</title>
    </head>

    <body>
        <h1>Welcome to...</h1>
        <img th:src="@{/images/TacoCloud.png}"/> <!-- abs path = ./resources/static/images/TacoCloud.png -->
    </body>

</html>

SiaCh01TacoHomeController.java

package com.ciaoshen.sia_ch01_taco;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class SiaCh01TacoHomeController {

    @GetMapping("/")
    public String home() {
        return "home";
    }

}

生成war

根目录下自动生成的build.gradle已经写好了构造过程。只要命令行运行,

gradle build

在编译好所有的类之后,在build/libs/目录下面会多出一个sia-ch01-taco-0.0.1-SNAPSHOT.war,这就是我们要部署的war包。

.
└── sia-ch01-taco
    ├── bin
    │   ├── main
    │   │   ├── application.properties
    │   │   ├── com
    │   │   │   └── ciaoshen
    │   │   │       └── sia_ch01_taco
    │   │   │           ├── ServletInitializer.class
    │   │   │           ├── SiaCh01TacoApplication.class
    │   │   │           └── SiaCh01TacoHomeController.class
    │   │   ├── static
    │   │   │   └── images
    │   │   │       └── TacoCloud.png
    │   │   └── templates
    │   │       └── home.html
    │   └── test
    │       └── com
    │           └── ciaoshen
    │               └── sia_ch01_taco
    │                   └── SiaCh01TacoApplicationTests.class
    ├── build
    │   ├── classes
    │   │   └── java
    │   │       ├── main
    │   │       │   └── com
    │   │       │       └── ciaoshen
    │   │       │           └── sia_ch01_taco
    │   │       │               ├── ServletInitializer.class
    │   │       │               ├── SiaCh01TacoApplication.class
    │   │       │               └── SiaCh01TacoHomeController.class
    │   │       └── test
    │   │           └── com
    │   │               └── ciaoshen
    │   │                   └── sia_ch01_taco
    │   │                       └── SiaCh01TacoApplicationTests.class
    │   ├── libs
    │   │   └── sia-ch01-taco-0.0.1-SNAPSHOT.war
    │   ├── reports
    │   │   └── tests
    │   │       └── test
    │   │           ├── classes
    │   │           │   └── com.ciaoshen.sia_ch01_taco.SiaCh01TacoApplicationTests.html
    │   │           ├── css
    │   │           │   ├── base-style.css
    │   │           │   └── style.css
    │   │           ├── index.html
    │   │           ├── js
    │   │           │   └── report.js
    │   │           └── packages
    │   │               └── com.ciaoshen.sia_ch01_taco.html
    │   ├── resources
    │   │   └── main
    │   │       ├── application.properties
    │   │       ├── static
    │   │       │   └── images
    │   │       │       └── TacoCloud.png
    │   │       └── templates
    │   │           └── home.html
    │   ├── test-results
    │   │   └── test
    │   │       ├── TEST-com.ciaoshen.sia_ch01_taco.SiaCh01TacoApplicationTests.xml
    │   │       └── binary
    │   │           ├── output.bin
    │   │           ├── output.bin.idx
    │   │           └── results.bin
    │   └── tmp
    │       ├── bootWar
    │       │   └── MANIFEST.MF
    │       ├── compileJava
    │       └── compileTestJava
    ├── build.gradle
    ├── gradle
    │   └── wrapper
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradlew
    ├── gradlew.bat
    ├── settings.gradle
    └── src
        ├── main
        │   ├── java
        │   │   └── com
        │   │       └── ciaoshen
        │   │           └── sia_ch01_taco
        │   │               ├── ServletInitializer.java
        │   │               ├── SiaCh01TacoApplication.java
        │   │               └── SiaCh01TacoHomeController.java
        │   └── resources
        │       ├── application.properties
        │       ├── static
        │       │   └── images
        │       │       └── TacoCloud.png
        │       └── templates
        │           └── home.html
        └── test
            └── java
                └── com
                    └── ciaoshen
                        └── sia_ch01_taco
                            └── SiaCh01TacoApplicationTests.java

运行

传统运行war包的方法,是把war包丢进一个服务器里,然后运行服务器。这种方式我用Jetty测试。

但Spring Boot其实已经内置Tomcat了。直接运行Spring Boot也可以。

Jetty运行

先要下载和安装Jetty,可以参考这篇->《Gradle Demo里安装Jetty的部分》

安装好之后,要么将sia-ch01-taco-0.0.1-SNAPSHOT.war直接复制到webapps目录下。要么在webapps目录下创建一个sia-ch01-taco.xml的配置文件,

<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/sia-ch01-taco</Set>
    <Set name="war">/Users/Wei/github/spring-in-action-demo/ch01/sia-ch01-taco/build/libs/sia-ch01-taco-0.0.1-SNAPSHOT.war</Set>
</Configure>

然后进入到Jetty的根目录,执行,

java -jar start.jar

成功的话,终端会打印出大大的Springlogo, jetty-run-taco-command

在浏览器输入,

localhost:8080/sia-ch01-taco

得到下面结果, jetty-run-taco

Spring Boot运行

Spring Boot运行更简单,在项目根目录下,直接运行命令,

gradle bootRun

因为springwar的plugin已经让gradle加入了bootRun任务。同样,显示大Spring Logo表示成功运行, spring-boot-run-taco-command

最后在浏览器输入,

localhost:8080

就可以看到, spring-boot-run-taco

Jetty里因为我们定义了一个子应用目录sia-ch01-taco。而Spring Boot没有,所以关联的直接是/