原文作者:彌諾R
原文地址:http://www.minuor.com/147852147/article
轉載聲明:轉載請註明原文地址,注意版權維護,謝謝!
寫前說明
根據個人在各篇博文中看到的信息,以及自己的總結,下面的說明文檔只涉及到簡明的一些知識點。如thymeleaf的文件路徑配置、緩存等,都是直接使用默認的方式,但是實際上可以通過代碼中加載和配置文件配置的方式個性化,這裏不做詳細的說明,因爲在實際項目開發中基本是用不是這些個性化配置,都是使用默認配置,如果需要特殊個性化可以根據實際情況google、百度。
創建項目
創建項目的方式有多種,第一種就是在創建的時候就選好你要使用Springboot的哪些功能,如用jdbc就勾選jdbc,在生成項目的時候就會自動生成Springboot-jdbc的依賴座標,並加入到pom.xml文件中,這裏不採用這種方式,而是直接創建項目,依賴座標通過手動加入。
步驟:File->new->project->maven->next->next->finish。
pom文件
這裏的項目我採用的多個模塊的創建,因爲這樣更貼切實際開發場景,模塊的情況看下面項目pom.xml文件。
父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>com.springboot.utui</groupId>
<artifactId>boot-utui</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>utui-web</module>
<module>utui-service</module>
<module>utui-facade</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
<properties>
<lombok.version>1.16.10</lombok.version>
<jdk.version>1.8</jdk.version>
<javax.servlet-api.version>3.1.0</javax.servlet-api.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-logging</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 這個是常用註解插件
實體類上@Data:表示類上添加getter、setter、toString,
或者controller、service類上@Slf4j:類中就可以註解使用log.info(),log.error()的方式打印日誌
使用前注意IDEA裏面要安裝插件lombok plugin插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${javax.servlet-api.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
pom.xml文件補充說明:
- lombok插件的安裝方式以及相關注解的使用說明,請移步:[lombok插件安裝、依賴導入以及常用註解的使用說明];
- 這裏需要項目構建後需要訪問頁面,可以使用jsp方式,但是Spring boot本身是更傾向於推薦使用thymeleaf,這裏就引入thymeleaf的依賴座標。
- modules體現了項目裏面有幾個模塊分別是web、service、facade。
- 這個pom.xml的所有模塊的總配置文件,這裏採用的是
<dependencies></dependencies>
標籤引入依賴,這些依賴會被全部下載,並加載到每個子模塊內,另外有的是在dependencies外再套一層<dependencyManagement></dependencyManagement>
,當這個時候,依賴不會被自動注入到子模塊,只是做一個依賴的管理作用,子模塊通過pom.xml引入自身所需要的依賴。子模塊pom.xml
web模塊中引入service座標,service模塊引入facade座標。
web模塊pom.xml:<!-- 打包方式是jar,不是war,也可以不寫,默認就是用jar方式打包 --> <packaging>jar</packaging> <dependencies> <dependency> <groupId>com.springboot.utui</groupId> <artifactId>utui-service</artifactId> <version>${project.parent.version}</version> </dependency> </dependencies> <!-- 這裏使用的是Spring boot自有的功能,將項目打包成jar,指定啓動main所在的加載類,打包成jar後,可以使用java -jar utui-web.jar啓動項目 --> <build> <finalName>utui-web</finalName><!-- 指定打包後jar包的名稱 --> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.springboot.utui.web.ApplicationBoot</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <!-- 這裏也可以不指定main方法所在的類,可以簡化爲下面的形式 --> <build> <finalName>utui-web</finalName><!-- 指定打包後jar包的名稱 --> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
service模塊pom.xml:
<dependencies> <dependency> <groupId>com.springboot.utui</groupId> <artifactId>utui-facade</artifactId> <version>${project.parent.version}</version> </dependency> </dependencies>
facade模塊pom.xml不添加任何內容保持原始。
說明:這裏所有模塊都沒有添加其他的相關依賴,因爲依賴在父pom.xml文件中已經全部導入,因爲用的是dependencies標籤。項目目錄結構
|-utui-web
|-src
|-main
|-java
|-com.springboot.utui.web
|-controller
|-BootUtuiController
|-ApplicationBoot
|-resource
|-static
|-templates
|-index.html
|-application.properties
|-logback.xml
結構說明:在Springboot的web項目中,靜態文件默認是放在resource/static目錄下,html文件默認放在resource/templates目錄下,這裏創建了一個index.html文件,方便演示,注意thymeleaf對標籤要求嚴格,如果不出意外的話html文件中有一個標籤<meta charset="UTF-8">
,訪問該頁面的時候會報錯,因爲這個標籤沒有封閉,需要修改成<meta charset="UTF-8"/>
。
代碼分析
ApplicationBoot代碼
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.springboot.utui"}) //掃描包
public class ApplicationBoot {
public static void main(String[] args) {
SpringApplication.run(ApplicationBoot.class, args);
}
}
BootUtuiController代碼
@Controller //注意這裏不要使用RestController,這樣會導致頁面沒法展示的問題,如果需要返回Json串,直接在方法上加@ResponseBody即可
@RequestMapping("/boot")
@Slf4j
public class BootUtuiController {
//獲取JSON串
@RequestMapping(method = RequestMethod.GET, value = "/getJson")
@ResponseBody
public UserModel getJson() {
log.info(">>>>測試日誌/boot/getJson");
return new UserModel("zhangsan", 12);//這裏的UserModel類放在facade裏面,個人開發習慣,根據實際情況,自己選擇存放位置
}
//獲取頁面
@RequestMapping(method = RequestMethod.GET, value = "/index")
public String index() {
log.info(">>>>測試日誌/boot/index");
return "index";
}
}
application.properties配置
其實這裏可以保持空文件,如果想捯飭一下可以加一下服務的信息,如server.port=8088等,不多說,初始實驗保持默認即可。
logback.xml配置
註釋很詳細,唯一需要注意的是配置log文件存放的位置。
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定義日誌文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
<property name="LOG_HOME" value="D:\\Program Files (x86)\\log" />
<!-- 控制檯輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日誌消息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<!-- 成功日誌文件 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/info/utui-web-info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日誌文件輸出的文件名-->
<FileNamePattern>
${LOG_HOME}/info/utui-web-info.%d{yyyy-MM-dd}.log
</FileNamePattern>
<!--日誌文件保留天數-->
<MaxHistory>7</MaxHistory>
</rollingPolicy>
<!-- 指定日誌格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日誌消息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
<!-- 只打印錯誤日誌 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!--日誌文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 失敗日誌文件 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/error/utui-web-error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日誌文件輸出的文件名-->
<FileNamePattern>
${LOG_HOME}/error/utui-web-error.%d{yyyy-MM-dd}.log
</FileNamePattern>
<!--日誌文件保留天數-->
<MaxHistory>7</MaxHistory>
</rollingPolicy>
<!-- 指定日誌格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日誌消息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
<!-- 只打印錯誤日誌 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!--日誌文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日誌輸出級別 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="INFO_FILE"/>
<appender-ref ref="ERROR_FILE"/>
</root>
</configuration>
啓動項目
IDEA直接啓動
步驟:
- 右擊ApplicationBoot啓動類->Run 'ApplicationBoot.main()'
- 瀏覽器輸入
http://localhost:8080/boot/index
,輸出的是一個頁面,顯示的是頁面的內容:Hello Spring Boot!
- 瀏覽器輸入
http://localhost:8080/boot/getJson
,輸出一個JSON串:{"userName":"zhangsan","age":12}
到這裏項目都完全搭建成功。
但是還希望能夠普及一個知識點,就是使用上面提到的java -jar web.jar方式啓動項目。
JAR方式啓動
步驟:
- 項目打包,然後到將utui-web.jar包複製出來(當然不復制也行)
- 命令行進入
utui-web.jar
所在的目錄,執行java -jar utui-web.jar
(注意當前執行命令的這臺機器要安裝jdk) - 瀏覽器輸入
http://localhost:8080/boot/index
,輸出的是一個頁面,顯示的是頁面的內容:Hello Spring Boot!
- 瀏覽器輸入
http://localhost:8080/boot/getJson
,輸出一個JSON串:{"userName":"zhangsan","age":12}
幾個坑坑坑
-
如果項目中沒有引入thymeleaf,那麼在訪問http://localhost:8080/boot/index的時候是會有問題的。
- 之前使用ssm(spring+springMVC+mybatis)的兄弟姐妹們,會習慣在web模塊的pom.xml文件中添加tomcat7插件,通過tomcat插件啓動,這個時候會啓動不起來的,因爲Spring Boot內置了tomcat,現在用tomcat插件啓動,就必須把Spring boot內置的tomcat去掉,實現方式就是在父pom.xml文件中的spring-boot-starter-web下把tomcat排除掉。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>
- web項目的打包,用jar的方式和war的方式都是沒有問題的(上面描述的時候用的jar,後來試用了war也是OK的)。
#### spring boot構建基礎版web項目系列:
- [spring boot構建基礎版web項目(一)springboot、thymeleaf控制層基礎構建](http://www.minuor.com/147852147/article)
- [spring boot構建基礎版web項目(二)-spring boot、mybatis整合及相關插件引入](http://www.minuor.com/1523881561/article)
- [spring boot構建基礎版web項目(三)-springboot、redis數據緩存整合](http://www.minuor.com/1523882147/article)