欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring boot构建基础版web项目(一)springboot、thymeleaf控制层基础构建

程序员文章站 2022-04-25 08:25:01
...

原文作者:弥诺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直接启动

步骤:

  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项目系列: