JSON和全局异常处理
目录
1️⃣JSON
一、什么是json?
二、与javascript的关系
三、语法格式
四、注意事项
五、总结
六,使用json
1导入pom.xml依赖
2.配置spring-mvc.xml
3. @ResponseBody注解使用
创建一个web层控制器
编写ClazzBiz
实现接口
测试:
2.异常处理机制
1.为什么要全局异常处理?
2.异常处理思路
3.SpringMVC异常分类
4.异常处理方法
方法一
方法二
方法三
1️⃣JSON
一、什么是json?
json的全称为:JavaScript Object Notation,是一种轻量级的数据交互格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。【以上来自于百度百科】
简单来说:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互。
类似于:
- 国际通用语言-英语
- 中国56个民族不同地区的通用语言-普通话。
但真要说json到底是什么,以及json的作用,我们总是难以描述,下面我将从各个方面来进行说明:
二、与javascript的关系
相信很多程序员只要一提到json总会想到js,因为json不仅含有js的名字,其格式也与js中对象(object)的格式并无一二。
这里我们要进行一个说明,首先json是基于ECMAScript语法,但这并不意味着json必须在js中使用,或者必须要产生什么联系,json在js中的处理也并没有比其他语言占有更多优势。只是因为语法相似,而使得js开发者能更快的上手json而已。
事实上几乎所有编程语言中都有对json数据转换的支持:
js中,json与对象的转换:JSON.parse()
/JSON.stringify()
;
php中,json与数组的转换:json_encode()
/json_decode()
;
java中,json与对象的转换:fromJson()
/toJson()
;
python中,json与对象的转换:json.dumps()
/json.loads()
;
三、语法格式
那么json的语法格式到底是怎样的呢?我们先来看一段json数据:{"name":"admin","age":18}
这就是一种最简单的json,如果有学过js的开发者是不是发现json的语法与js中object的语法几乎相同。
但是,注意:
- json是一种纯字符数据,不属于编程语言
- json的语法与js中object的语法几乎一致(下一部分说明不同)
- json数据以键值对形式存在,多个键值对之间用逗号
,
隔开,键值对的键和值之间用冒号:
连接 - json数据在js对象的基础上做了严格化
- json数据中的键值对可以使用编程语言中所谓的关键字(*见注意事项)
- json的数据可以用花括号
{}
或中括号[]
包裹,对应js中的object和array
四、注意事项
为什么说几乎相同,而不是完全相同呢?接下来我们要说的就是json与js中对象的不同点,也是json严格要求的部分:
- json的键值对的键部分,必须用双引号
"
包裹,单引号都不行(所以如果在键中出现了关键字,也被字符化了),而js中对象没有强制要求(所以在键中不允许出现关键字) - json的键值对的值部分,不允许出现函数
function
,undefined
,NaN
,但是可以有null
,js中对象的值中可以出现 - json数据结束后,不允许出现没有意义的逗号
,
如:{"name":"admin","age":18,}
,注意看数据结尾部分18的后面的逗号,不允许出现
五、总结
所以,json数据的格式可以是:{"name":"admin","age":18}
也可以是:["hello",3.1415,"json"]
还可以是:[{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]
不能是:(key没有双引号){"name":"admin",age:18}
不能是:(无意义的逗号){"name":"admin","age":18,}
不能是:(不允许出现函数){"name":"admin","age":18,"show":function()()}
不能是:(不允许出现undefined){"name":"admin","age":18,"show":undefined}
不能是:(不允许出现NaN){"name":"admin","age":18,"strong":NaN}
不能是:(无意义的逗号)["hello",3.1415,"json",]
不能是:(无意义的逗号)[{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20},]
以上内容,希望能对以后使用json有所帮助,简单来说json处理的是
对象{},数值[ ] , 混合 {rows: [ ]}以及 json转换的注解
其实作为通用数据,xml也是一种不错的选择,但是随着json的出现,xml的使用场景正慢慢被json蚕食,相对来说json在某些方面下的体现还是比xml稍具优势,后期可再开一篇文档说明json和xml的区别。
六,使用json
1导入pom.xml依赖
<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.配置spring-mvc.xml
<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>
3. @ResponseBody注解使用
@ResponseBody
注解的作用是将Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON
数据或者是XML数据。注意:在使用此注解之后不会再走视图解析器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
创建一个web层控制器
package com.xzs.web;import com.xzs.Biz.ClazzBiz;
import com.xzs.model.Clazz;
import com.xzs.utils.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;@Controller
@RequestMapping("/clz/json")
public class JsonController {@Autowiredprivate ClazzBiz clazzBiz;/*** 返回List<T>* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/list")public List<Clazz> list(HttpServletRequest req, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Clazz> lst = this.clazzBiz.listPager(clazz, pageBean);return lst;}/*** 返回T* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/load")public Clazz load(HttpServletRequest req, Clazz clazz){if(clazz.getCid() != null){List<Clazz> lst = this.clazzBiz.listPager(clazz, null);return lst.get(0);}return null;}/*** 返回List<Map>* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/mapList")public List<Map> mapList(HttpServletRequest req, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Map> lst = this.clazzBiz.mapListPager(clazz, pageBean);return lst;}/*** 返回Map* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/mapLoad")public Map mapLoad(HttpServletRequest req, Clazz clazz){if(clazz.getCid() != null){List<Map> lst = this.clazzBiz.mapListPager(clazz, null);return lst.get(0);}return null;}@ResponseBody@RequestMapping("/all")public Map all(HttpServletRequest req, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Clazz> lst = this.clazzBiz.listPager(clazz, pageBean);Map map = new HashMap();map.put("lst",lst);map.put("pageBean",pageBean);return map;}@ResponseBody@RequestMapping("/jsonStr")public String jsonStr(HttpServletRequest req, Clazz clazz){return "clzEdit";}}
在ClazzMapper.xml中创建
<select id="mapListPager" resultType="java.util.Map" parameterType="java.lang.Integer" >select<include refid="Base_Column_List" />from t_struts_class<where><if test="cname !=null">and cname like concat('%',#{cname},'%')</if></where>
</select>
注意!!!这里方法返回的是map值所以resultType中的属性值要填java.util.Map
在ClazzMapper中实现该方法
package com.xzs.mapper;import com.xzs.model.Clazz;
import com.xzs.utils.PageBean;import java.util.List;
import java.util.Map;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> listPger(Clazz clazz);List<Map> mapListPager(Clazz clazz);
}
编写ClazzBiz
package com.xzs.Biz;import com.xzs.model.Clazz;
import com.xzs.utils.PageBean;
import org.springframework.stereotype.Repository;import java.util.List;
import java.util.Map;@Repository
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 page);List<Map> mapListPager(Clazz clazz, PageBean page);
}
实现接口
package com.xzs.Impl;import com.xzs.Biz.ClazzBiz;
import com.xzs.mapper.ClazzMapper;
import com.xzs.model.Clazz;
import com.xzs.utils.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.Map;@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.listPger(clazz);}@Overridepublic List<Map> mapListPager(Clazz clazz, PageBean pageBean) {return clazzMapper.mapListPager(clazz);}}
测试:
public List<Clazz> list方法
public Clazz load 方法
public List<Map> mapList方法
public Map mapLoad方法
public Map all方法
public String jsonStr方法
注意:当我们的方法全部都是返SON对象时 @ResponseBody可以放在只写一个但是必须得是上述JsonController中@Controller的上方并且( @ResponseBody,@Controller)等于@RestController如果在JsonController中将 public String jsonStr方法上的@ResponseBody给注释掉那么将不再返回json数据而是进行页面跳转
证明:
import com.xzs.utils.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;@Controller
@RequestMapping("/clz/json")
public class JsonController {@Autowiredprivate ClazzBiz clazzBiz;/*** 返回List<T>* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/list")public List<Clazz> list(HttpServletRequest req, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Clazz> lst = this.clazzBiz.listPager(clazz, pageBean);return lst;}/*** 返回T* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/load")public Clazz load(HttpServletRequest req, Clazz clazz){if(clazz.getCid() != null){List<Clazz> lst = this.clazzBiz.listPager(clazz, null);return lst.get(0);}return null;}/*** 返回List<Map>* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/mapList")public List<Map> mapList(HttpServletRequest req, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Map> lst = this.clazzBiz.mapListPager(clazz, pageBean);return lst;}/*** 返回Map* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/mapLoad")public Map mapLoad(HttpServletRequest req, Clazz clazz){if(clazz.getCid() != null){List<Map> lst = this.clazzBiz.mapListPager(clazz, null);return lst.get(0);}return null;}@ResponseBody@RequestMapping("/all")public Map all(HttpServletRequest req, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Clazz> lst = this.clazzBiz.listPager(clazz, pageBean);Map map = new HashMap();map.put("lst",lst);map.put("pageBean",pageBean);return map;}// @ResponseBody@RequestMapping("/jsonStr")public String jsonStr(HttpServletRequest req, Clazz clazz){return "clzEdit";}}
package com.xzs.web;import com.xzs.Biz.ClazzBiz;
import com.xzs.model.Clazz;
import com.xzs.utils.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;
@ResponseBody
@Controller
@RequestMapping("/clz/json")
public class JsonController {@Autowiredprivate ClazzBiz clazzBiz;/*** 返回List<T>* @param req* @param clazz* @return*/
// @ResponseBody@RequestMapping("/list")public List<Clazz> list(HttpServletRequest req, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Clazz> lst = this.clazzBiz.listPager(clazz, pageBean);return lst;}/*** 返回T* @param req* @param clazz* @return*/
// @ResponseBody@RequestMapping("/load")public Clazz load(HttpServletRequest req, Clazz clazz){if(clazz.getCid() != null){List<Clazz> lst = this.clazzBiz.listPager(clazz, null);return lst.get(0);}return null;}/*** 返回List<Map>* @param req* @param clazz* @return*/
// @ResponseBody@RequestMapping("/mapList")public List<Map> mapList(HttpServletRequest req, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Map> lst = this.clazzBiz.mapListPager(clazz, pageBean);return lst;}/*** 返回Map* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/mapLoad")public Map mapLoad(HttpServletRequest req, Clazz clazz){if(clazz.getCid() != null){List<Map> lst = this.clazzBiz.mapListPager(clazz, null);return lst.get(0);}return null;}@ResponseBody@RequestMapping("/all")public Map all(HttpServletRequest req, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Clazz> lst = this.clazzBiz.listPager(clazz, pageBean);Map map = new HashMap();map.put("lst",lst);map.put("pageBean",pageBean);return map;}// @ResponseBody@RequestMapping("/jsonStr")public String jsonStr(HttpServletRequest req, Clazz clazz){return "clzEdit";}}
隐藏数据
在实体类中在要隐藏的属性上添加@JsonIgnore即可
package com.xzs.model;import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.NotBlank;import javax.validation.constraints.NotNull;@Data//相当于set get toString方法
@AllArgsConstructor //有参构造器
@NoArgsConstructor
public class Clazz {@NotNull(message = "班级编号不能为空")
// @Size(max = 100,min = 10,message = "大小必须在10至100之间")protected Integer cid;@NotBlank(message = "班级名不能为空")protected String cname;@NotBlank(message = "班级教员老师不能为空")protected String cteacher;
@JsonIgnoreprivate String pic="暂无图片";}
2.异常处理机制
1.为什么要全局异常处理?
我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。
2.异常处理思路
系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。
3.SpringMVC异常分类
-
使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
-
实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
-
使用@ControllerAdvice + @ExceptionHandler
4.异常处理方法
@RequestMapping("/mapList")public List<Map> mapList(HttpServletRequest req, Clazz clazz){System.out.println((1 / 0));PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Map> lst = this.clazzBiz.mapListPager(clazz, pageBean);return lst;}
方法一
<!-- 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: xzsDate: 2023/9/13Time: 16:48To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
网络异常
</body>
</html>
方法二
package com.xzs.exception;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);}
}
package com.xzs.component;import com.xzs.exception.GlobalException;
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;@Component
public class GlobalExceptionHandler implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,Object o, Exception e) {ModelAndView mv = new ModelAndView();mv.setViewName("error");if (e instanceof GlobalException){GlobalException globalException = (GlobalException) e;mv.addObject("ex",globalException.getMessage());mv.addObject("msg","全局异常....");}else if (e instanceof RuntimeException){RuntimeException runtimeException = (RuntimeException) e;mv.addObject("ex",runtimeException.getMessage());mv.addObject("msg","运行时异常....");}else {RuntimeException runtimeException = (RuntimeException) e;mv.addObject("ex",runtimeException.getMessage());mv.addObject("msg","其他时异常....");}return mv;}
}
编写错误界面
<%--Created by IntelliJ IDEA.User: xzsDate: 2023/9/13Time: 16:48To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
网络异常
${msg}
</body>
</html>
运行结果
方法三
package com.xzs.component;import com.xzs.exception.GlobalException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;
import java.util.Map;@ControllerAdvice
public class GlobalExceptionResolver {// 跳转错误页面
// @ExceptionHandler
// public ModelAndView handler(Exception e){
// ModelAndView mv = new ModelAndView();
// mv.setViewName("error");
// if (e instanceof GlobalException){
// GlobalException globalException = (GlobalException) e;
// mv.addObject("ex",globalException.getMessage());
// mv.addObject("msg","全局异常....");
// }else if (e instanceof RuntimeException){
// RuntimeException runtimeException = (RuntimeException) e;
// mv.addObject("ex",runtimeException.getMessage());
// mv.addObject("msg","运行时异常....");
// }
// return mv;
// }// 返回错误json数据@ResponseBody@ExceptionHandlerpublic Map handler(Exception e){Map map = new HashMap();if (e instanceof GlobalException){GlobalException globalException = (GlobalException) e;map.put("ex",globalException.getMessage());map.put("msg","全局异常....");}else if (e instanceof RuntimeException){RuntimeException runtimeException = (RuntimeException) e;map.put("ex",runtimeException.getMessage());map.put("msg","运行时异常....");}else {map.put("ex",e.getMessage());map.put("msg","其它异常....");}return map;}
}
返回json数据
package com.xzs.component;import com.xzs.exception.GlobalException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;import java.util.HashMap;
import java.util.Map;@ControllerAdvice
public class GlobalExceptionResolver {//跳转错误页面@ExceptionHandlerpublic ModelAndView handler(Exception e){ModelAndView mv = new ModelAndView();mv.setViewName("error");if (e instanceof GlobalException){GlobalException globalException = (GlobalException) e;mv.addObject("ex",globalException.getMessage());mv.addObject("msg","全局异常....");}else if (e instanceof RuntimeException){RuntimeException runtimeException = (RuntimeException) e;mv.addObject("ex",runtimeException.getMessage());mv.addObject("msg","运行时异常....");}return mv;}// 返回错误json数据
// @ResponseBody
// @ExceptionHandler
// public Map handler(Exception e){
// Map map = new HashMap();
// if (e instanceof GlobalException){
// GlobalException globalException = (GlobalException) e;
// map.put("ex",globalException.getMessage());
// map.put("msg","全局异常....");
// }else if (e instanceof RuntimeException){
// RuntimeException runtimeException = (RuntimeException) e;
// map.put("ex",runtimeException.getMessage());
// map.put("msg","运行时异常....");
// }else {
// map.put("ex",e.getMessage());
// map.put("msg","其它异常....");
// }
// return map;
// }
}
相关文章:
JSON和全局异常处理
目录 1️⃣JSON 一、什么是json? 二、与javascript的关系 三、语法格式 四、注意事项 五、总结 六,使用json 1导入pom.xml依赖 2.配置spring-mvc.xml 3. ResponseBody注解使用 创建一个web层控制器 编写ClazzBiz 实现接口 测试: …...
骨传导耳机有害处吗、骨传导耳机真的不好用吗?
骨传导耳机没有害处。 骨传导耳机是通过将声音传递到颅骨,再由颅骨传递到内耳,从而达到听声音的效果,与传统的耳机不同。 因此,骨传导耳机不会直接对人的身体健康、耳朵产生压力和损伤,也不会影响耳道和中耳的正常功能…...
第一类曲面积分:曲面微元dσ与其投影面积微元dxdy之间的关系推导
第一类曲面积分:曲面微元dσ与其投影面积微元dxdy之间的关系推导 本篇博客精简自本人关于曲面积分的博客:详情见:曲面积分(Surface Integral) 曲面参数化(曲面上的每个点都使用起点为原点、终点为该曲面上的点的向量表示&#x…...
vue学习之Font Awesome图标
官方文档 https://fontawesome.com.cn/v5 Font Awesome 安装 cnpm install font-awesome/src/main.js 引入css import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue;...
mysql内连接与外连接详解
内连接与外连接 内连接外连接 在数据库中,连接操作是一种把两个或者多个表的记录组合在一起的操作,常用的有内连接(Inner Join)、外连接(Outer Join)等。 内连接 内连接(Inner Join࿰…...
在Mujoco环境下详细实现PPO算法应用于Humanoid-v2的完整教程
第一部分:介绍 1. 背景介绍 MuJoCo,或称为多关节动力学与控制的物理引擎,已经成为了强化学习中仿真环境的首选工具。其精确的物理仿真和高效的速度使得研究者可以在这个环境下测试和验证各种算法。PPO,即近端策略优化,是一种深度强化学习中的策略优化方法。它解决了TRPO…...
怎么给网络加速
首先,按winr,调出运行窗口。 输入cmd,回车,再输入gpedit.msc,调出本地组策略编辑器。 点击计算机配置下的管理模版。 再点击网络。 再点击Qos数据包计划程序。 再点击限制可保留宽带。 选择已启用,再把带宽…...
golang for循环append的数据重复
原因,因为使用了& 需要增加一行,问题解决...
趣谈网络协议_1
趣谈网络协议_1 第1讲 | 为什么要学习网络协议?第4讲 | DHCP与PXE:IP是怎么来的,又是怎么没的?动态主机配置协议(DHCP) 第5讲 | 从物理层到MAC层:如何在宿舍里自己组网玩联机游戏?第…...
利用WebStorm开发react——本文来自AI创作助手
要在WebStorm中开发React应用程序,请按照以下步骤进行设置: 1.安装Node.js和npm(如果尚未安装)。 2.下载和安装WebStorm。 3.打开WebStorm,并在欢迎界面中选择“Create New Project”。 4.在弹出窗口中,…...
将本地构建的镜像推送到远程镜像库,构建多种系统架构支持的Docker镜像并推送到Docker Hub
目录 推送到 Docker Hub前提:需要在 [Docker Hub](https://hub.docker.com/) 创建账户、创建仓库。1. 创建 Dockerfile 和构建镜像:docker build -t2. 登录到远程镜像库:docker login3. 将镜像标记为远程仓库地址:docker tag4. 推…...
【技术分享】NetLogon于域内提权漏洞(CVE-2020-1472)
一、漏洞介绍 CVE-2020-1472是一个Windows域控中严重的远程权限提升漏洞。攻击者在通过NetLogon(MS-NRPC)协议与AD域控建立安全通道时,可利用该漏洞将AD域控的计算机账号密码置为空,从而控制域控服务器。该漏洞适用于Win2008及后…...
python学习之【模块】
前言 上一篇文章 python学习之【深拷贝】中学习了python中的深浅拷贝学习内容,这篇文章接着学习python中的模块。 什么是模块 在python中,一个文件(以“.py”为后缀名的文件)就叫做一个模块,每一个模块在python里都…...
dns电脑服务器发生故障怎么修复
DNS电脑服务器发生故障可能会导致网络连接问题、网页无法访问、或者电子邮件无法发送等情况。修复DNS电脑服务器故障可以采取多种方法,例如检查网络连接、更换DNS服务器等措施。当DNS电脑服务器发生故障时,可以采取以下修复措施: 尝试刷新DNS…...
Python项目Flask ipv6双栈支持改造
一、背景 Flask 是一个微型的(轻量)使用Python 语言开发的 WSGI Web 框架(一组库和模块),基于Werkzeug WSGI工具箱/库和Jinja2 模板引擎,当然,Python的WEB框架还有:Django、Tornado、Webpy,这暂且不提。 Flask使用BSD授权。 Flask也被称为microframework(微框架),F…...
hcia 目的mac为(单播 组播 广播)mac
从下往上看...
专栏十:10X单细胞的聚类树绘图
经常在文章中看到对细胞群进行聚类,以证明两个cluster之间的相关性,这里总结两种绘制这种图的方式和代码,当然我觉得这些五颜六色的颜色可能是后期加的,本帖子只总结画树状图的方法 例一 文章Single-cell analyses implicate ascites in remodeling the ecosystems of pr…...
linux查找命令使用的正则表达式
正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。 正则表达式可以在文本中查找、替换、提取和验证特定的模式。 一般的查找命令是:grep,sed,awk 元字…...
ffmpeg6.0编译(NDK)
ffmpeg 6.0 支持vulkan 需要手动安装Vulkan 并将include里面的vk_video 和 vulkan 拷贝到 android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/ vulkan 下载 cp -r vk_video $NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/…...
达观RPA实战-编码与解码
一、应用背景 项目中我们经常需要获取某个服务的JSON数据。如果响应返回的是JSON格式的数据,客户端通过JSON工具可正常解析。但如果碰到值里面有中文的,特别是返回的格式是类似“{"name": "\u5927\u7231\u4e2d\u56fd"}”处理起来会比较麻烦。本文将从编…...
配置Swagger开发环境有效,生产环境无效
安全扫描:通用信息泄漏【未授权访问ip:端口号/swagger-ui.html】 步骤一:配置启用变量【开发环境可用生产环境不可用】 application-dev.yml: swagger:enable: true application-pro.yml: swagger:enable: false 步骤二:根据配置变量控…...
Jmeter系列-线程组的执行顺序(10)
重点 每个测试计划至少需要有一个线程组 线程组下不同组件的执行优先级/顺序 1、配置元件、监听器 2、前置处理器 3、定时器 4、逻辑控制器 5、取样器 6、后置处理器 7、断言 取样器执行顺序 在没有逻辑控制器情况下,取样器是按从上往下的顺序执行的 参考文章…...
c# 面试题
简述 private、 protected、 public、 internal 修饰符的访问权限。 答: Private(拍非得) : 私有成员, 在类的内部才可以访问。 protected (普泰忒): 保护成员,该类内部和继承类中可以访问。 Publ…...
目录优先的图片库网站PiGallery2
什么是 PiGallery2 ? PiGallery2 是一个快速的目录优先的图片库网站,具有丰富的用户界面,针对在低资源服务器(尤其是树莓派)上运行进行了优化 所谓 目录优先 是指,这种网站的设计是以显示不同的目录&#x…...
17-垃圾回收相关概念
目录 一、System.gc()的理解二、内存溢出和内存泄漏2、内存泄漏 三、Stop the World1、什么是 stop the word ? 四、垃圾回收的并行和并发1、并发和并发2、垃圾回收的并行和并发 五、安全点与安全区域1、什么是安全点?2、安全区域 六、强引用(不可回收&…...
Ubuntu-server 22.04LTS源码编译apache服务器
1 系统环境 # cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.3 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.3 LTS (Jammy Jellyfish)" VERSION_CODENAMEjammy IDubuntu ID_LIKEdebian HOME_URL"https://www.ubuntu.co…...
科技资讯|苹果虚拟纸可在Vision Pro中为广告、书籍等提供MR内容和动画
近日,美国专利商标局正式授予苹果一项与虚拟纸张相关的专利。这是与虚拟纸张这项发明相关的第二项专利,鉴于苹果 Vision Pro 将于明年上市,那么我们离苹果实现虚拟纸张的发明又近了一步。 虚拟纸张将能够包含 2D、3D 和动画等 MR内容&#…...
JavaScript-promise使用+状态
Promise 什么是PromisePromise对象就是异步操作的最终完成和失败的结果; Promise的基本使用: 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compati…...
xshell---git上传文件到gitee远程仓库配置
1.git下载 如果没有xshell下没有下载过git,可以参考这篇的教程:Linux配置安装 git 详细教程 下载后可以通过 git --version 查看git的版本号,验证是否安装成功 2.新建仓库 首先需要在gitee上注册一个账号 然后再主页面点击右上边框的 号…...
【GO语言基础】前言
系列文章目录 【Go语言学习】ide安装与配置 【GO语言基础】前言 【GO语言基础】变量常量 【GO语言基础】数据类型 文章目录 系列文章目录一、基础知识包和函数函数声明语法简洁性 括号成对出现GO常用DOS命令命名规则项目目录结构注释 总结 一、基础知识 包和函数 //声明本代…...
网站空间期限查询/友情链接qq群
文章目录一、配置数据源-mysql二、下载安装1.1 下载包安装(已验证)1.2 Github 上下载源码(未验证)1.3 docker安装(已验证)三、springCloud pom主要配置3.1 pom3.2 bootstrap.yaml部分配置3.3 nacos设置对应一、配置数据源-mysql a:配置数据库 /*Navicat Premium Data Transfe…...
wordpress docs/外链代发平台
一、问题概述 生产者消费者模式是一个十分经典的多线程之间协作的模式,实际上主要包含了两类两类线程: 一类是生产者线程,用于生产数据; 一类是消费者线程,用于消费数据。 为了解耦生产者与消费者的关系&…...
go语言做的网站/北京出大大事了
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html .focus() 命令 聚焦 DOM 元素 语法格式 .focus() .focus(options) 正确写法 cy.get(input).first().focus() 重点 必须是 DOM 元素才能调用 .focus() 方法&am…...
建设一个网站的基本步骤/企业内训机构
软件名称识别[abrt-addon-ccpp]-[2.1.11-19].[el7].[x86_64].rpm|| || || ||软件名称 软件版本 适用版本 软件适用系统 64位2.如何安装软件1.rpmrpm -ivh name.rpm 安装 ,-v显示过程,…...
佛山网站建站推广/网络营销推广方案3篇
题目链接:P6320 [COCI2006-2007#4] SIBICE - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目背景 年轻的 Mirko 把火柴扔的到处都是。他的母亲希望他将火柴放入盒子中。 题目描述 Mirko 现在要放置 n 根火柴,他有一个 wh 的矩形盒子。 他现在想请…...
wordpress发信设置/许昌网站推广公司
1.安装依赖 pip install --upgradetools pip install numpy Matplotlib 2.安装opencv-python(网络一定要通畅) pip install opencv-python...