JSON和几个的全局异常处理
目录
一、SpringMVC对JSON的支持
1.json的各种场景
二、SpringMVC的全局异常处理的3种形式
1.非全局异常处理问题演示
① 为什么要全局异常处理
② 异常处理思路
③ SpringMVC异常处理的三种形式
2.第一种SpringMVC 自带的简单异常处理器
3.第二种 通过 HandlerExceptionResovler 接口实现全局异常
4.第三种使用@ControllerAdvice+@ExceptionHandler 实现全局异常
三、全局异常处理 JSON 返回
一、SpringMVC对JSON的支持
1.json的各种场景
① 返回 List<T>
② 返回 List<Map>
③ 返回 T
④ 返回 Map
⑤ 返回混合
⑥ 返回 JSON 字符串
json的形式
{} ——>json对象 T Map
[] ——>josn数组 List<T> List<Map>
{
msg:"",
code:20,
data:[]
} ——>json混合对象SpringMVC框架如何产生上述三种格式的数据
1.导入pom依赖
2.配置SpringMVC.xml 配置适配器
作用是做json数据转换的
3.使用注解@responseBody 能够将任何的数据转成json对象
1. 导入pom依赖
<!-- 用来SpringMVC支持json数据转换--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.3</version></dependency>
2. springmvc-servlet.xml 配置
添加我们的适配器,我们把昨天的拦截器先注解,为了掩饰效果
<!-- 支持json数据返回的适配器 固定的一个配置--><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="messageConverters"><list><ref bean="mappingJackson2HttpMessageConverter"/></list></property></bean><bean id="mappingJackson2HttpMessageConverter"class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><!--处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件--><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value><value>text/json;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list></property></bean>
这里演示的是返回 JSON 字符串
3.我们新建一个class类
jsonController.java
运行结果如图所示:
我们在去打开上面的注解,在运行一下如图所示:
运行结果如图所示:
它这里运行出来的结果就不一样了,它把我们直接返回的界面,它把它看做成了是一个字符串了
后面的返回我们就直接一次性的写完了,等下一一来演示
ClazzBiz.java
package com.zking.ssm.biz;import com.zking.ssm.model.Clazz;
import com.zking.ssm.util.PageBean;import java.util.List;
import java.util.Map;public interface ClazzBiz {int deleteByPrimaryKey(Integer cid);int insert(Clazz record);int insertSelective(Clazz record);Clazz selectByPrimaryKey(Integer cid);int updateByPrimaryKeySelective(Clazz record);int updateByPrimaryKey(Clazz record);List<Clazz> listPager(Clazz clazz, PageBean pageBean);List<Map> listMapPager(Clazz clazz, PageBean pageBean);
}
实现我们的方法 ClazzBizImpl.java
package com.zking.ssm.biz.impl;import com.zking.ssm.biz.ClazzBiz;
import com.zking.ssm.mapper.ClazzMapper;
import com.zking.ssm.model.Clazz;
import com.zking.ssm.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.Map;/*** @author 敢敢* @site www.javajwj.com* @company xxx公司* @create 2022-08-18 16:42*/
@Service
public class ClazzBizImpl implements ClazzBiz {@Autowiredprivate ClazzMapper clazzMapper;@Overridepublic int deleteByPrimaryKey(Integer cid) {return clazzMapper.deleteByPrimaryKey(cid);}@Overridepublic int insert(Clazz record) {return clazzMapper.insert(record);}@Overridepublic int insertSelective(Clazz record) {return clazzMapper.insertSelective(record);}@Overridepublic Clazz selectByPrimaryKey(Integer cid) {return clazzMapper.selectByPrimaryKey(cid);}@Overridepublic int updateByPrimaryKeySelective(Clazz record) {return clazzMapper.updateByPrimaryKeySelective(record);}@Overridepublic int updateByPrimaryKey(Clazz record) {return clazzMapper.updateByPrimaryKey(record);}@Overridepublic List<Clazz> listPager(Clazz clazz, PageBean pageBean) {return clazzMapper.listPager(clazz);}@Overridepublic List<Map> listMapPager(Clazz clazz, PageBean pageBean) {return clazzMapper.listMapPager(clazz);}}
添加我们一个查询方法 ClazzMapper.xml
<select id="listMapPager" resultType="java.util.Map" parameterType="com.zking.ssm.model.Clazz" >select<include refid="Base_Column_List" />from t_struts_class<where><if test="cname != null and cname != ''">and cname like CONCAT('%',#{cname},'%')</if><if test="cid != null and cname != ''">and cid = #{cid}</if></where></select>
ClazzMapper.java 去添加方法
package com.zking.ssm.mapper;import com.zking.ssm.model.Clazz;
import org.springframework.stereotype.Repository;import java.util.List;
import java.util.Map;@Repository
public interface ClazzMapper {int deleteByPrimaryKey(Integer cid);int insert(Clazz record);int insertSelective(Clazz record);Clazz selectByPrimaryKey(Integer cid);int updateByPrimaryKeySelective(Clazz record);int updateByPrimaryKey(Clazz record);List<Clazz> listPager(Clazz clazz);List<Map> listMapPager(Clazz clazz);
}
jsonController.java
package com.zking.ssm.controller;import com.zking.ssm.biz.ClazzBiz;
import com.zking.ssm.model.Clazz;
import com.zking.ssm.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author 敢敢* @site www.javajwj.com* @company xxx公司* @create 2022-08-22 17:18*/
@Controller
@RequestMapping("/clz/json")
public class jsonController {@Autowiredprivate ClazzBiz clazzBiz;@ResponseBody@RequestMapping("clzEdit")public String clzEdit(){System.out.println("jsonController.clzEdit");return "clzEdit";}// list<T>@ResponseBody@RequestMapping("list")public List<Clazz> list(HttpServletRequest request,Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(request);
// 返回 [{},{}]return this.clazzBiz.listPager(clazz,pageBean);}// list<Map>@ResponseBody@RequestMapping("listMap")public List<Map> listMap(HttpServletRequest request, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(request);
// 返回 [{},{}]return this.clazzBiz.listMapPager(clazz,pageBean);}// Map@ResponseBody@RequestMapping("map")public Map map(HttpServletRequest request, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(request);
// 返回 {}return this.clazzBiz.listMapPager(clazz,pageBean).get(0);}// T@ResponseBody@RequestMapping("load")public Clazz load(HttpServletRequest request, Clazz clazz){
// http:localhost:8080/clz/json/load?cid=2PageBean pageBean = new PageBean();pageBean.setRequest(request);
// 返回 {}return this.clazzBiz.listPager(clazz,pageBean).get(0);}// {// msg:"",// code:20,// data:[],
// PageBean:{}// } ——>json混合对象@ResponseBody@RequestMapping("hunhe")public Map hunhe(HttpServletRequest request, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(request);List<Clazz> lst = this.clazzBiz.listPager(clazz, pageBean);Map map = new HashMap();map.put("data",lst);map.put("pageBean",pageBean);
// 返回 {[{},{}]}return map;}
}
index.jsp
<%--Created by IntelliJ IDEA.User: zjjtDate: 2022/8/22Time: 18:29To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>测试json数据返回</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/clz/json/list">返回list<T>对象</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/listMap">返回list<Map>对象</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/load?cid=1">返回T对象</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/map?cid=1">返回Map对象</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/hunhe">返回混合对象</a><hr>
</body>
</html>
运行结果如图所示:
我们一一测试一下看看返回的数据是怎样的如图所示: 返回list<T>对象
返回list<Map>对象
返回T对象
返回Map对象
返回混合对象
一般我们在实际开发中,不太会把 @ResponseBody 加在方法上,因为我们做json数据交互的话,通常整个类的方法都是返回json数据,如果是按照我们上面的那样的方法每一个方法上都要加@ResponseBody 这就导致了有点嫌弃,所以我们要加到类上面
@ResponseBody+@Controller=(等价于)@RestController
jsonController.java
package com.zking.ssm.controller;import com.zking.ssm.biz.ClazzBiz;
import com.zking.ssm.model.Clazz;
import com.zking.ssm.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author 敢敢* @site www.javajwj.com* @company xxx公司* @create 2022-08-22 17:18*/
@RestController
@RequestMapping("/clz/json")
public class jsonController {@Autowiredprivate ClazzBiz clazzBiz;@RequestMapping("clzEdit")public String clzEdit(){System.out.println("jsonController.clzEdit");return "clzEdit";}// list<T>@RequestMapping("list")public List<Clazz> list(HttpServletRequest request,Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(request);
// 返回 [{},{}]return this.clazzBiz.listPager(clazz,pageBean);}// list<Map>@RequestMapping("listMap")public List<Map> listMap(HttpServletRequest request, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(request);
// 返回 [{},{}]return this.clazzBiz.listMapPager(clazz,pageBean);}// Map@ResponseBody@RequestMapping("map")public Map map(HttpServletRequest request, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(request);
// 返回 {}return this.clazzBiz.listMapPager(clazz,pageBean).get(0);}// T@RequestMapping("load")public Clazz load(HttpServletRequest request, Clazz clazz){
// http:localhost:8080/clz/json/load?cid=2PageBean pageBean = new PageBean();pageBean.setRequest(request);
// 返回 {}return this.clazzBiz.listPager(clazz,pageBean).get(0);}// {// msg:"",// code:20,// data:[],
// PageBean:{}// } ——>json混合对象@RequestMapping("hunhe")public Map hunhe(HttpServletRequest request, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(request);List<Clazz> lst = this.clazzBiz.listPager(clazz, pageBean);Map map = new HashMap();map.put("data",lst);map.put("pageBean",pageBean);
// 返回 {[{},{}]}return map;}
}
我们在去运行一下结果还是跟上面一样的
什么时候我们用最开始上面的那种方式?
就是在类上面去加@Controller,在方法上加@ResponseBody,这种形式是你在类上面即有返回json数据又有返回跳转页面的,那么才会使用最原始的方法,要根据情况来的,一般而且我们@RestController 这种形式,只有返回json数据的,所有的前端框架都是返回json数据的,无刷新分页,提高我们的用户的体验感。
二、SpringMVC的全局异常处理的3种形式
1.非全局异常处理问题演示
① 为什么要全局异常处理
我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。
② 异常处理思路
参考images中的《springmvc全局异常处理思路.png》
系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。
③ SpringMVC异常处理的三种形式
1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
2)实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
3)使用@ControllerAdvice + @ExceptionHandler
解析:
1.springmvc.xml中进行统一配置及处理
2.实现接口管理
3.@controllerAdvice
相关代码 Controller层 jsonController.java
// list<T>@RequestMapping("list")public List<Clazz> list(HttpServletRequest request,Clazz clazz){PageBean pageBean = new PageBean();if(true)throw new RuntimeException("查询班级信息异常,异常存在于jsonController.list....");pageBean.setRequest(request);
// 返回 [{},{}]return this.clazzBiz.listPager(clazz,pageBean);}
service层 ClazzBizImpl.java
@Overridepublic List<Map> listMapPager(Clazz clazz, PageBean pageBean) {if(true)throw new RuntimeException("查询班级信息异常,异常存在于ClazzBizImpl.list....");return clazzMapper.listMapPager(clazz);}
运行结果如图所示:
list<T>
list<Map>
2.第一种SpringMVC 自带的简单异常处理器
SpringMVC的配置文件,在我们的日常开发中,不太会用
springmvc.servlet.xml
<!-- 统一异常处理--><!-- springmvc提供的简单异常处理器 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><!-- 定义默认的异常处理页面 --><property name="defaultErrorView" value="error"/><!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception --><property name="exceptionAttribute" value="ex"/><!-- 定义需要特殊处理的异常,这是重要点 --><property name="exceptionMappings"><props><prop key="java.lang.RuntimeException">error</prop></props><!-- 还可以定义其他的自定义异常 --></property></bean>
error.jsp
<%--Created by IntelliJ IDEA.User: zjjtDate: 2022/8/22Time: 19:47To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>错误信息页面</title>
</head>
<body>
<%--这里就ex就取决于我们刚刚那个上面那个接收值--%>
${ex}
</body>
</html>
运行一下如图所示:我们最开始是的报错效果,是让用户的体验是非常差的。
这个时候我们就采用了第二种和第三种方式,这两种是我们最常见的
3.第二种 通过 HandlerExceptionResovler 接口实现全局异常
先将上面的SpringMVC中关于异常处理的配置取消掉 我的类名是springmvc-servlet.xml
全局异常 GlobalException.java
package com.zking.ssm.exception;/*** @author 敢敢* @site www.javajwj.com* @company xxx公司* @create 2022-08-22 20:07*/
public class GlobalException extends RuntimeException{public GlobalException() {}public GlobalException(String message) {super(message);}public GlobalException(String message, Throwable cause) {super(message, cause);}public GlobalException(Throwable cause) {super(cause);}public GlobalException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}
异常处理器 GlobalHandlerExceptionResovler.java
package com.zking.ssm.exception;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** @author 敢敢* @site www.javajwj.com* @company xxx公司* @create 2022-08-22 20:13** 处理全局异常的解析器*/
@Component
public class GlobalHandlerExceptionResovler implements HandlerExceptionResolver {/*** @param httpServletRequest* @param httpServletResponse* @param o 目标对象* @param e 目标对象执行,出现的异常对象* @return*/@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,Object o, Exception e) {ModelAndView mv = new ModelAndView();mv.setViewName("error");if(e instanceof GlobalException){GlobalException exception = (GlobalException) e;mv.addObject("ex",exception.getMessage());mv.addObject("msg","全局异常,错误码501");}else if(e instanceof RuntimeException){RuntimeException exception = (RuntimeException) e;mv.addObject("ex",exception.getMessage());mv.addObject("msg","运行时异常,错误码601");}return mv;}
}
测试代码controller层的改变
jsonController.java
// T@RequestMapping("load")public Clazz load(HttpServletRequest request, Clazz clazz){
// http:localhost:8080/clz/json/load?cid=2PageBean pageBean = new PageBean();pageBean.setRequest(request);if(true)throw new GlobalException("系统繁忙,请参考E007");
// 返回 {}return this.clazzBiz.listPager(clazz,pageBean).get(0);}
运行结果如图所示:
4.第三种使用@ControllerAdvice+@ExceptionHandler 实现全局异常
从新写一个类 GlobalExceptionResolver.java
package com.zking.ssm.exception;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;/*** @author 敢敢* @site www.javajwj.com* @company xxx公司* @create 2022-08-23 11:18*/
@ControllerAdvice
public class GlobalExceptionResolver {// @ExceptionHandler:异常处理器 固定的叫handler@ExceptionHandlerpublic ModelAndView handler(Exception e) {ModelAndView mv = new ModelAndView();mv.setViewName("error");if(e instanceof GlobalException){GlobalException exception = (GlobalException) e;mv.addObject("ex",exception.getMessage());mv.addObject("msg","全局异常 GlobalExceptionResolver,错误码501");}else if(e instanceof RuntimeException){RuntimeException exception = (RuntimeException) e;mv.addObject("ex",exception.getMessage());mv.addObject("msg","运行时异常 GlobalExceptionResolver,错误码601");}return mv;}
}
运行结果跟我们上面一样的,这里我就展示一个界面的,为了区别它调用的那边的方法
三、全局异常处理 JSON 返回
把我们的注解注释掉,它下面的方法就不生效了,如图所示:
写一个类叫 GlobalExceptionResolver2.java
package com.zking.ssm.exception;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;import java.util.HashMap;
import java.util.Map;/*** @author 敢敢* @site www.javajwj.com* @company xxx公司* @create 2022-08-23 11:18** 当出现异常,统一向前端响应错误信息的json对象数据*/
@RestControllerAdvice
public class GlobalExceptionResolver2 {// @ExceptionHandler:异常处理器 固定的叫handler@ExceptionHandlerpublic Map handler(Exception e) {Map map = new HashMap();if(e instanceof GlobalException){GlobalException exception = (GlobalException) e;map.put("ex",exception.getMessage());map.put("msg","全局异常 GlobalExceptionResolver,错误码501");}else if(e instanceof RuntimeException){RuntimeException exception = (RuntimeException) e;map.put("ex",exception.getMessage());map.put("msg","运行时异常 GlobalExceptionResolver,错误码601");}return map;}
}
运行结果如图所示: 返回的都是我们的json数据了,这就是我们以后要用的。
JSON和几个的全局异常处理相关推荐
- springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON
springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON 参考文章: (1)springmvc全局异常处理ControllerAdvice区分返回响应类型是页面 ...
- 希望你永远不懂JSON和全局异常处理
目录 一,json解析 二,全局异常处理的3种形式 三,json统一处理 一,json解析 json的形式: {}->json对象 T Map []-> json数组 List ...
- SpringMVC之JSON和全局异常处理
目录 一.json解析 json的形式 SpringMVC框架如何产生上述三种形式的数据? 1.导入pom依赖 Jackson 2.配置SpringMVC.xml 配置适配器 ...
- SpringMvc之Json全局异常处理
目录 一. SpringMvc框架对Json数据的支持 1. Json数据的格式分类: 2. SpringMvc框架如何产生上述三种json格式数据 2.1导入pom依赖 2.2 在Spri ...
- SpringBoot (二) :全局异常处理设置
说在前面 在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有 ...
- 看看人家 SpringBoot 的全局异常处理,多么优雅...
点击关注公众号,Java干货及时送达 本篇文章主要介绍的是SpringBoot项目进行全局异常的处理. SpringBoot全局异常准备 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程 ...
- 别再写满屏的try-catch了,真丑,全局异常处理不会吗?
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:巨人大哥 www.cnblogs.com/juren ...
- 你这代码写得真丑,满屏的try-catch,全局异常处理不会吗?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 # 背景 软件开发过程中,不可避免的是需要处理各种异常,就我自己来 ...
- 看看人家 SpringBoot 的全局异常处理多么优雅...
1 SpringBoot全局异常准备 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 开发准备 环境要求JDK:1.8SpringBoot:1.5.17.RELEASE 首先还是 ...
最新文章
- 近亿台物联网设备或遭劫持,这家IoT云平台遭遇“灾难性”入侵事件
- 马斯克因何财报会议怒爆粗口?明明是史上最佳Q1业绩,股价还一度大涨10%
- Linux驱动基础:msm平台,modem等framework加载
- 【Python-ML】电影评论数据集文本挖掘
- Java学习笔记(六)--字符串String类
- linux usb视频开发板,ARM开发板上USB 摄像头图像采集实现
- FLASH CS3中的FLA形式组件制作教程
- matlab 三维图像配准,[转载]Matlab实现多种图像配准(转)
- php apache配置测试端口,详解安装配置Windows版apache服务器及压力测试
- 三角形外接球万能公式_秒杀三角形问题!!三角形分角线的几个重要结论及其应用...
- 浮点数规格化-不同基数的规格化
- C# 如何修改Form不能修改窗体大小
- 连锁餐饮品牌发展战略的节奏要把握好
- Java线程之间的协作
- linux 命令大全_【Linux】命令目录大全
- django下创建多个app,如何设置每个app的urls
- android开发的学习路线
- 如何使用移动端后台管理数据
- 华为usg6320服务器映射,华为防火墙USG6320配置(简单)
- 对numpy的数组取补集运算
热门文章
- Redis持久化机制
- 用python绘制国际象棋棋盘每个格子边长40_函数纹理(国际象棋棋盘纹理粗布纹理)MFC...
- C++学习笔记8-结构体
- android studio汉化流程
- 数据库的一些基本概念
- 20135208 JAVA第四次实验
- 网络安全也要迈入AI时代?微软推出Security Copilot安全助手
- Win7 下 PB (PowerBuilder) Insert Control 崩溃的解决办法
- 服务器怎么看u盘位置,安装服务器如何修改u盘地址
- 计算机应用程序的魔术,IM魔术分区工具