暑期第四周总结
本周继续学习了springboot项目知识,开始写了一个简单的入门项目,瑞吉外卖
说一些核心技术和新接触的代码片段
使用了springMVC,持久层使用了mp技术大大简化开发,不仅省去了mapper层的编写,还省去了service层的编写,使用其中提供的基本业务方法即可,
核心代码:
过滤器
package open.reggie.filter;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import open.reggie.common.BaseContext;
import open.reggie.common.R;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 检查用户是否已经登录
*/
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
@Component
@Slf4j
public class LoginCheckFilter implements Filter {
private static final AntPathMatcher PATH_MATCHER=new AntPathMatcher();
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse=(HttpServletResponse) servletResponse;
//1、获取请求的uri
String requestURI = httpServletRequest.getRequestURI();
log.info("拦截到请求:{}",requestURI);
//定义不需要处理的请求
String [] urls=new String[]{
"/employee/login",
"/employee/logout",
"/backend/**",
"/front/**"
};
//2、判断请求是否需要处理
boolean check=check(urls,requestURI);
//3、如果不需要处理,则直接返回
if(check){
log.info("本次{}请求不需要处理",requestURI);
filterChain.doFilter(httpServletRequest,httpServletResponse);
return;
}
//4、判断登录状态,如果已经登录,放行
if(httpServletRequest.getSession().getAttribute("employee")!=null){
log.info("用户已经登录");
long id = Thread.currentThread().getId();
log.info("当前线程的id是{}",id);
Long empId = (Long) httpServletRequest.getSession().getAttribute("employee");
BaseContext.setCurrentId(empId);
filterChain.doFilter(httpServletRequest,httpServletResponse);
return;
}
log.info("用户未登录");
//5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
httpServletResponse.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
/**
* 路径匹配,检查本次请求是否需要放行
* @param urls
* @param requestURI
* @return
*/
public boolean check(String[] urls,String requestURI){
for (String url : urls) {
boolean match = PATH_MATCHER.match(url, requestURI);
if(match){
return true;
}
}
return false;
}
}
全局异常处理器
package open.reggie.common;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.sql.SQLIntegrityConstraintViolationException;
/**
* 全局异常处理类,带有RestController,Controller的注解的类中如果发生异常的话,会进入该类中,进行处理
*/
@RestControllerAdvice(annotations = {RestController.class, Controller.class})
@Slf4j
public class GlobalExceptionHandler {
/**
* 异常处理方法,注解的参数是表示出现这个异常会执行这个方法
* @param e 异常类
* @return 结果对象
*/
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
public R<String> exceptionHandler(SQLIntegrityConstraintViolationException e){
log.error(e.getMessage());
if(e.getMessage().contains("Duplicate entry")){
return R.error("添加实体已存在");
}
return R.error("失败了");
}
}
公共字段处理类
package open.reggie.common;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 插入操作自行填充
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
log.info("数据插入操作,公共字段填充");
metaObject.setValue("createTime", LocalDateTime.now());
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("createUser",BaseContext.getCurrentId());
metaObject.setValue("updateUser",BaseContext.getCurrentId());
}
/**
* 更新操作自行填充
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
log.info("数组更新操作,公共字段填充");
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("updateUser",BaseContext.getCurrentId());
long id = Thread.currentThread().getId();
log.info("当前线程的id是{}",id);
}
}
mp配置分页对象
package open.reggie.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* mybatis-plus分页插件配置
*/
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor=new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
网络层配置资源映射
package open.reggie.config;
import lombok.extern.slf4j.Slf4j;
import open.reggie.common.JacksonObjectMapper;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.util.List;
@Configuration
@Slf4j
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* 设置静态资源映射
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
log.info("开始进行静态资源映射");
registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
}
/**
* 扩展MVC的消息转换器
* @param converters
*/
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter=new MappingJackson2HttpMessageConverter();
mappingJackson2HttpMessageConverter.setObjectMapper(new JacksonObjectMapper());
converters.add(0,mappingJackson2HttpMessageConverter);
}
}

浙公网安备 33010602011771号