个⼈博客⽹站(四)-后端项⽬
简介:
这节聊⼀聊项⽬的后端,之前也讲过,因为对前端不熟悉,所以在前端花了太多的时间,导致到后端开发的时候搞的⼈有点疲,所以很多东西从简了,很多细节东西没有考虑,只想着把基本功能做出来就好了。框架选择的是现在⽐较流⾏的Springboot+Mybatis+Tomcat+MySQL,Springboot是在Spring的基础上做了集成和配置简化,使⽤起来超级舒服。
⼀、搭建Springboot框架
1. 框架简介
Springboot是现在⾮常⽕热的JavaEE框架,其设计⽬的是⽤来简化新Spring应⽤的初始搭建以及开发过程,为什么这么说呢,看⼀下他的⼏个特点:
>>> 嵌⼊的Tomcat,⽆需部署WAR⽂件
>>> 简化Maven配置
>>> ⾃动配置Spring
>>> 提供⽣产就绪型功能,如指标,健康检查和外部配置
>>> 对XML也没有配置要求,⽐较灵活
然后我们选择Maven来管理我们的JAR包,这个没什么好说的,以后我们⽤⼀个pom⽂件就可以⾛天下了,不⽤在背着沉重的JAR包到处跑。
2. Springboot项⽬初始化
1. 项⽬管理⼯具,现在⼀般使⽤Maven来管理
2. 项⽬开发语⾔
3. 这是Springboot版本
4. 项⽬唯⼀标识,可以⽤来确定下⾯的包名
5. 项⽬名称
6. 项⽬包名、打包⽅式、java版本
7. 项⽬依赖:下⾯勾选对应的依赖,这⾥我只选了web可以视⾃⼰情况⽽定
8. ⽣成项⽬
这⾥直接⽣成yytf.zip包,我们解压后⽤eclipse使⽤导⼊maven项⽬⽅式导⼊项⽬(这⾥要注意刚导⼊后项⽬⽬录不是下图中这种结构,要等⼀会jar包下载完成后才会形成如下图结构),如下图⽬录就是导⼊后的⽬录结构,⽽pom⽂件⾥的参数也是我们之前在⽹页填写的对号⼊座。
然后我们到项⽬的启动⽂件,这⾥是BlogApplication.java,右键run as使⽤java application运⾏,控制台出现Started BlogApplication in 2.101 seconds (JVM running for 2.455)则springboot启动成功。
⼆、项⽬配置
1. 配置l引⼊需要的JAR包
<dependencies>
<!-- springboot启动依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 排除Springboot⾃带的⽇志⼯具 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
<!-- 使⽤外部TOMCAT⽅式⼀:排除Springboot⾃带的tomcat -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 使⽤外部TOMCAT⽅式⼆:添加provided -->
<!-- provided:已提供依赖范围。使⽤此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运⾏时候⽆效 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- springboot整合log4j -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- springboot整合mybatis -->
<dependency>
<groupId&batis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId&batis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!-- springboot连接mysql驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!-- springboot整合jwt的token验证 -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>2.2.0</version>
</dependency>
</dependencies>
<!-- generate⼯具⽣成dao,mapper,xml -->
<build>
<finalName>blog</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<!-- 此配置不可缺,否则mybatis的l将会丢失 -->
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!-- 指定资源的位置 -->
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
2. 配置外部tomcat部署项⽬
2.1 maven依赖配置
⾸先我们把打包⽅式改成war,在l把<packaging>jar</packaging>修改成<packaging>war</packaging>,在上⾯的l中已经写清楚两种使⽤外部tomcat⽅式:第⼀种是去掉springboot内置的tomcat,第⼆中时在运⾏时使内部tomcat失效
2.2 修改启动类
在Application.java中继承SpringBootServletInitializer并重写configure⽅法
f;
batis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.scheduling.annotation.EnableScheduling;
@MapperScan("f.dao")
@SpringBootApplication
@EnableScheduling
public class Application extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3.配置l⾃动⽣成vo,dao,mapper
3.1在l中修改build标签,代码上⾯已贴出
3.2 ⾸先安装eclipse插件:Mybatis Generator 1.3.5,Eclipse => Help => Eclipse Marketplace 搜索mybatis安装最新版本
3.3 ⽣成l⽂件
New⼀个⽂件,然后选择mybatis generator configuration file,然后选择到l⽂件要保存的位置,例如这⾥保存到\blog\src\main\resources下⾯
3.4 配置l⽂件,这⾥注意mysql驱动包要使⽤绝对路径,targetProject为⽣成⽂件位
置,容易出错:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-////DTD MyBatis Generator Configuration 1.0//EN" "/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 必须使⽤绝对路径 -->
<classPathEntry location="D:\Project\Blog\Repository\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar"/>
<context id="blogTable" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除⾃动⽣成的注释 true:是: false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、⽤户名、密码 -->
<!-- Oracle连接⽅式 -->
<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" connectionURL="jdbc:oracle:thin:@000.000.000.000:1521:orcl"
userId="root" password="********"> </jdbcConnection> -->
<!-- Mysql连接⽅式 -->
<jdbcConnection driverClass="sql.jdbc.Driver"
connectionURL="jdbc:mysql://000.000.000.000:3306/blog?useUnicode=true&characterEncoding=UTF-8" userId="root"
password="********"/>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL
和 NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- targetProject:⽣成PO类的位置 -->
<javaModelGenerator targetPackage="f.vo"
targetProject="blog/src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- targetProject:mapper映射⽂件⽣成的位置 -->
<sqlMapGenerator targetPackage="mapper"
targetProject="blog/src/main/resources">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- targetPackage:mapper接⼝⽣成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="f.dao" targetProject="blog/src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>eclipse导入整个项目
<!-- 指定数据库表 -->
<!-- ⽂章表 -->
<table tableName="article" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false">
</table>
<!-- 分类表 -->
<table tableName="category"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>
3.5 运⾏mybatis generator
4.配置application.properties
#springboot整合mybatis
#实体类包
#mybatis配置⽂件和mapper⽂件位置
mybatis.mapper-locations=classpath*:mapper/*.xml
#mysql数据库连接信息
spring.datasource.driverClassName = sql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://000.000.000.000:3306/blogs?useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8& spring.datasource.username = root
spring.datasource.password = ********
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
#tomcat端⼝号
server.port=8080
server.session.timeout=10
#log4j⽇志配置
#log4j打印mybatis的sql语句
#f.dao=debug
5.springboot整合mybatis
5.1 引⼊依赖,在l中引⼊:
<!-- springboot整合mybatis -->
<dependency>
<groupId&batis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId&batis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!-- springboot连接mysql驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
5.2 在application.properties⾥配置:
#实体类包
#mybatis配置⽂件和mapper⽂件位置
mybatis.mapper-locations=classpath*:mapper/*.xml
#mysql数据库连接信息
spring.datasource.driverClassName = sql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://000.000.000.000:3306/blogs?useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8& spring.datasource.username = root
spring.datasource.password = ********
5.3 在启动类Application.java中配置mapper扫描注解@MapperScan("f.dao")
6.springboot整合log4j
6.1 在l⽂件中添加log4j的jar包依赖,⾸先排除内置的⽇志⼯具
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 排除Springboot⾃带的⽇志⼯具 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- springboot整合log4j -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
6.2 在application.properties中配置指定l的位置
#log4j⽇志配置
#log4j打印mybatis的sql语句
#f.dao=debug
6.3 配置l
下⾯贴上代码:解释⼀下
>>> LOG_HOME:这⾥的/var/log/blogs路径如果在linux就是对应的⽬录,如果在windows上则在当前盘符下新建⼀个var⽂件夹,例如tomcat在D盘,则在D盘新建路径D:\var\log\blogs
>>> FILE_NAME:临时⽣成的⽇志⽂件名称,下⾯配置中第⼆天会被新⽣成的替代
>>> Console标签:输出到控制台
>>> RollingRandomAccessFile标签:周期性⽣成新的⽇志⽂件并存档
>>> filePattern:存档的⽇志⽂件的命名规则,例如下⾯配置⽣成:D:\var\log\blogs\2018-09\blogs-2018-09-15-1.log,i%代表1开始递增
>>> TimeBasedTriggeringPolicy标签:⽣成新⽂件周期数,例如下⾯interval="1"是⼀天⼀个⽇志⽂件
>>> SizeBasedTriggeringPolicy标签和i%是配合使⽤的,表⽰当⽇志⽂件⼤⼩超过20MB就⽣成新⽇志⽂件,新⽇志⽂件后缀i%就递:blogs-2018-09-15-2.log >>> 最后⼀个Logger name="f.dao"是在本地调试时把sql语句打印在控制台
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<properties>
<property name="LOG_HOME">/var/log/blogs</property>
<property name="FILE_NAME">blogs</property>
<property name="log.sql.level">info</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %msg%n"/>
</Console>
<RollingRandomAccessFile name="RollingRandomAccessFile" fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingRandomAccessFile"/>
</Root>
<Logger name="f.dao" level="${log.sql.level}" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
</Loggers>
</Configuration>
7.springboot使⽤内置定时任务
7.1 启动类Application.java
添加注解:@EnableScheduling
7.2 定时任务类
f.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class Timer {
@Autowired
EverydayTalkMapper everydayTalkMapper;
@Scheduled(cron = "0 59 23 * * ?")
public void scheduleUpdateTalkId() {
System.out.println("======>" + System.currentTimeMillis());
}
}
7.3 使⽤场景
项⽬中每⽇⼀语需要每天变换,设置cron表达式为:cron = "0 59 23 * * ?"在每天0点前把项⽬中的存储每⽇⼀语的静态变量的信息更换。
8.springboot使⽤JWT(Java Web Token)做Token验证
8.1 为什么要使⽤token验证
>>> 因为我们的前后端是分离的,所有的请求都是跨域⾏为,所以sessionId⼀直是变化的,不能通过sessionId来获得⽤户信息
>>> 有token的时候我们只⽤在第⼀次登录的时候查询⼀下数据库,然后在token的过期时间内就可以不⽤再与数据库⽤户表交互,减少IO操作。
>>> 如果有多台服务器做负载均衡,因为token是⽆状态的,所以服务器之间可以共⽤token
8.l中引⼊jwt的jar包依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>2.2.0</version>
</dependency>
8.3 新建Token签发与解析验证类JavaWebToken.java,注意payload⾥⾯不要存放敏感信息,例如不要存放密码等,因为该部分是对称加密,在客户端可以解
密。SECRET是不能暴露出去的,相当于私钥,加密的⽅式由它决定。
f.util;
import java.util.HashMap;
import java.util.Map;
import com.auth0.jwt.JWTSigner;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.internal.fasterxml.jackson.databind.ObjectMapper;
public class JavaWebToken {
private static final String SECRET = "********";
private static final String EXP = "exp";
private static final String PAYLOAD = "payload";
public static <T> String sign(T object, long maxAge) {
try {
final JWTSigner signer = new JWTSigner(SECRET);
final Map<String, Object> claims = new HashMap<String, Object>();
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(object);
claims.put(PAYLOAD, jsonString);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论