牛客网项目第一章学习笔记
一、技术架构
- 1.SpringBoot是Spring的简化
- 2.SpringMVC用于处理浏览器的请求
- 3.MyBatis用来访问数据库
- 4.Redis用作缓存
- 5.Kafka用作消息队列
- 6.Elasticsearch用作全文搜索
- 7.Spring Security可以管理系统权限
- 8.Spring Actuator用作系统上线后的状态监控
二、环境搭建
1.Apache Maven:可以帮助我们构建项目、管理项目中的jar包
2.IDE:IntelliJ IDEA
3.快速构建springboot项目:Spring Initializer
4.Spring boot的核心作用:起步依赖,自动配置,端点监控
其中静态的一些配置在application.properties文件中。
导入依赖的包的配置,写在pom.xml文件中。pom.xml文件是maven工程的核心文件,是全局级别的配置文件;可以在该文件中添加jar包的依赖,使用plugin来配置一些规则;在执行task或goal时,maven会去项目根目录下读取pom.xml文件获取需要的配置信息。
//在application.properties文件中设置接口和默认路径 # ServerProperties server.port=8080 server.servlet.context-path=/community
三、Spring入门
1.Spring Framework
- Spring Core : IoC、AOP
- Spring Data Access : Transactions、Spring MyBatis
- Web Servlet : Spring MVC
- Integration : Email、Scheduling、AMQP、Security
2.Spring IoC
- Inversion of Control - 控制反转,是一种面向对象编程的设计思想。
- Dependency Injection - 依赖注入,是IoC思想的实现方式。
- IoC Container - IoC容器,是实现依赖注入的关键,本质上是一个工厂。
具体知识点还是得参考其他博客及书籍视频。这里仅记录一些项目学习中的感悟
/**使用场景比如我们有Dao接口下有两个实现类hibernateDao和mybatisDao
*我们用applicationContext获取bean时希望获取mybatisDao则加入此注解即可
*/
@Primary
@Repority("mybatisDao") //自定义bean的名字
@PostConstruct //在构造器之后调用
@PreDestroy //销毁之前调用
@Scope("prototype") //spring默认的bean都是单例的加此注解会在每次getBean方法调用时实例化对象在配置类中配置要使用的bean(很笨拙的方法)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.text.SimpleDateFormat;
@Configuration
public class AlphaConfig {
@Bean
public SimpleDateFormat simpleDateFormat() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
}
//分割
@bean //bean的名称就是方法名如上simpleDateFormat
@Autowired //依赖注入,获取bean
@Qualifier("xxx") //把名字为xxx的bean注入,一般和Autowired一起使用四、SpringMVC入门
Spring MVC
三层架构 - 表现层、业务层、数据访问层
MVC
Model:模型层
View:视图层
Controller:控制层
核心组件 - 前端控制器:DispatcherServlet
前端控制器拿到请求后,给控制层,控制层返回model,前端控制器将该model给视图层,视图层返回的结果再由前端控制器传出去。
牛客网项目还使用了Thymeleaf。也就是模板引擎。将传过来的文件和模型封装成html,给浏览器。
//在application.properties文件中设置是否需要缓存。一般开发中关闭thymeleaf的缓存,上线后开启 # ThymeleafProperties spring.thymeleaf.cache=false
上面的Thymeleaf主要是和前端有关的。下面记录关于mvc的简单示例。
@Controller//表明这是个控制层的注解
@RequestMapping("/alpha")//指定某个映射,通过该路径名确定是否是该类能处理的请求
public class AlphaController {
//自动注入
@Autowired
private AlphaService alphaService;
@RequestMapping("/hello")//路径
@ResponseBody//返回体 页面上将会输出下面这句话。
public String sayHello() {
return "Hello Spring Boot.";
}
}
//表明必须是get请求。RequestMapping中可以有多个参数
@RequestMapping(path = "/testRequestParam",method = RequestMethod.GET)
//获取路径中的某个值,作为id。
@RequestMapping(path = "/testPathVariable/{id}",method = RequestMethod.GET)
//json数据(用于异步请求,java对象->json->js对象)五、MyBatis入门
MyBatis核心组件
- SqlSessionFactory:用于创建SqlSession的工厂类。
- SqlSession:MyBatis的核心组件,用于向数据库执行SQL。
- 主配置文件:XML配置文件,可以对MyBatis的底层行为做出详细的配置。
- Mapper接口:就是DAO接口,在MyBatis中习惯性的称之为Mapper。
- Mapper映射器:用于编写SQL,并将SQL和实体类映射的组件,采用XML、注解均可实现。
在pom.xml中导入依赖。然后application.properties中进行相关配置
# DataSourceProperties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=
jdbc:mysql://localhost:3306/community?characterEncoding=utf8&useSSL=false
&serverTimezone=Hongkong
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
#上面的信息数据库的相关配置
#下面的是Mybatis的相关设置
# MybatisProperties
#resources目录下新建一个mapper目录存放xml文件
mybatis.mapper-locations=classpath:mapper/*.xml
#指定包名
mybatis.type-aliases-package=com.nowcoder.community.entity
#启动自动设置主键
mybatis.configuration.useGeneratedKeys=true
#下划线命名方式和驼峰命名方式匹配 如:header_url==headerUrl
mybatis.configuration.mapUnderscoreToCamelCase=true示例
使用MyBatis对用户表进行CRUD操作(User表)
1.创建entity包并创建User类(上面设置的包是entity)
2.在dao包下创建UserMapper接口
3.在mapper文件夹下建立user-mapper.xml文件(这个文件中写sql语句)
某个不影响运行的报红
原因:最初在UserMapper 接口上只是用了@Mapper注解。虽然能跑起来,但是idea总是提示找不到bean
在UserMapper上加入@Repository可以解决报红的情况。
- Mapper是import org.apache.ibatis.annotations.Mapper;中的也就是Mybatis包中的注解。
- Repository是import org.springframework.stereotype.Repository;也就是Spring的注解。
注:课程中,老师使用的Mapper注解好像没有问题,我和其他童鞋出现了报红问题,虽然也不影响运行。不过暂时还不能从根源上理解为什么有出现这种现象。
六、开发社区首页
这里实现的是分页,首页末页,上一页下一页有效,中间点击第几页没有实现。
请求过程自顶向下,开发过程是从DAO往上。以讨论帖为例
- 1.创建实体类DiscussPost(评论帖子类)
- 2.解决对应dao层逻辑,DiscussPostMapper接口
- 3.mapper目录下写个discusspost-mapper.xml(写对应的sql语句)
- 4.创建DiscussPostService类和UserService类
- 5.复制静态资源和模板(这里牛客给的前端页面代码,因此直接导入进static包中)
- 6.写Controller层逻辑
- 7.完成index.html 渲染页面中的帖子。即将前端模板改成动态,接受到数据后进行相关填充
dao层只有接口,因此完成查询工作是2和3配合完成。service层将查询的结果封装返回给controller层。箭头为使用到的类
控制层代码:
service层将查询的结果封装成List返回给controller层。controller层将List封装成model返回。因此分页显示的功能在controller层完成的。
@Controller
public class HomeController {
//注入要使用到的bean
@Autowired
private DiscussPostService discussPostService;
@Autowired
private UserService userService;
@RequestMapping(path = "/index", method = RequestMethod.GET)
//Page是自己封装的页面类。Model是Spring中的
public String getIndexPage(Model model, Page page) {
// 方法调用前,SpringMVC会自动实例化Model和Page,并将Page注入Model.
// 所以,在thymeleaf中可以直接访问Page对象中的数据.
page.setRows(discussPostService.findDiscussPostRows(0));
page.setPath("/index");
List<DiscussPost> list =
discussPostService.findDiscussPosts(0, page.getOffset(), page.getLimit());
//这里的discussPosts用来封装user
List<Map<String, Object>> discussPosts = new ArrayList<>();
if (list != null) {
for (DiscussPost post : list) {
Map<String, Object> map = new HashMap<>();
map.put("post", post);
User user = userService.findUserById(post.getUserId());
map.put("user", user);
discussPosts.add(map);
}
}
model.addAttribute("discussPosts", discussPosts);
return "/index";
}
}
//这里的model给到前端,然后前端通过对model的操作,显示在页面上
//前端从model中取出map以及Page等数据,然后在取出map中的相关数据,填到前端页面的模板上。七、项目调试技巧
- 响应状态码的含义
- 服务端断点调试技巧
- 客户端断点调试技巧
- 设置日志级别,并将日志输出到不同的终端
HTTP响应码详细
1.响应码初识
- 1XX:指临时性的响应,需要执行者继续操作即可解决的状态码
- 2XX:指已经成功地处理了请求,用户可以正常的打开了这个页面。
- 3XX:进行重定向相关操作
- 4XX:客户端的错误
- 5XX:服务器端的错误
2.服务端断点调试技巧
- 打断点
- 以debug模式启动服务器
- F8逐行执行,F7进入所调用的方法内部
- F9程序继续执行直到遇到下一个断点,如果没有断点了那么程序会执行完毕
- 管理断点的功能,如下图可以快速去除所有断点
关于断点调试的几个按钮。常用的用粗体加黑了
Show Execution Point (Alt + F10):如果你的光标在其它行或其它页面,点击这个按钮可跳转到当前代码执行的行。
Step Over (F8):步过,一行一行地往下走,如果这一行上有方法不会进入方法。
Step Into (F7):步入,如果当前行有方法,可以进入方法内部。
Force Step Into (Alt + Shift + F7):强制步入,能进入任何方法,查看底层源码的时候可以用这个进入官方类库的方法。
Step Out (Shift + F8):步出,从步入的方法内退出到方法调用处,此时方法已执行完毕,只是还没有完成赋值。
Drop Frame (默认无):回退断点。
Run to Cursor (Alt + F9):运行到光标处,你可以将光标定位到你需要查看的那一行,然后使用这个功能,代码会运行至光标行,而不需要打断点。
Evaluate Expression (Alt + F8):计算表达式。
注:F9 resume programe 恢复程序
3.客户端的调试
主要是介绍了js调试。在浏览器中打开开发者模式。
4.设置日志级别,并将日志输出到不同的终端
使用技术:日志logback
#application.properties文件中添加配置 # logger 这是为了调整日志级别,设置为debug级别 logging.level.com.nowcoder.community=debug #将日志输出到文件中 logging.file=d:/work/data/nowcoder/community.log
几个常见级别,优先级从上往下降低。
(优先级高于当前设置级别,则不会输出,如设置为warn,则只会输出warn和error)
trace debug info warn error
注:上线后,应该将日志输出到文件中。但是不同级别日志混杂不易查看且文件庞大。因此为解决此问题,方便管理这些日志,使用配置文件配置(放到resource目录下)。该配置文件名为logback-spring.xml,不建议修改该文件名。因为Spring能自己识别出来,改名后不会自动识别。
八、版本控制
授课内容
- 认识Git
- Git的简介
- Git的安装和配置
- Git常用命令
- 将代码提交到本地仓库
- 将代码上传至远程仓库
- IDEA集成Git
使用最多的是idea集成Git。因此主要记录该方法。
0.本地下载Git并安装。(此部分可参考其他博客或者技术帖)
1.官网上注册一个账号。填入官网的用户名和密码。
2.点击test
3.换成GitHub选项,选中一个git.exe,然后点击Test,可以看到当前的git版本信息。
4.选中要放入仓库的项目,点击VCS,进行相关操作。
5.先创建本地仓库,才能push到远程仓库。
