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的所有模块的总配置文件,这里采用的是
<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方式启动
步骤:
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的)。