牛客网项目第一章学习笔记

一、技术架构

  • 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.响应码初识

  1. 1XX:指临时性的响应,需要执行者继续操作即可解决的状态码
  2. 2XX:指已经成功地处理了请求,用户可以正常的打开了这个页面。
  3. 3XX:进行重定向相关操作
  4. 4XX:客户端的错误
  5. 5XX:服务器端的错误

2.服务端断点调试技巧

  1. 打断点
  2. 以debug模式启动服务器
  3. F8逐行执行,F7进入所调用的方法内部
  4. F9程序继续执行直到遇到下一个断点,如果没有断点了那么程序会执行完毕
  5. 管理断点的功能,如下图可以快速去除所有断点

关于断点调试的几个按钮。常用的用粗体加黑了
图片说明

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到远程仓库。

全部评论

相关推荐

ddzd:比较说第一个项目,ai对话不要仅仅是掉api,能不能结合实验室数据封装一两个定制组件?有没有考虑ai回答的边界case和安全情况?可不可能设计一个momery来存储每个人的偏好和使用习惯?性能优化具体优化了多少呢?为什么选这个优化指标呢?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务