基于SpringBoot的在线聊天系统

基于SpringBoot的在线聊天系统,第1张

文章目录
    • 基础
      • SpringBoot
        • 创建
        • 启动
        • 注解
          • 路由
        • 处理Json
        • 静态资源
        • Thymeleaf
          • SpringBoot中的应用
        • 扩展SpringMVC
        • 拦截器
        • 日志

想着做一个小项目熟悉一下Java web和后端的情况,做一个项目吧,本来想着图书管理系统之类的,然后换成这个在线聊天系统。
目前设计的主要功能有

  • 聊天:私聊、群聊、离线消息、文件传输
  • 设置

暂定用到的技术

  • 后端:SpringBoot、MyBatis,log4j,Neety,redis
  • 前端:bootstrap,vue(要不要不知道,应该不需要)
基础

这里就说一下一些框架或者组件的引用吧,比如起码得知道怎么加载和使用

SpringBoot

IDEA创建Spring Boot项目

创建

使用IDEA,有两种方式创建
使用maben
使用Spring Initializr
步骤:

  • 新建项目
  • 选择Spring Intializr
  • URL选择默认的https://start.spring.io/,下一步
  • 填写相应的项目信息,选择Java8
  • 选择依赖,这里只使用一个Web - Spring web
  • 然后再填写相应的信息,下一步创建完成

此时如果第一次使用,它会一直解析依赖,就是会下载然后进行一些解析的 *** 作,可能会比较费时间,启动程序的话需要等他下载好了才能启动。

启动

创建完以后,会有一个*Application的类,有一个SpringBootApplication注解,开启了自动配置,这个main()方法就是用于启动的方法。
但是在启动的时候需要一个新的文件MainController.java
com.rbk.freechat下面创建一个新的包叫controller,创建一个文件MainController

filename:MainController.java

package com.rbk.freechat.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MainController {
    @ResponseBody
    @RequestMapping("/test")
    public String test(){
        return "hello,this is a test function to ensure server is ok";
    }
}

随后启动程序,访问127.0.0.1:8080/test就可以看到回显的信息了。

注解 路由

GetMapping和RequestMapping,大致区别就是,前者只能处理Get请求,后者两个都可以
@RequestMapping(value=“test”,method=RequestMethod.GET)
@GetMapping(value=“test”)
好像可以有多个指向
@GetMapping(value={“/”,“/test”})

处理Json

可以使用开源的组件实现,比如Gson、fastjson等等,但是感觉都挺麻烦的,甚至SpringBoot自带的jackson也挺麻烦。

SpringBoot项目中如何设置统一返回json格式数据

这个感觉就挺好的。
com.rbk.freechat下面创建一个新的包叫utils,创建一个文件ResultJson.java.
然后编写ResultJson.java类。
这里使用到了@Data注解,依赖于lombok,这个可以给变量提供一些方法,比如getter、setter、toString等,这几个也可以变成注解单独使用,第一次使用的时候需要解析lombok这个依赖。
通过链式调用data()方法可以对Body的数据追加或者重置。
切记这个类的返回值应该是ResultJson类型。

filename:ResultJson.java

package com.rbk.freechat.utils;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;

@Data
public class ResultJson {
    private Boolean Status;
    private String Message;
    private int StatusCode;
    private Map<String,Object> ContentData=new HashMap<>();

    public ResultJson(){}

    public static ResultJson response(Boolean Status,int StatusCode,String Message){
        ResultJson Result=new ResultJson();
        Result.setStatus(Status);
        Result.setMessage(Message);
        Result.setStatusCode(StatusCode);
        return Result;
    }
    public ResultJson data(String Key,Object Value){
        this.ContentData.put(Key,Value);
        return this;
    }
    public ResultJson data(Map<String,Object> Data){
        this.setContentData(Data);
        return this;
    }
}
静态资源

网页会用到好多前端的东西,比如jq、vue、bootstrap、css等资源,SpringBoot是以Jar包的形式部署的,好像不好直接使用这些资源,使用WebJars实现这个。
WebJars可以将前端的资源打包成一个个Jar包,然后把包部署到maven里面,就可以了。
需要引入 Web 前端资源时,只需要访问 WebJars 官网,找到所需资源的 pom 依赖,将其导入到项目中即可。
其实大概意思就是,如果一些常见的包,可能已经有人封装好了,直接下载然后加载就好了。

再比如如果需要使用BootStrap框架,添加如下依赖

<dependency>
	<groupId>org.webjarsgroupId>
	<artifactId>bootstrapartifactId>
	<version>3.3.7version>
dependency>

当需要访问项目里的资源的时候,如/**,比如找某个html文件,会按照如下顺序寻找

  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public/

引用的时候这么写都可以,路径就是resources/static/,底下创建css和js文件夹就行了。可以对多个网站创建多个文件夹分别管理。

<head>
    ......
    <link type="text/css" href="../css/test.css" rel="stylesheet">
    <script type="text/javascript" src="/js/jquery-3.3.1.min.js">script>
head>

src/main/resources/statis/创建一个html文件

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test页面title>
head>
<body>
    <h1>这是一个test测试页面h1>
body>
html>

然后访问127.0.0.1:8080/test.html就可以看到页面了。
如果在src/main/resources/public/创建一个index.html文件,那直接访问域名或者IP就可以了,如127.0.0.1:8080或者127.0.0.1:8080/index.html均可,当作主页了。其他名称的网页还得是后者,带上html名,只有index不需要。

Thymeleaf

Thymeleaf教程(10分钟入门)
源码理解SpringBoot视图解析(总体第四篇)
这是一个Java的模板引擎,文件后缀是.html,因此可以直接在浏览器打开,也可以使用web应用程序打开,就是支持动态展示。
比如对于如下语句,直接打开显示的就是静态页面字样,如果从web程序打开就会动态显示Thymeleaf字样。

DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>

<h1 th:text="迎您来到Thymeleaf">欢迎您访问静态页面 HTMLh1>
body>
html>

其实我感觉这个有点类似于Django的那种模板语法,
在使用之前需要在html标签里先声明一下命名空间xmlns:th=“http://www.thymeleaf.org”
一些语法
比如${person.lastName}是使用这个变量的值
调用内置工具对象方法判断字符串相等${#strings.equals(‘编程帮’,name)}
对于链接可以使用@符号,比如表单和静态资源link

  • 没有参数的表单链接:@{/xxx}
  • 有参数的表单链接:@{/xxx(k1=v1,k2=v2)}
  • css链接:

甚至可以应用某一个html文件里的某一个片段,可以在代码里使用 th:fragment声明一个代码块,指定name引用

~{templatename::fragmentname}
~{templatename::#id}

也可以抽取公共页面,相当于Django的模板继承
甚至可以在模板里面添加参数

SpringBoot中的应用

首先修改pox.xml添加依赖

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-thymeleafartifactId>
dependency>

默认的模板路径是/src/main/resources/templates/
编写一个测试htmltest-thymeleaf.html

filename:test-thymeleaf.html

DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是测试thyseleaf的页面title>
head>
<body>
    <h1 th:text="'欢迎来到'+${name}">h1>
body>
html>

然后编写业务代码,新建一个类ThyseleafController.java,这里不能加@RequestBody这个参数了,加上好像就是直接返回字符串,不加的话会根据名称直接调用对应的视图html文件。
而且好像只能解析/resources/templates里面的html文件,这个是在Thymeleaf的配置文件里面写的,默认路径就是templates里面的。

filename:ThyseleafController.java

package com.rbk.freechat.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Map;

@Controller
public class Thymeleaf {
    @RequestMapping("/test-thymeleaf")
    public String testThymeleaf(Map<String,Object> Dict){
        Dict.put("name","这是从java类中传入的");
        return "test-thymeleaf";
    }
}
扩展SpringMVC

可以通过定义一个类,添加注解@Configuration,来进行扩展
比如这里创建一个类Config,这个配置就是修改传入的URL然后修改为对应的视图,可以指定一个视图名,但是只能指定视图,不会执行对应的方法。
比如可以使得index或者index.html都跳转到login.html页面去

package com.rbk.freechat.utils;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class Config implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry){
        //registry.addViewController("/").setViewName("test-thymeleaf");
        registry.addViewController("/").setViewName("../public/index");
    }
}

拦截器

Spring Boot拦截器精讲
拦截器可以提供对请求的URL进行拦截 *** 作,有点类似中间件。可以用于登录和权限的校验、性能监控、异常处理等等。
使用拦截器大概有三步

  • 定义拦截器
  • 注册拦截器
  • 指定拦截规则

创建一个类,实现HandlerInterceptor接口即可,实现如下三个方法

定义登录拦截器
如果没有对应的session,返回登陆页面,否则继续。
然后需要注意的就是getRequestDispatcher这里面的参数应该是一个路由,不是一个具体的URL或者html路径
比如我这里的是/user/login,他就会判断,如果没有登陆,会跳转到这个路由,然后就回去找对应的controller方法,执行,然后返回页面。
这里其实好像还可以换成sendRedirect(),大概区别是

  • 前者是选择转发,服务器端进行的
  • 后者是重定向,浏览器进行的
public class LoginInterceptor implements HandlerInterceptor {
    Logger Log= LoggerFactory.getLogger(getClass());
    /*
    接收请求之前
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
        Object loginUser = request.getSession().getAttribute("isLogin");
        if (loginUser == null) {
            //未登录,返回登陆页
            request.setAttribute("message", "您没有权限进行此 *** 作,请先登陆!");
            Log.info("无用户信息,无法登录");
            //response.sendRedirect("/user/");
            request.getRequestDispatcher("/user/login").forward(request, response);
            return false;
        } else {
            //放行
            return true;
        }
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        Log.info("postHandle执行{}", modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        Log.info("afterCompletion执行异常{}", ex);
    }
}

注册拦截器
就在配置类里面,重写方法addInterceptors

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LoginInterceptor());
}

指定拦截规则
同样修改配置类,这里先指定拦截所有请求,然后放行一些请求

@Override
public void addInterceptors(InterceptorRegistry registry) {
    //registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**") //拦截所有请求,包括静态资源文件
    registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/", "/login", "/index.html", "/user/login", "/css/**", "/images/**", "/js/**", "/fonts/**"); //放行登录页,登陆 *** 作,静态资源
    }
}

配置好了以后还有,需要使用
可以创建一个LoginController处理登录请求,这里的路由就是上面getRequestDispacter()里面的参数,会返回显示对应的页面,在这里可以处理有关登录的

@Controller
public class LoginController {
    Logger Log= LoggerFactory.getLogger(getClass());
    @RequestMapping("/user/login")
    public String login(HttpServletRequest request, Map<String, Object> map, HttpSession session) {
        Log.info("需要登录");
        return "/user/login";
    }
}

这里还可以进行一下这个URL的映射吧,修改配置类,添加以下

public class Config implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry){
        registry.addViewController("/").setViewName("user/login");
        registry.addViewController("/login.html").setViewName("user/login");
    }
}
日志

Java里面有很多日志框架,比如常见的log4j,logback等
日志框架可以分为两种,日志抽象层和日志实现

  • 抽象层就是提供统一标准和规范的API框架,意义在于提供接口,如JCL、SLF4j、jboss-logging
  • 实现层主要是日志的具体实现,比如log4j、log4j2、Logback

Javaweb里面每个框架好像都有自己的一个日志框架,不太一。
然后SpringBoot自带的是SLF4j+Logback。
Logback和log4j是同一个作者,但是比后者有更多的优点和更强的性能。
虽然我不理解为什么要分开
使用的话,这样
日志当然同样有五种方法:trace、debug、info、warn、error

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Logger Log= LoggerFactory.getLogger(getClass());
Log.info("this is a log for test()");

这样日志就会输出在终端控制台上。
还可以对日志进行一些配置。
修改resources/application.properties

filename:resources/application.properties

#日志级别
logging.level.net.biancheng.www=trace
#使用相对路径的方式设置日志输出的位置(项目根目录目录\my-log\mylog\spring.log)
logging.file.path=logs/springboot
#绝对路径方式将日志文件输出到 【项目所在磁盘根目录\springboot\logging\my\spring.log】
#logging.file.path=/spring-boot/logging
#控制台日志输出格式
logging.pattern.console=%d{yyyy-MM-dd hh:mm:ss} [%thread] %-5level %logger{50} - %msg%n
#日志文件输出格式
logging.pattern.file=%d{yyyy-MM-dd hh:mm:ss} [%thread] %-5level %logger{50} - %msg%n

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/872143.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存