目录

一、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&lt;T&gt;对象</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/listMap">返回list&lt;Map&gt;对象</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和几个的全局异常处理相关推荐

  1. springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON

    springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON 参考文章: (1)springmvc全局异常处理ControllerAdvice区分返回响应类型是页面 ...

  2. 希望你永远不懂JSON和全局异常处理

    目录 一,json解析 二,全局异常处理的3种形式 三,json统一处理 一,json解析 json的形式: {}->json对象    T Map []-> json数组    List ...

  3. SpringMVC之JSON和全局异常处理

    目录 一.json解析 json的形式 SpringMVC框架如何产生上述三种形式的数据? 1.导入pom依赖             Jackson 2.配置SpringMVC.xml 配置适配器 ...

  4. SpringMvc之Json全局异常处理

    目录 一. SpringMvc框架对Json数据的支持 1.    Json数据的格式分类: 2.  SpringMvc框架如何产生上述三种json格式数据 2.1导入pom依赖 2.2  在Spri ...

  5. SpringBoot (二) :全局异常处理设置

    说在前面 在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有 ...

  6. 看看人家 SpringBoot 的全局异常处理,多么优雅...

    点击关注公众号,Java干货及时送达 本篇文章主要介绍的是SpringBoot项目进行全局异常的处理. SpringBoot全局异常准备 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程 ...

  7. 别再写满屏的try-catch了,真丑,全局异常处理不会吗?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:巨人大哥 www.cnblogs.com/juren ...

  8. 你这代码写得真丑,满屏的try-catch,全局异常处理不会吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 # 背景 软件开发过程中,不可避免的是需要处理各种异常,就我自己来 ...

  9. 看看人家 SpringBoot 的全局异常处理多么优雅...

    1 SpringBoot全局异常准备 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 开发准备 环境要求JDK:1.8SpringBoot:1.5.17.RELEASE 首先还是 ...

最新文章

  1. 近亿台物联网设备或遭劫持,这家IoT云平台遭遇“灾难性”入侵事件
  2. 马斯克因何财报会议怒爆粗口?明明是史上最佳Q1业绩,股价还一度大涨10%
  3. Linux驱动基础:msm平台,modem等framework加载
  4. 【Python-ML】电影评论数据集文本挖掘
  5. Java学习笔记(六)--字符串String类
  6. linux usb视频开发板,ARM开发板上USB 摄像头图像采集实现
  7. FLASH CS3中的FLA形式组件制作教程
  8. matlab 三维图像配准,[转载]Matlab实现多种图像配准(转)
  9. php apache配置测试端口,详解安装配置Windows版apache服务器及压力测试
  10. 三角形外接球万能公式_秒杀三角形问题!!三角形分角线的几个重要结论及其应用...
  11. 浮点数规格化-不同基数的规格化
  12. C# 如何修改Form不能修改窗体大小
  13. 连锁餐饮品牌发展战略的节奏要把握好
  14. Java线程之间的协作
  15. linux 命令大全_【Linux】命令目录大全
  16. django下创建多个app,如何设置每个app的urls
  17. android开发的学习路线
  18. 如何使用移动端后台管理数据
  19. 华为usg6320服务器映射,华为防火墙USG6320配置(简单)
  20. 对numpy的数组取补集运算

热门文章

  1. Redis持久化机制
  2. 用python绘制国际象棋棋盘每个格子边长40_函数纹理(国际象棋棋盘纹理粗布纹理)MFC...
  3. C++学习笔记8-结构体
  4. android studio汉化流程
  5. 数据库的一些基本概念
  6. 20135208 JAVA第四次实验
  7. 网络安全也要迈入AI时代?微软推出Security Copilot安全助手
  8. Win7 下 PB (PowerBuilder) Insert Control 崩溃的解决办法
  9. 服务器怎么看u盘位置,安装服务器如何修改u盘地址
  10. 计算机应用程序的魔术,IM魔术分区工具