SpringBoot从0到0.7——第四天
SpringBoot从0到0.7——第四天
今天进行实战开发一个小项目,SpringBoot和Thymeleaf集成的小项目
因为懒得写写前端,直接找的别人的项目在它的的基础上进行配置,进行修改。gitee项目下载
项目说明:
## 项目说明
本项目使用SpringBoot开发,jdbc5.1.48
### 1.数据库信息
创建两个表,管理员表user和员工表employee
### 2.项目流程
1.springboot集成thymeleaf
1).引入依赖
<!--使用thymelaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency> 2).配置thymeleaf模板配置
spring:
thymeleaf:
cache: false # 关闭缓存
prefix: classpath:/templates/ #指定模板位置
suffix: .html #指定后缀
3).开发controller跳转到thymeleaf模板
@Controller
@RequestMapping("hello")
public class HelloController {
@RequestMapping("hello")
public String hello(){
System.out.println("hello ok");
return "index"; // templates/index.html
}
}
=================================================================
2.thymeleaf 语法使用
1).html使用thymeleaf语法 必须导入thymeleaf的头才能使用相关语法
namespace: 命名空间
<html lang="en" xmlns:th="http://www.thymeleaf.org">
2).在html中通过thymeleaf语法获取数据
================================================================
###3.案例开发流程
需求分析: 分析这个项目含有哪些功能模块
用户模块:
注册
登录
验证码
安全退出
真是用户
员工模块:
添加员工+上传头像
展示员工列表+展示员工头像
删除员工信息+删除员工头像
更新员工信息+更新员工头像
库表设计(概要设计): 1.分析系统有哪些表 2.分析表与表关系 3.确定表中字段(显性字段 隐性字段(业务字段))
2张表
1.用户表 user
id username realname password gender
2.员工表 employee
id name salary birthday photo
创建一个库: ems-thymeleaf
详细设计:
省略
编码(环境搭建+业务代码开发)
1.创建一个springboot项目 项目名字: ems-thymeleaf
2.修改配置文件为 application.yml pom.xml 2.5.0
3.修改端口 项目名: ems-thymeleaf
4.springboot整合thymeleaf使用
a.引入依赖
b.配置文件中指定thymeleaf相关配置
c.编写控制器测试
5.springboot整合mybatis
mysql、druid、mybatis-springboot-stater
b.配置文件中
6.导入项目页面
static 存放静态资源
templates 目录 存放模板文件
测试
上线部署
维护
发版
首先导入项目
等待加载依赖完成
创建数据库导入数据---看一下它的application.yml
看一下yapplication.yml里面还有什么需要配置的---照片保存地址
启动项目
登录,看一下后台
分析一下这个小项目:
首先看一下application.yml
#关闭thymeleaf模板缓存
spring:
thymeleaf:
cache: false
prefix: classpath:/templates/ #指定模板位置
suffix: .html #指定后缀名
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssmbuild?characterEncoding=UTF-8
username: root
password: 123456
web:
resources:
static-locations: classpath:/static/,file:${photo.file.dir} #暴露哪些资源可以通过项目名访问 mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.xuda.springboot.pojo
#Mybatis配置 #日志配置
logging:
level:
root: info
com.xuda: debug #指定文件上传的位置
photo:
file:
dir: C:\Users\15969\Desktop\站点\Spring boot\SpringBootStudy\photo
config-LoginHandlerInterceptor拦截器,防止未授权访问
package com.xuda.springboot.config; import com.xuda.springboot.controller.UserController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @Configuration
public class LoginHandlerInterceptor implements HandlerInterceptor {
private static final Logger log = LoggerFactory.getLogger(LoginHandlerInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("session+=》{}",request.getSession().getAttribute("user"));
//登录成功后,应该有用户得session
Object loginuser = request.getSession().getAttribute("user");
if (loginuser == null) {
request.setAttribute("loginmsg", "没有权限请先登录");
request.getRequestDispatcher("/login.html").forward(request, response);
return false;
} else {
return true;
}
} }
这个项目很适合新手来分析学习,搭建简单,代码易懂
在此基础上添加修改,给它的日志保存下来,这样有利于分析日志,如何将日志保存到本地呢
先在resources目录下建立logback-spring.xml
<?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"/>
<!-- info日志单文件大小限制 -->
<springProperty scope="context" name="logback.fileInfoLog.maxFileSize" source="logback.fileInfoLog.maxFileSize" defaultValue="200MB" />
<!-- info日志最大保留时长单位天 -->
<springProperty scope="context" name="logback.fileInfoLog.maxHistory" source="logback.fileInfoLog.maxHistory" defaultValue="15" />
<!-- info日志文件总大小,超过该大小,旧得即将删除 -->
<springProperty scope="context" name="logback.fileInfoLog.totalSizeCap" source="logback.fileInfoLog.totalSizeCap" defaultValue="100GB" /> <!-- error日志单文件大小限制 -->
<springProperty scope="context" name="logback.fileErrorLog.maxFileSize" source="logback.fileErrorLog.maxFileSize" defaultValue="200MB" />
<!-- error日志最大保留时长单位天 -->
<springProperty scope="context" name="logback.fileErrorLog.maxHistory" source="logback.fileErrorLog.maxHistory" defaultValue="15" />
<!-- error日志文件总大小,超过该大小,旧得即将删除 -->
<springProperty scope="context" name="logback.fileErrorLog.totalSizeCap" source="logback.fileErrorLog.totalSizeCap" defaultValue="100GB" /> <!-- http日志单文件大小限制 -->
<springProperty scope="context" name="logback.fileHttpLog.maxFileSize" source="logback.fileHttpLog.maxFileSize" defaultValue="200MB" />
<!-- http日志最大保留时长单位天 -->
<springProperty scope="context" name="logback.fileHttpLog.maxHistory" source="logback.fileHttpLog.maxHistory" defaultValue="15" />
<!-- http日志文件总大小,超过该大小,旧得即将删除 -->
<springProperty scope="context" name="logback.fileHttpLog.totalSizeCap" source="logback.fileHttpLog.totalSizeCap" defaultValue="100GB" />
<!-- 日志目录 -->
<springProperty scope="context" name="logback.rootDir" source="logback.rootDir" defaultValue="logs"/>
<!-- 控制台输出得日志格式 -->
<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}"/>
<!-- 日志文件输出得日志格式 -->
<property name="FILE_LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%c:%L]-%m%n"/>
<!-- 控制台输出 -->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</layout>
</appender>
<!-- info日志得设定 -->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${logback.rootDir}/${springAppName}.log</file>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy" >
<!--路径-->
<fileNamePattern>${logback.rootDir}/%d{yyyy-MM,aux}/%d{yyyy-MM-dd,aux}/${springAppName}-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<maxFileSize>${logback.fileInfoLog.maxFileSize}</maxFileSize>
<maxHistory>${logback.fileInfoLog.maxHistory}</maxHistory>
<totalSizeCap>${logback.fileInfoLog.totalSizeCap}</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
</appender> <!-- 错误日志 -->
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${logback.rootDir}/${springAppName}-error.log</file>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy" >
<!--路径-->
<fileNamePattern>${logback.rootDir}/%d{yyyy-MM,aux}/%d{yyyy-MM-dd,aux}/${springAppName}-error-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<maxFileSize>${logback.fileErrorLog.maxFileSize}</maxFileSize>
<maxHistory>${logback.fileErrorLog.maxHistory}</maxHistory>
<totalSizeCap>${logback.fileErrorLog.totalSizeCap}</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
</appender> <!-- http日志 -->
<appender name="httpInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %m%n</pattern>
</encoder>
<file>${logback.rootDir}/${springAppName}-http.log</file>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>${logback.rootDir}/%d{yyyy-MM,aux}/%d{yyyy-MM-dd,aux}/${springAppName}-http-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<maxFileSize>${logback.fileHttpLog.maxFileSize}</maxFileSize>
<maxHistory>${logback.fileHttpLog.maxHistory}</maxHistory>
<totalSizeCap>${logback.fileHttpLog.totalSizeCap}</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
</appender> <appender name="ASYNC_consoleLog" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="consoleLog"/>
</appender>
<appender name="ASYNC_fileInfoLog" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="fileInfoLog"/>
</appender>
<appender name="ASYNC_fileErrorLog" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="fileErrorLog"/>
</appender>
<appender name="ASYNC_httpInfoLog" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="httpInfoLog"/>
</appender> <root level="info">
<appender-ref ref="ASYNC_consoleLog" />
<appender-ref ref="ASYNC_fileInfoLog" />
<appender-ref ref="ASYNC_fileErrorLog" />
</root>
<logger name="log_http" additivity="false" level="INFO">
<appender-ref ref="ASYNC_httpInfoLog"/>
</logger> </configuration>
在application.yml添加
spring:
application:
name: log
重新运行项目即可看到,在项目目录下会出现一个log文件夹,里面包含着日志
到此,已经能简单的看懂java代码了,开始看源码,去进行java代码审计!!!
SpringBoot从0到0.7——第四天的更多相关文章
- SpringBoot从0到0.7——第一天
SpringBoot从0到0.7--第一天 学习的第一步当然是收拾好心情,先把环境搭建起来,写出第一个helloword出来. 第一步:安装IDEA和Tomcat 我安装的是IDEA 2021.2.2 ...
- React + Springboot + Quartz,从0实现Excel报表自动化
一.项目背景 企业日常工作中需要制作大量的报表,比如商品的销量.销售额.库存详情.员工打卡信息.保险报销.办公用品采购.差旅报销.项目进度等等,都需要制作统计图表以更直观地查阅.但是报表的制作往往需要 ...
- AFNetworking 3.0 源码解读(四)之 AFURLResponseSerialization
本篇是AFNetworking 3.0 源码解读的第四篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...
- Angular 2.0 从0到1 (四)
第一节:Angular 2.0 从0到1 (一)第二节:Angular 2.0 从0到1 (二)第三节:Angular 2.0 从0到1 (三)第四节:Angular 2.0 从0到1 (四)第五节: ...
- springboot+spring security +oauth2.0 demo搭建(password模式)(认证授权端与资源服务端分离的形式)
项目security_simple(认证授权项目) 1.新建springboot项目 这儿选择springboot版本我选择的是2.0.6 点击finish后完成项目的创建 2.引入maven依赖 ...
- springboot 升级到2.0后 context-path 配置 不起作用,不生效 不管用 皆是因为版本改动导致的在这里记录一下
不知不觉,新的项目已经将springboot升级为2.0版本了.刚开始没有配置server.contextpath,默认的“/”,然后今天放到自己的服务器上,所以就要规范名称. 结果,失败了,无论我 ...
- springboot升级到2.0后context-path配置不起作用
springboot升级到2.0后,context-path配置不起作用,改成了: server.servlet.context-path=/projname
- Flink 从0到1学习—— 分享四本 Flink 国外的书和二十多篇 Paper 论文
前言 之前也分享了不少自己的文章,但是对于 Flink 来说,还是有不少新入门的朋友,这里给大家分享点 Flink 相关的资料(国外数据 pdf 和流处理相关的 Paper),期望可以帮你更好的理解 ...
- 从0系统学Android--3.2四种基本布局
从0系统学Android--3.2四种基本布局 本系列文章目录:更多精品文章分类 本系列持续更新中.... 3.3 系统控件不够用?创建自定义控件 上一节我们学习了 Android 中的一些常用的控件 ...
随机推荐
- Mybatis有哪些执行器?
Mybatis有三种基本的Executor执行器: SimpleExecutor.ReuseExecutor.BatchExecutor. SimpleExecutor:每执行一次 ...
- 转载:mysql引擎innodb和MyIsam的区别
转载至:https://my.oschina.net/suyain/blog/1925807 Innodb引擎: 1.Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级 ...
- 解释基于 XML Schema 方式的切面实现?
在这种情况下,切面由常规类以及基于 XML 的配置实现.
- HTML 5中不同的新表单元素类型是什么?
HTML 5推出了10个重要的新的表单元素: Color. Date Datetime-local Email Time Url Range Telephone Number Search
- 学习MySql(一)
一.安装部署mysql 1.安装mysql: # yum -y install autoconf libaio libaio-devel # groupadd mysql # useradd -r - ...
- stm32 中库函数、结构体、地址的强制类型转换、相应特殊功能寄存器之间的关系
以一个挂接在APB2上的外设函数使能为例 A : RCC_APB2PeriphClockCmd():时钟使能函数 1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFI ...
- HTML5 Canvas绘制效率如何?
js运行效率在提升 编程语言的效率是前提,js自然比不上native的C语言效率,所以Canvas效率无疑比不上原生的2D图形绘制,但是js效率的提升是有目共睹的,以js与as为例,基本操作(运算操作 ...
- 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
回顾 上一节我们搭建了游戏的骨架,添加了四个游戏场景,分别是加载.开始.游戏.结束.那么这一节我们来介绍加载这个场景,顺带丰富一下各个场景的基本内容. Phaser.Loader Phaser框架自带 ...
- 正则系列——JavaScript正则表达式入门心得
我发现有个别字符被这个编辑器给刷掉了,但是灰色区域显示正常,以灰色区域代码为准 什么玩意? 在我刚开始学习编程的时候,就听过正则了,也听说正则很牛逼,懂正则的更牛逼.但是苦于没有人指点,也没有使用正则 ...
- leetcode 1962. 移除石子使总数最小
题目描述: 给你一个整数数组 piles ,数组 下标从 0 开始 ,其中 piles[i] 表示第 i 堆石子中的石子数量.另给你一个整数 k ,请你执行下述操作 恰好 k 次: 选出任一石子堆 p ...