spring boot構建基礎版web項目(一)springboot、thymeleaf控制層基礎構

原文作者:彌諾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的所有模塊的總配置文件,這裏採用的是&lt;dependencies&gt;&lt;/dependencies&gt;標籤引入依賴,這些依賴會被全部下載,並加載到每個子模塊內,另外有的是在dependencies外再套一層&lt;dependencyManagement&gt;&lt;/dependencyManagement&gt;,當這個時候,依賴不會被自動注入到子模塊,只是做一個依賴的管理作用,子模塊通過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文件中有一個標籤&lt;meta charset="UTF-8"&gt;,訪問該頁面的時候會報錯,因爲這個標籤沒有封閉,需要修改成&lt;meta charset="UTF-8"/&gt;

代碼分析

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直接啓動

步驟:

  1. 右擊ApplicationBoot啓動類->Run 'ApplicationBoot.main()'
  2. 瀏覽器輸入http://localhost:8080/boot/index,輸出的是一個頁面,顯示的是頁面的內容:Hello Spring Boot!
  3. 瀏覽器輸入http://localhost:8080/boot/getJson,輸出一個JSON串:{"userName":"zhangsan","age":12}

到這裏項目都完全搭建成功。
但是還希望能夠普及一個知識點,就是使用上面提到的java -jar web.jar方式啓動項目。

JAR方式啓動

步驟:

  1. 項目打包,然後到將utui-web.jar包複製出來(當然不復制也行)
  2. 命令行進入utui-web.jar所在的目錄,執行java -jar utui-web.jar(注意當前執行命令的這臺機器要安裝jdk)
  3. 瀏覽器輸入http://localhost:8080/boot/index,輸出的是一個頁面,顯示的是頁面的內容:Hello Spring Boot!
  4. 瀏覽器輸入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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章