SpringCloud(20)—— Springboot Web项目搭建
1、整体项目结构

根据上图 一共分为 4部分
2、首先pom.xml 文件
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sinosoft</groupId> <artifactId>springboot-web</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>springboot-web Maven Webapp</name> <url>http://maven.apache.org</url> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <!-- 设置第三方依赖及项目构建的版本号--> <properties> <java.version>1.8</java.version> <springfox.version>2.5.0</springfox.version> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> <dependencies> <!-- spring-boot-starter-web 是一个用于构建 Web 的 Starter , 包括构建 RESTful 服务应用、Spring MVC 应用等。 并且不需要额外配置容器,默认使用 Tomcat 作为嵌入式容器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 处理Weblogic 中间件 jar 冲突--> <exclusions> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> </exclusion> </exclusions> </dependency> <!-- 服务监控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- 基于HATEOAS的RESTful服务的支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-hateoas</artifactId> </dependency> <!-- 模板引擎 提供了SpringMvc完美的支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- Springboot test--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- Swagger UI --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${springfox.version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${springfox.version}</version> </dependency> <!-- 解决前后端接口交互跨域问题 --> <dependency> <groupId>com.thetransactioncompany</groupId> <artifactId>cors-filter</artifactId> <version>1.7</version> </dependency> <dependency> <groupId>com.thetransactioncompany</groupId> <artifactId>java-property-utils</artifactId> <version>1.9</version> </dependency> <!-- 热部署模块--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <!-- 这个需要为 true 热部署才有效 --> </dependency> </dependencies> <build> <finalName>springboot-web</finalName> <plugins> <!-- maven compiler--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <!-- Skip Test True--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> <!-- maven support Spring boot jar and war--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- configuring it not to fail if the web.xml is missing--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> <archive> <manifest> <addDefaultImplementationEntries>false</addDefaultImplementationEntries> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>
3、weblogic.xml、web.xml、dispatcherServlet-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd"> <wls:context-root>/v8</wls:context-root> <wls:container-descriptor> <wls:prefer-application-packages> <wls:package-name>org.slf4j.*</wls:package-name> <wls:package-name>org.springframework.*</wls:package-name> </wls:prefer-application-packages> </wls:container-descriptor> </wls:weblogic-web-app>
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <welcome-file-list> <welcome-file>/*.html</welcome-file> <welcome-file>/*.htm</welcome-file> <welcome-file>/*.jsp</welcome-file> </welcome-file-list> </web-app>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
4、logback.xml、application.yml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<springProperty scope="context" name="springAppName" source="spring.application.name"/>
<!-- You can override this to have a custom pattern -->
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!--
Appender
FILEERROR对应error级别,文件名以log-error-xxx.log形式命名
FILEWARN对应warn级别,文件名以log-warn-xxx.log形式命名
FILEINFO对应info级别,文件名以log-info-xxx.log形式命名
FILEDEBUG对应debug级别,文件名以log-debug-xxx.log形式命名
stdout将日志信息输出到控制上,为方便开发测试使用
-->
<contextName>SpringBootDemo</contextName>
<property name="LOG_PATH" value="/opt/bak/data/demo" />
<!--设置系统日志目录-->
<property name="APPDIR" value="demo" />
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<!-- 文件日志格式 -->
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" />
<!-- 日志记录器,日期滚动记录 -->
<appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${LOG_PATH}/${APPDIR}/log_error.log</file>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
命名日志文件,例如log-error-2017-03-23.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,这里设置每天滚动,且<maxHistory> 是 30,则只保存最近30天的文件,删除之前的旧文件,
注意:删除旧文件是哪些为了归档而创建的目录也会被删除 maxHistory 必须结合CleanHistoryOnStart使用 -->
<!--<maxHistory>30</maxHistory>-->
<!--<CleanHistoryOnStart>true</CleanHistoryOnStart>-->
<!-- 暂时用不到这个配置 -->
<!--<historyAsFileCount>true</historyAsFileCount>-->
<!-- 可选节点,用来指定日志文件的上限大小,例如设置为10GB的话,那么到了这个值,就会删除旧的日志
(慎用) -->
<!--<totalSizeCap>10GB</totalSizeCap>-->
</rollingPolicy>
<!-- 追加方式记录日志 -->
<append>true</append>
<!-- 日志文件的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日志文件只记录error级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 日志记录器,日期滚动记录 -->
<appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${LOG_PATH}/${APPDIR}/log_warn.log</file>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 归档的日志文件的路径,例如今天是2017-03-23日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
而2017-03-23的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
命名日志文件,例如log-error-2017-03-23.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,这里设置每天滚动,且<maxHistory> 是 30,则只保存最近30天的文件,删除之前的旧文件,
注意:删除旧文件是哪些为了归档而创建的目录也会被删除 maxHistory 必须结合CleanHistoryOnStart使用 -->
<!--<maxHistory>30</maxHistory>-->
<!--<CleanHistoryOnStart>true</CleanHistoryOnStart>-->
<!-- 暂时用不到这个配置 -->
<!--<historyAsFileCount>true</historyAsFileCount>-->
<!-- 可选节点,用来指定日志文件的上限大小,例如设置为10GB的话,那么到了这个值,就会删除旧的日志
(慎用) -->
<!--<totalSizeCap>10GB</totalSizeCap>-->
</rollingPolicy>
<!-- 追加方式记录日志 -->
<append>true</append>
<!-- 日志文件的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日志文件只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 日志记录器,日期滚动记录 -->
<appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${LOG_PATH}/${APPDIR}/log_info.log</file>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 归档的日志文件的路径,例如今天是2017-03-23日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
而2017-03-23的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
命名日志文件,例如log-error-2017-03-23.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,这里设置每天滚动,且<maxHistory> 是 30,则只保存最近30天的文件,删除之前的旧文件,
注意:删除旧文件是哪些为了归档而创建的目录也会被删除 maxHistory 必须结合CleanHistoryOnStart使用 -->
<!--<maxHistory>30</maxHistory>-->
<!--<CleanHistoryOnStart>true</CleanHistoryOnStart>-->
<!-- 暂时用不到这个配置 -->
<!--<historyAsFileCount>true</historyAsFileCount>-->
<!-- 可选节点,用来指定日志文件的上限大小,例如设置为10GB的话,那么到了这个值,就会删除旧的日志
(慎用) -->
<!--<totalSizeCap>10GB</totalSizeCap>-->
</rollingPolicy>
<!-- 追加方式记录日志 -->
<append>true</append>
<!-- 日志文件的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 日志记录器,日期滚动记录 -->
<appender name="FILEDEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${LOG_PATH}/${APPDIR}/log_debug.log</file>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 归档的日志文件的路径,例如今天是2017-03-23日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
而2017-03-23的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${APPDIR}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
命名日志文件,例如log-error-2017-03-23.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,这里设置每天滚动,且<maxHistory> 是 30,则只保存最近30天的文件,删除之前的旧文件,
注意:删除旧文件是哪些为了归档而创建的目录也会被删除 maxHistory 必须结合CleanHistoryOnStart使用 -->
<!--<maxHistory>30</maxHistory>-->
<!--<CleanHistoryOnStart>true</CleanHistoryOnStart>-->
<!-- 暂时用不到这个配置 -->
<!--<historyAsFileCount>true</historyAsFileCount>-->
<!-- 可选节点,用来指定日志文件的上限大小,例如设置为10GB的话,那么到了这个值,就会删除旧的日志
(慎用) -->
<!--<totalSizeCap>10GB</totalSizeCap>-->
</rollingPolicy>
<!-- 追加方式记录日志 -->
<append>true</append>
<!-- 日志文件的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!--encoder 默认配置为PatternLayoutEncoder-->
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
</appender>
<!-- Appender to log to file in a JSON format -->
<!--<appender name="logstash" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!--<file>${LOG_FILE}.json</file>-->
<!--<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!--<fileNamePattern>${LOG_FILE}.json.%d{yyyy-MM-dd}.gz</fileNamePattern>-->
<!--<maxHistory>7</maxHistory>-->
<!--</rollingPolicy>-->
<!--<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">-->
<!--<providers>-->
<!--<timestamp>-->
<!--<timeZone>UTC</timeZone>-->
<!--</timestamp>-->
<!--<pattern>-->
<!--<pattern>-->
<!--{-->
<!--"severity": "%level",-->
<!--"service": "${springAppName:-}",-->
<!--"trace": "%X{X-B3-TraceId:-}",-->
<!--"span": "%X{X-B3-SpanId:-}",-->
<!--"parent": "%X{X-B3-ParentSpanId:-}",-->
<!--"exportable": "%X{X-Span-Export:-}",-->
<!--"pid": "${PID:-}",-->
<!--"thread": "%thread",-->
<!--"class": "%logger{40}",-->
<!--"rest": "%message"-->
<!--}-->
<!--</pattern>-->
<!--</pattern>-->
<!--</providers>-->
<!--</encoder>-->
<!--</appender>-->
<logger name="org.springframework" level="warn" />
<logger name="org.hibernate" level="warn" />
<!-- 生产环境下,将此级别配置为适合的级别,以免日志文件太多或影响程序性能 -->
<root level="INFO">
<appender-ref ref="FILEERROR" />
<appender-ref ref="FILEWARN" />
<appender-ref ref="FILEINFO" />
<appender-ref ref="FILEDEBUG" />
<!-- 生产环境将请stdout去掉 -->
<appender-ref ref="STDOUT" />
<!--<appender-ref ref="logstash"/>-->
</root>
</configuration>
server: port: 10087 --- spring: application: name: demo --- info: name: demo description: /swagger-ui.html version: 1.0 --- # https://www.cnblogs.com/arthy/p/6902960.html spring: session: store-type: none --- logging: level: root: INFO org.hibernate: INFO org.hibernate.type.descriptor.sql.BasicBinder: TRACE org.hibernate.type.descriptor.sql.BasicExtractor: TRACE --- spring: output: ansi: enabled: detect #检查终端是否支持ANSI,是的话就采用彩色输出,增强日志的可读性 thymeleaf: suffix: .html #网页后缀名 mode: HTML5 #网页类型 prefix: classpath:/templates/ #网页所在路径 encoding: UTF-8 #网页编码类型 servlet: content-type: text/html #web容器类型 cache: false #禁止thymeleaf缓存(建议:开发环境设置为false,生成环境设置为true) --- spring: http: encoding: enabled: false
5、templates下的index.html、login.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta content="test/html" charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>首页</title>
<script src="bootstrap/jquery.min.js"></script>
<link rel="stylesheet" href="bootstrap/css/bootstrap.css"/>
<script src="bootstrap/js/bootstrap.js"></script>
</head>
<body>
<div align="center">
<div style="width: 100% ; margin-top: 200px" align="center">
<h3><span th:text="${msg}"></span></h3>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta content="test/html" charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>登录首页</title>
<script src="bootstrap/jquery.min.js"></script>
<link rel="stylesheet" href="bootstrap/css/bootstrap.css"/>
<script src="bootstrap/js/bootstrap.js"></script>
</head>
<body>
<div align="center">
<div style="width: 50% ; margin-top: 200px" align="center">
<form method="post" class="form-horizontal" action="index">
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">Email</label>
<div class="col-sm-10">
<input type="email" name="email" class="form-control" id="inputEmail3" placeholder="Email"/>
</div>
</div>
<div class="form-group">
<label for="inputPassword3" class="col-sm-2 control-label">Password</label>
<div class="col-sm-10">
<input type="password" name="password" class="form-control" id="inputPassword3"
placeholder="Password"/>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label>
<input type="checkbox"/> Remember me
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">Sign in</button>
</div>
</div>
</form>
</div>
</div>
</body>
</html>
6、static下的 bootstrap 自己去官网下

7、Application.java
package com.sinosoft; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.Banner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.annotation.ComponentScan; import org.springframework.web.WebApplicationInitializer; /** * Created by xushuyi on 2018/3/15. * 启动类 * 支持Tomcat 继承 SpringBootServletInitializer * 支持Weblogic 实现 WebApplicationInitializer */ @ComponentScan @SpringBootApplication public class Application extends SpringBootServletInitializer implements WebApplicationInitializer { /** * 日志 */ private static final Logger LOGGER = LoggerFactory.getLogger(Application.class); /** * 启动 main 主函数 * * @param args args */ public static void main(String[] args) { SpringApplication.run(Application.class, args); } /** * 重新 SpringBootServletInitializer 方法 * * @param builder SpringApplicationBuilder * @return SpringApplicationBuilder */ @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return configureApplication(builder); } private static SpringApplicationBuilder configureApplication(SpringApplicationBuilder builder) { LOGGER.info("Tomcat中间件启动服务..."); return builder.sources(Application.class).bannerMode(Banner.Mode.OFF); } }
8、LoginController、DemoController
package com.sinosoft.controller; import com.sinosoft.common.ResultResponse; import com.sinosoft.dto.LoginReq; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; /** * Created by xushuyi on 2018/3/17. */ @Controller @RequestMapping("/") public class LoginController { private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class); /** * 进入登录首页 * * @return */ @RequestMapping(value = "login", method = RequestMethod.GET) public String login() { LOGGER.info("进入登录首页..."); return "./login"; } /** * 执行登录 * * @return */ @RequestMapping(value = "index", method = RequestMethod.POST, produces = MediaType.ALL_VALUE) public ModelAndView index(LoginReq loginReq) { LOGGER.info("执行登录操作..."); LOGGER.info("入参:" + loginReq.toString()); ResultResponse response = new ResultResponse(); if ("1".equals(loginReq.getPassword())) { response.setResultCode("01"); response.setResultMessage("登录成功"); } else { response.setResultCode("02"); response.setResultMessage("登录失败"); } return new ModelAndView("index", "msg", response); } }
package com.sinosoft.controller; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.swagger2.annotations.EnableSwagger2; /** * Created by xushuyi on 2018/3/15. */ @RestController @RequestMapping("/api/demo") @EnableAutoConfiguration @EnableSwagger2 public class DemoController { @RequestMapping(value = "/", method = RequestMethod.GET) public String hello() { return "Hello World!"; } }

浙公网安备 33010602011771号