想着做一个小项目熟悉一下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.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>3.3.7</version>
</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>Title</title>
</head>
<body>
<h1 th:text="迎您来到Thymeleaf">欢迎您访问静态页面 HTML</h1>
</body>
</html>
其实我感觉这个有点类似于Django的那种模板语法, 在使用之前需要在html标签里先声明一下命名空间xmlns:th=“http://www.thymeleaf.org” 。 一些语法 比如${person.lastName} 是使用这个变量的值 调用内置工具对象方法判断字符串相等${#strings.equals(‘编程帮’,name)} 对于链接可以使用@ 符号,比如表单和静态资源link
- 没有参数的表单链接:@{/xxx}
- 有参数的表单链接:@{/xxx(k1=v1,k2=v2)}
- css链接:
<link href="asserts/css/signin.css" th:href="@{/asserts/css/signin.css}" rel="stylesheet">
甚至可以应用某一个html文件里的某一个片段,可以在代码里使用 th:fragment 声明一个代码块,指定name引用
~{templatename::fragmentname}
~{templatename::
也可以抽取公共页面,相当于Django的模板继承 甚至可以在模板里面添加参数
SpringBoot中的应用
首先修改pox.xml 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</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("../public/index");
}
}
拦截器
日志
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
logging.file.path=logs/springboot
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
|