赞
踩
@RestController:
结合了@Controller和@ResponseBody注解的功能,作用是将一个类标记为控制器(Controller),并且该类中的方法默认返回JSON格式的数据。它常用于构建RESTful风格的Web服务
@RequestMapper
是一个用于处理请求地址映射的注解,表示类中的所有响应请求的方法都以该地址作为父路径。
@RequestBody
它用于处理来自 HTTP 请求体的 JSON 数据,只能用于处理 POST 和 PUT 请求。
@PathVariable
用于从请求的URL中提取参数值并传递给处理程序方法的参数。要是/user/id这种,而不是/user?id
HttpServletRequest
提供了一种处理HTTP请求的方式,可以获取客户端发送过来的请求参数
@Transactional
保证事务的一致性,比如新增菜品时,菜品添加进了数据库,而菜品口味因为异常而没有添加进,处理起来就比较麻烦,加入此注解后,有一个没添加进数据库,全部都不会被添加进数据库
@EnableTransactionManagement
用于启用事务管理功能,需要加在启动类上
@Configuration
用于定义配置类,只要是配置类就需要写它,Spring会自动扫描并加载这个类中的Bean定义。
@WebFilter
用于标识一个类作为Web过滤器(Filter)的组件,其中filterName是过滤器的名称,通常用于标识过滤器的功能或用途。urlPatterns用于指定过滤器应该被应用到哪些URL模式上,例如,"/api/"将匹配以"/api/"开头的所有URL。
@ServletComponentScan
自动扫描和注册应用程序中的servlet、filter和listener组件。这样就不需要手动注册和配置每个servlet组件。
@Component
用于将普通Java类声明为Bean的注解,从而不需要手动注册和配置每个Bean。
@ControllerAdvice
主要用于处理全局异常和全局数据预设。其中的annotations参数是一个数组,代表@ControllerAdvice注解可以应用于带有数组里面注释的类和方法。
@ResponseBody
表示Controller的方法返回的结果直接写入HTTP response body中,通常用来返回JSON数据或XML数据
@ExceptionHandler
当Spring MVC应用程序在处理HTTP请求时出现错误或异常时,可以用我们自己自定义的异常处理行为。()里面填遇到哪种错误时
@Bean
这是Spring的注解,表示这个方法会返回一个Bean,这个Bean会被Spring容器管理。
@Data
可以自动生成get,set,tostring,hashcode,equals方法,简化开发
- @WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
- public class LoginCheckFilter implements Filter {
-
- //路径匹配器,支持通配符
- public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
-
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- HttpServletRequest request = (HttpServletRequest) servletRequest;
- HttpServletResponse response = (HttpServletResponse) servletResponse;
- //1.获取本次请求到的URI
- String requestURI = request.getRequestURI();
-
- //2.判断本次请求是否需要处理,先创一个检查方法
- String[] urls = new String[]{
- "/backend/**",
- "/front/**",
- "/employee/login",
- "/employee/logout",
- "/common/**"
- };
-
- boolean check = check(urls, requestURI);
-
- //3.如果本次是不需要过滤的地址,直接放行
- if (check){
- filterChain.doFilter(request,response);
- return;
- }
-
- //4.如果已登录,那直接放行
- if (request.getSession().getAttribute("employee") != null){
- //是为了自动填充所以到这里来获取当前进程的id,并保存
- Long id =(Long) request.getSession().getAttribute("employee");
- BaseContext.setCurrentId(id);
-
- filterChain.doFilter(request,response);
- return;
- }
-
- //5.如果未登录则通过输出流来返回未登录结果,""里的内容根据前端来写
- response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
- 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;
- }
- }
填充配置类
- @Component
- public class MyMetaObjectHandler implements MetaObjectHandler {
- //插入时自动填充
- @Override
- public void insertFill(MetaObject metaObject) {
- metaObject.setValue("createTime", LocalDateTime.now());
- metaObject.setValue("updateTime", LocalDateTime.now());
- metaObject.setValue("createUser", BaseContext.getCurrentId());
- metaObject.setValue("updateUser", BaseContext.getCurrentId());
- }
- //更新时自动填充
- @Override
- public void updateFill(MetaObject metaObject) {
- metaObject.setValue("updateTime", LocalDateTime.now());
- metaObject.setValue("updateUser", BaseContext.getCurrentId());
- }
- }
动态id配置类
- public class BaseContext {
- private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
-
- public static void setCurrentId(Long id) {
- threadLocal.set(id);
- }
-
- public static Long getCurrentId() {
- return threadLocal.get();
- }
- }
- @ControllerAdvice(annotations = {RestController.class, Controller.class})
- @ResponseBody
- public class GlobalExceptionHandler {
-
- //用于新增时用户名存在时报的异常
- @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
- public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
- if (ex.getMessage().contains("Duplicate entry")){
- return R.error("已存在");
- }
- return R.error("不知道哪错了,别试了");
- }
-
- //当前分类是否关联菜品或套餐的异常
- @ExceptionHandler(CustomException.class)
- public R<String> exceptionHandler(CustomException ex){
- return R.error(ex.getMessage());
- }
- }
- @Configuration
- public class MybatisPlusConfig{
- @Bean
- public MybatisPlusInterceptor interceptor(){
- MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
- interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
- return interceptor;
- }
- }
- @Data
- public class R<T> implements Serializable {
- private Integer code;//状态码,看前端可知1是成功,0或其他数是失败
- private String msg;//返回信息
- private T data;//数据
- private Map map = new HashMap(); //动态数据
- //成功方法
- public static <T> R<T> success(T object) {
- R<T> r = new R<T>();
- r.data = object;
- r.code = 1;
- return r;
- }
- //失败方法
- public static <T> R<T> error(String msg) {
- R r = new R();
- r.msg = msg;
- r.code = 0;
- return r;
- }
-
- public R<T> add(String key, Object value) {
- this.map.put(key, value);
- return this;
- }
- }
- @Value("${it-sky.path}")
- private String basePath;
-
- @PostMapping("/upload")
- public Result<String> upload(MultipartFile file){
- //这个file一定要看页面负载里面源的name是否是file,要保持一致
-
- //原始文件名
- String originalFilename = file.getOriginalFilename();
- String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
-
- //使用UUID重新生成文件名,繁殖文件名称重复造成文件覆盖
- String fileName = UUID.randomUUID().toString()+suffix;
-
- try {
- file.transferTo(new File(basePath+fileName));
- } catch (IOException e) {
- e.printStackTrace();
- }
- return Result.success(fileName);
- }
- public void download(String name , HttpServletResponse response){
- try {
- //输入流,通过输入流读取文件内容
- FileInputStream fileInputStream = new FileInputStream(new File(basePath+name));
-
- //输出流,通过输出流将文件写回浏览器,在浏览器展示图片了
- ServletOutputStream outputStream = response.getOutputStream();
- //设置文件类型
- response.setContentType("image/jpeg");
- //初始化一个整型变量len,并赋值为0。这个变量将用于存储从输入流中读取的字节数量。
- int len = 0;
- //创建一个长度为1024的字节数组bytes。这个数组将用于存储从输入文件中读取的数据。
- byte[] bytes = new byte[1024];
- /*使用fileInputStream(一个文件输入流)来读取数据,并将读取的字节数量存储
- 在len中。如果read方法返回-1,说明已经读取到文件的末尾,此时循环将结束。*/
- while ((len = fileInputStream.read(bytes)) != -1){
- /*使用outputStream(一个输出流)来将读取的数据写入到另一个地方。
- write方法的三个参数分别是:要写入的数据(bytes数组),开始写入的
- 起始位置(0,表示从数组的开始位置写入),以及要写入的字节数量(len)。*/
- outputStream.write(bytes,0,len);
- outputStream.flush();
- }
- //关闭资源
- outputStream.close();
- fileInputStream.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
- queryWrapper.eq(Employee::getUsername, employee.getUsername());
- Employee emp = employeeService.getOne(queryWrapper);
- if (emp==null){
- return R.error("登陆失败");
- }
注意:R是用来统一类型向前端返回数据的,一般有状态码(code),返回信息(msg),数据(data),里面一个成功方法一个失败方法,要继承Serializable,还要加@Data注解,这个R要自己创建.
- String password = employee.getPassword();
- password = DigestUtils.md5DigestAsHex(password.getBytes());
- if (!emp.getPassword().equals(password)){
- return R.error("登陆失败");
- }
- request.getSession().setAttribute("employee",emp.getId());
- return R.success(emp);
- @PostMapping("logout")
- public R<String> logout(HttpServletRequest request){
- request.getSession().removeAttribute("employee");
- return R.success("退出成功");
- }
- public R<String> add(@RequestBody Employee employee){
- employee.setPassword(DigestUtils.md5DigestAsHex("12345".getBytes()));
- ...
- employeeService.save(employee);
- return R.success("添加成功");
- }
Controller层的代码
- @PostMapping
- public R<String> save(@RequestBody DishDto dishDto){
- dishService.saveWithFlavor(dishDto);
- return R.success("新增成功");
- }
ServiceImpl层的代码
- public void saveWithFlavor(DishDto dishDto) {
- this.save(dishDto);
- Long dishId = dishDto.getId();
- List<DishFlavor> flavors = dishDto.getFlavors();
- flavors = flavors.stream().map((item)->{
- item.setDishId(dishId);
- return item;
- }).collect(Collectors.toList());
- dishFlavorService.saveBatch(flavors);
- }
- @DeleteMapping
- public R<String> delete(String[] ids){
- for (String id:ids) {
- dishService.removeById(id);
- }
- return R.success("删除成功");
- }
例1.
- public void remove(Long id) {
- LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
- queryWrapper.eq(Dish::getCategoryId, id);
- int count1 = dishService.count(queryWrapper);
- if (count1 > 0) {
- throw new CustomException("当前分类下关联了菜品,兄弟换一个删");
- }
- super.removeById(id);
- }
例2.
- @DeleteMapping
- public R<String> delete(String[] ids){
- int index=0;
- for(String id:ids) {
- Setmeal setmeal = setmealService.getById(id);
- if(setmeal.getStatus()!=1){
- setmealService.removeById(id);
- }else {
- index++;
- }
- }
- if (index>0&&index==ids.length){
- return R.error("选中的套餐均为启售状态,不能删除");
- }else {
- return R.success("删除成功");
- }
- }
- @PostMapping("/status/{status}")
- public R<String> sale(@PathVariable int status, String[] ids){
- for (String id:ids){
- Setmeal byId = setmealService.getById(id);
- byId.setStatus(status);
- setmealService.updateById(byId);
- }
- return R.success("修改状态成功");
- }
ServiceImpl层代码
- @Override
- public void updateWithFlavor(DishDto dishDto) {
- this.updateById(dishDto);
- LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
- queryWrapper.eq(DishFlavor::getDishId,dishDto.getId());
- dishFlavorService.remove(queryWrapper);
- List<DishFlavor> flavors = dishDto.getFlavors();
- flavors = flavors.stream().map((item)->{
- item.setDishId(dishDto.getId());
- return item;
- }).collect(Collectors.toList());
- dishFlavorService.saveBatch(flavors);
- }
- }
配置类代码
- @Configuration
- public class MybatisPlusConfig{
- @Bean
- public MybatisPlusInterceptor interceptor(){
- MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
- interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
- return interceptor;
- }
- }
Controller层方法
- @GetMapping("/page")
- public R<Page> list(int page,int pageSize){
- //分页构造器
- Page pageInfo = new Page(page,pageSize);
- employeeService.page(pageInfo);
- return R.success(pageInfo);
- }
普通回显代码
- @GetMapping("/{id}")
- public R<Employee> getById(@PathVariable Long id){
- Employee byId = employeeService.getById(id);
- if (byId != null){
- return R.success(byId);
- }else {
- return R.error("没有查询到对应数据");
- }
- }
列表回显代码
- @GetMapping("/list")
- public R<List<Dish>> Getlist(Dish dish){
- LambdaQueryWrapper<Dish> queryWrapper =new LambdaQueryWrapper<>();
- queryWrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId());
- queryWrapper.eq(Dish::getStatus,1);
- queryWrapper.orderByAsc(Dish::getSort);
- List<Dish> listInfo = dishService.list(queryWrapper);
- return R.success(listInfo);
- }
- @GetMapping("/page")
- public R<Page> list(int page,int pageSize,String name){
- //构造分页器
- Page<Dish> pageInfo = new Page<>(page,pageSize);
- //构造一个新的分页器,因为之前那个缺少某个类
- Page<DishDto> dishDtoPage = new Page<>(page,pageSize);
-
- dishService.page(pageInfo);
- BeanUtils.copyProperties(pageInfo,dishDtoPage,"records");
- List<Dish> records = pageInfo.getRecords();
-
- List<DishDto> list = records.stream().map((item)->{
- DishDto dishDto = new DishDto();
- BeanUtils.copyProperties(item,dishDto);
- Long categoryId = item.getCategoryId();
- Category byId = categoryService.getById(categoryId);
- String name = byId.getName();
- dishDto.setCategoryName(name);
- return dishDto;
- }).collect(Collectors.toList());
-
- dishDtoPage.setRecords(list1);
-
- return R.success(dishDtoPage);
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。