- 基础
- SpringBoot
- 创建
- 启动
- 注解
- 路由
- 处理Json
- 静态资源
- Thymeleaf
- SpringBoot中的应用
- 扩展SpringMVC
- 拦截器
- 日志
想着做一个小项目熟悉一下Java web和后端的情况,做一个项目吧,本来想着图书管理系统之类的,然后换成这个在线聊天系统。
目前设计的主要功能有
- 聊天:私聊、群聊、离线消息、文件传输
- 设置
暂定用到的技术
- 后端:SpringBoot、MyBatis,log4j,Neety,redis
- 前端:bootstrap,vue(要不要不知道,应该不需要)
这里就说一下一些框架或者组件的引用吧,比如起码得知道怎么加载和使用
SpringBootIDEA创建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”})
可以使用开源的组件实现,比如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 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 Data){
this.setContentData(Data);
return this;
}
}
静态资源
网页会用到好多前端的东西,比如jq、vue、bootstrap、css等资源,SpringBoot是以Jar包的形式部署的,好像不好直接使用这些资源,使用WebJars实现这个。
WebJars可以将前端的资源打包成一个个Jar包,然后把包部署到maven里面,就可以了。
需要引入 Web 前端资源时,只需要访问 WebJars 官网,找到所需资源的 pom 依赖,将其导入到项目中即可。
其实大概意思就是,如果一些常见的包,可能已经有人封装好了,直接下载然后加载就好了。
再比如如果需要使用BootStrap框架,添加如下依赖
org.webjars bootstrap 3.3.7
当需要访问项目里的资源的时候,如 @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 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-logmylogspring.log)
logging.file.path=logs/springboot
#绝对路径方式将日志文件输出到 【项目所在磁盘根目录springbootloggingmyspring.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



