SpringBoot新闻头条
1. 框架的搭建
-
创建项目
-
依赖引入
-
web
-
Thymeleaf
-
SpringDataJPG
-
MySQL Mysql驱动包
-
-
配置信息
将application.properties改成application.yml,并配置application.yml,必须严格按照格式进行缩进,否则会出错
spring: thymeleaf: mode:HTML5 #配置数据源 datasource: #在运行项目之前,需要创建本项目需要的数据库myspringdatabase url: jdbc:mysql://localhost:3306/myspringdatabase?serverTimezone=Asia/Shanghai&characterEnconding=utf-8 driver-class-name: com.mysql.cj.jdbc.Driver username: root #改成自己的密码 password: ******* server: #端口号 port:8080 logging: level: root: info file: path: log/blog
2. 处理错误面
由于SpringBoot 自动装配 : 会将templates/errror文件夹下的 404.html 500.html 应用到 404 500错误中,所以我们只有自己写入对于的404.html和500.html就行
3. 日志管理
-
定义切面类
在目录com…myspringboot.demo目录下创建aspects目录,并创建LogAspect类
package com.myspringboot.demo.aspects; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; @Aspect @Component public class LogAspect { // 日志记录器 private final Logger logger = LoggerFactory.getLogger(this.getClass()); /* @Aspect 表示该类是一个切面类 */ @Pointcut("execution(* com.XXXXX.web.*.*(..))") public void log() { //切点方法 } @Before("log()") //在切点之前需要执行的方法 public void doBefore(JoinPoint joinPoint) { System.out.println("-----------doBefore----------"); // 将 用户访问的url ip 调用的方法 传递的参数 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); String url = request.getRequestURL().toString(); String ip = request.getRemoteAddr(); String classMethod = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName(); Object[] args = joinPoint.getArgs(); RequestLog requestLog = new RequestLog(url, ip, classMethod, args); logger.info("Result: {}", requestLog); } @After("log()") //在切点之后,需要执行的方法 public void doAfter() { System.out.println("-----------doAfter----------"); } @AfterReturning(returning = "result", pointcut = "log()") public void doAfterReturn(Object result) { logger.info("Result:{}", result); } //内置类,记录日志信息 private class RequestLog { private String url; private String ip; private String classMethod; private Object[] args; public RequestLog() { } public RequestLog(String url, String ip, String classMethod, Object[] args) { this.url = url; this.ip = ip; this.classMethod = classMethod; this.args = args; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public String getClassMethod() { return classMethod; } public void setClassMethod(String classMethod) { this.classMethod = classMethod; } public Object[] getArgs() { return args; } public void setArgs(Object[] args) { this.args = args; } @Override public String toString() { return "RequestLog{" + "url='" + url + '\'' + ", ip='" + ip + '\'' + ", classMethod='" + classMethod + '\'' + ", args=" + Arrays.toString(args) + '}'; } } }
4. 页面处理
-
创建web控制器
在com.myspringboot.demo目录下创建web目录,并创建Controll控制类
package com.myspringboot.demo.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class Controll { @GetMapping("/index") public String index2() { return "index"; } }
-
引入模板片段
-
我们就一些模板片段放在_fragments.html中,
例如:_fragments.html中head标签片段,片段名名为:head,其中title为参数
<head th:fragment="head(title)"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title th:replace="${title}">新闻详情</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/semantic-ui/2.2.4/semantic.min.css"> <link rel="stylesheet" href="../static/css/typo.css" th:href="@{/css/typo.css}"> <link rel="stylesheet" href="../static/css/animate.css" th:href="@{/css/animate.css}"> <link rel="stylesheet" href="../static/lib/prism/prism.css" th:href="@{/lib/prism/prism.css}"> <link rel="stylesheet" href="../static/lib/tocbot/tocbot.css" th:href="@{/lib/tocbot/tocbot.css}"> <link rel="stylesheet" href="../static/css/me.css" th:href="@{/css/me.css}"> </head>
-
在index.html引用
th:replace=“html文件名:: 片段名(~{::标签名})”
<head th:replace="_fragments :: head(~{::title})"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>新闻</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/semantic-ui/2.2.4/semantic.min.css" > <link rel="stylesheet" href="../static/css/me.css" th:href="@{/css/me.css}" > </head>
-
-
设计类
在目录com.myspringboot.demo下创建entity目录,并在创建Comment,News,Tage,Type,User类
User:(其他类就不一一举出)
package com.zhongruan.entity; import javax.persistence.*; import java.util.ArrayList; import java.util.Date; import java.util.List; @Entity @Table(name = "t_user") public class User { @Id @GeneratedValue private Long id; private String nickname; // 昵称 private String username; // 用户名 private String password; // 密码 private String email; // 邮箱 private String avatar; // 头像的url private Integer type; // 用户激活状态 // 由于数据库不能存储java对象 所用通过@Temporal 注解 Date对象转换成 时间戳 存储到数据库中 @Temporal(TemporalType.TIMESTAMP) private Date createTime; // 用户创建时间 @Temporal(TemporalType.TIMESTAMP) private Date updateTime; // 用户的更新时间 @OneToMany(mappedBy = "user") private List<News> newsList = new ArrayList<>(); // 新闻 public User() { } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAvatar() { return avatar; } public void setAvatar(String avatar) { this.avatar = avatar; } public Integer getType() { return type; } public void setType(Integer type) { this.type = type; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } public List<News> getNewsList() { return newsList; } public void setNewsList(List<News> newsList) { this.newsList = newsList; } @Override public String toString() { return "User{" + "id=" + id + ", nickname='" + nickname + '\'' + ", username='" + username + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + ", avatar='" + avatar + '\'' + ", type=" + type + ", createTime=" + createTime + ", updateTime=" + updateTime + '}'; } }
-
运行结果:
后台运行结果
错误页面