【02-02】SpringMVC基于注解的应用

一、请求处理

1、常用注解

  • @RequestMapping
    • 作用:用来匹配客户端发送的请求(用来处理URL映射,将请求映射到处理方法中),可以在类或者方法上使用。
      • 用在类上,可以将请求模块化,避免请求方法中的映射重复。表示为当前控制器类中的所有方法添加一个前置路径。
      • 用在方法上,表示用来匹配要处理的请求(注意:在整个项目的不同方法上不能出现URL重复的情况)。
    • 相关属性
      • value:要匹配的请求路径
      • method:显示发送请求的方式(GET、POST、PUT、DELETE)
      • params:表示请求要接收的参数,如果定义了该属性,那么发送请求时必须要携带该参数;
      • headers:填写请求头信息;
      • consumers:设置接收的请求的内容类型,相当于指定Content-type;
      • produces:设置返回的内容类型;
       @RequestMapping(value = "/test",method = RequestMethod.GET,params = "entname",headers = {"User‐Agent=Mozilla/5.0 (Windows NT 10.0;"})public String test(){return "/index.jsp";}
      
  • @RequestParam
    • 作用:获取请求中的参数值
    • 相关属性
      • value:表示要获取的参数值;
      • required:表示请求时此参数是否必须传递,默认是true,如果请求中不存在该参数就会报错,如果值为false,则不做强制要求,可有可无;
      • defaultValue:如果在使用的时没有传递该参数,那么就使用定义的默认值;
    • 默认情况下,可以直接将方法中的参数名设置为跟请求中的参数名一样,此时会默认接收请求中该参数名的参数值;
      @RequestMapping("/Hello")
      public String helloWorld(@RequestParam(value = "username",defaultValue = "开发者",required = false) String name){System.out.println("hello springmvc:"+ name);
      }
      
  • @RequestHeader
    • 作用:获取请求头的信息
    • 相关属性:value、required、defaultValue
    • 如果要获取请求头中没有的信息,此时会报错;
      @RequestMapping("/header")
      public String header(@RequestHeader("User‐Agent") String agent){ System.out.println(agent);return "success";
      }
      
  • @CookieValue
    • 作用:获取cookie中的值
    • 相关属性:value、required、defaultValue
    • 如果要获取cookie中没有的信息,此时会报错;
    • 等同于request.getCookies();
      @RequestMapping("/cookie")public String cookie(@CookieValue("JSESSIONID") String id){System.out.println(id);return "success";}
      
  • @PathVariable
    • 作用:获取请求路径中的参数
    • 如果是单个参数接收,必须使用@PathVariable来声明获取对应的参数占位符的值;
    • 如果是JavaBean,则可以省略@PathVariable,但要保证各个占位符的参数名与JavaBean中的属性名一致;
      @RequestMapping("/user/{id}/{username}")
      public String path01(@PathVariable("id") Integerid,@PathVariable("username")String name){System.out.println(id);System.out.println(name);return "/index.jsp";
      }@RequestMapping("/user02/{id}/{name}")
      public String path02(User user){System.out.println(user);return "/index.jsp";
      }
      

2、REST风格

  • 它是一种客户端映射到服务器资源的架构设计;
  • 它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性;
  • 是一种更优雅的URL风格;
  • 通过URL我们就可以知道这个请求是用来做什么的;
     @GetMapping("/rest/getuser/{uid}")public String getUser(@PathVariable("uid") Integer id ){System.out.println("hello springmvc GET:"+ id);return "/index.jsp";}@PostMapping("/rest/addUser")public String addUser(User user){System.out.println("hello springmvc POST:"+ user);return "/index.jsp";}@PutMapping("/rest/updateUser")public String updateUser(User user){System.out.println("hello springmvc PUT:"+ user);return "redirect:/index2.jsp";}@DeleteMapping("/rest/deleteUser/{uid}")public String deleteUser(@PathVariable("uid") Integer id ){System.out.println("hello springmvc DELETE:"+ id);return "redirect:/index2.jsp";}
    

3、静态资源的访问

  • 当页面中直接使用静态资源时,是没办法直接获取到的,是因为找不到对应的mapping映射,DispatcherServlet会拦截所有的请求,而此时我们没有对应图片的请求处理方法。此时只需要在springmvc.xml中添加如下配置即可:
	<!--配置访问静态资源--><mvc:annotation-driven/><!--设置资源的映射位置:将映射地址直接指向静态资源文件夹,springmvc不会将此映射作为handler--><mvc:resources mapping="/images/**" location="/images/"/><!--当springmvc没有映射到某一个请求时,就会调用默认的servlet来处理--><mvc:default-servlet-handler/>

二、响应处理

1、视图解析器

  • 默认的内置视图解析器
 <!--默认的视图解析器--><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/></bean>

2、视图控制器

<!--视图控制器:设置某个路径映射到指定的jsp页面--><mvc:view-controller path="/" view-name="index"></mvc:view-controller>

3、使用Model,Map,ModelMap传输数据到页面

  • 当使用以下三种方式设置之后,所有的参数值都设置到了request的作用域中;
  • ${requestScope.type}
  /*** 通过Servlet原生API将数据传输到视图中* @param request* @return*/@RequestMapping("/servlet")public String servletApi(HttpServletRequest request){request.setAttribute("type","servletAPI");return "main";}/*** 通过Model将数据传输到视图中* @param model* @return*/@RequestMapping("/model")public String modelAttribute(Model model){model.addAttribute("type","modelAttribute");return "main";}/*** 通过ModelMap将数据传输到视图中* @param modelMap* @return*/@RequestMapping("/modelMap")public String modelMapAttribute(ModelMap modelMap){modelMap.addAttribute("type","modelMapAttribute");return "main";}/*** 通过Map将数据传输到视图中* @param map* @return*/@RequestMapping("/map")public String map(Map map){map.put("type","map");return "main";}

4、使用ModelAndView对象传输数据到页面

  • 使用ModelAndView对象时,返回值类型也是该对象,可以将要跳转的页面设置为view的名称,来完成跳转功能,同时,数据也是存放到了request作用域中;
  • springmvc还会隐式的将请求绑定的参数自动设置到request域中;
  /*** 通过ModelAndView将数据传输到视图中* @return*/@RequestMapping("/modelAndView")public ModelAndView modelAndView(){ModelAndView modelAndView = new ModelAndView("main");modelAndView.addObject("type", "modelAndView");return modelAndView;}

5、使用session传输数据到页面

  • 方式一:通过Servlet API的方式读写session
    • 通过参数绑定的方式去获取Servlet API
    • 通过自动注入的方式去获取Servlet API(推荐使用这种方式)
    • ${sessionScope.type}
 /*** 通过HttpSession将数据传输到视图中* @param session* @return*/@RequestMapping("/session")public String session(HttpSession session){session.setAttribute("type","servletApi-session");return "main";}//自动注入@Autowiredprivate HttpSession session;@RequestMapping("/autoSession")public String autoSession() {session.setAttribute("type","auto-session");return "main";}
  • 方式二:通过注解的方式读取session
    • @SessionAttributes
      • 用在类上,表示当前控制器类下的所有方法,都会将model指定的属性写入session。
      • 它会从model中获取指定的属性写入session中。即:底层会从model中找一个叫type的属性写到session中,这种方式是依赖model的。
    • @SessionAttribute
      • 用在参数上,读取session。
      • model和session是互通的:session可以通过model中去获取写入指定的属性, model也会从session中自动写入指定的属性。
	@Controller@SessionAttributes("type")public class DTVController {@RequestMapping("/getSession")public String getSession(@SessionAttribute(value="type",required = false) String type){System.out.println(type);return "main";}}

6、转发和重定向

  • 转发的特点
    • a、地址栏的url从始至终都不会变
    • b、请求次数,仅只有一次
    • c、请求域中的数据不会丢失
    • d、根目录包含了项目的访问地址,所以,不用写完成的访问地址,只需要写明转发的视图即可:/index2.jsp
  • 重定向的特点
    • a、地址栏的url会发生变化,第一次:初识地址(localhost:8080/springmvc/);第二次:重定向地址(localhost:8080/springmvc/index2.jsp)
    • b、请求次数,两次
    • c、请求域中的数据会丢失,因为是不同的请求
    • d、根目录不包含项目的访问地址
      在这里插入图片描述
 @RequestMapping("/Hello")public String helloWorld(@RequestParam(value = "name",defaultValue = "开发者",required = false) String name){System.out.println("hello springmvc:"+ name);//        return "index"; //默认是转发,会自动添加前缀,所以,不需要写前缀,直接写视图名即可//        return "forward:/index.jsp";  // forward 则需要自己显示添加完整的视图名和路径,不会参与视图解析器的处理return "redirect:/index2.jsp"; //重定向的视图,必须存放在根目录下,不能放到WEB-INF目录下}

三、JSON处理

  • 需要添加解析json的依赖
 		<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.8</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.8</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.0</version></dependency>

1、返回JSON数据

  • 1、加入jackjson依赖
  • 2、将jackjson的jar包加入WEB-INF的lib文件夹中
  • 3、在对应处理方法上加上@ResponseBody注解,用于标记该处理方法返回json
  • 4、或者将类上的@Controller改为@RestController注解,表示标记该类中所有的方法都返回json
  • 5、@RestController相当于 @Controller + @ResponseBody
@Controller
public class JsonController {@RequestMapping("/testJson01")@ResponseBody //如果返回值是字符串类型,则返回值以文本形式返回,而不是返回视图逻辑名称public String responseJson01(){System.out.println("testJson");return "json";}@RequestMapping("/testJson02")@ResponseBodypublic User responseJson02(){User user = new User();user.setId(1001);user.setName("张三");user.setAlias(new String[]{"张三丰","张无忌"});user.setBirthday(new Date());return user;}

2、获取JSON数据

  • 使用@RequestBody来接收前端发送的json数据
	@RequestMapping("/testJson03")@ResponseBodypublic User responseJson03(@RequestBody User user){User user2 = new User();user.setId(1002);user.setName("张三");user.setAlias(new String[]{"张三丰","张无忌"});user.setBirthday(new Date());System.out.println(user);return user2;}

四、文件上传和下载

1、文件下载

  • 使用Servlet原生API实现文件下载
 @RequestMapping("/download")public void downLoad(HttpServletRequest request, HttpServletResponse response) throws IOException {//获取要下载的文件的绝对路径String realPath = request.getServletContext().getRealPath("/images/123.png");//根据文件路径封装成文件对象File tmpFile=new File(realPath);//获取文件名称String fileName = tmpFile.getName();//设置响应头 content‐disposition,就是设置文件下载的打开方式,默认会在浏览器上打开,设置UTF-8,如果文件名称有中文,不会乱码response.setHeader("content-disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));//获取文件输入流InputStream in = Files.newInputStream(Paths.get(realPath));int len = 0;//创建缓冲区byte[] buffer = new byte[1024];//获取输出流OutputStream out = response.getOutputStream();//循环读取文件,每次读1KB,防止内存溢出while ((len = in.read(buffer)) > 0) {//将缓冲区的数据输出到客户端浏览器out.write(buffer,0,len);}in.close();}

2、文件上传

  • Spring MVC 为文件上传提供了直接的支持,这种支持是通过 MultipartResolver 实现的。Spring 用 Jakarta Commons FileUpload 技术实现了一个 MultipartResolver 实现类:CommonsMultipartResovler。
  • Spring MVC 上下文中默认没有装配 MultipartResovler,因此默认情况下不能处理文件的上传工作,如果想使用 Spring 的文件上传功能,需现在上下文中配置 MultipartResolver。
  • 添加Jakarta Commons FileUpload的依赖支持
	<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency>
  • 配置MultipartResolver文件上传解析器
	<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver"><!--设置编码,避免中文乱码--><property name="defaultEncoding" value="UTF-8"/><!--设置上传文件的大小--><property name="maxUploadSize" value="#{1024*1024*10}"/></bean>
  • 代码实现
 	@RequestMapping("/upload")public String upload(@RequestParam("desc") String desc,@RequestParam("uploadFile") MultipartFile multipartFile) throws IOException {System.out.println("des:" + desc);System.out.println("uploadFile:" + multipartFile.getOriginalFilename());if (!multipartFile.isEmpty()) {//获取文件上传的绝对路径String realPath = "C:\\Users\\TRS\\Desktop\\Out";//获取文件名称String fileName = multipartFile.getOriginalFilename();//创建文件对象File tmpFile;if (fileName != null) {tmpFile = new File(realPath, fileName);//将文件写入到指定目录multipartFile.transferTo(tmpFile);}}return "Success";}

五、拦截器

1、实现过程

  • SpringMVC拦截器采用AOP的设计思想,它跟过滤器类似,用来拦截处理方法在之前或者之后执行一些跟主业务没有关系的公共功能。 比如:权限控制、日志记录、异常记录等
  • 实现拦截器的步骤:
    • 1、实现接口:HandlerInterceptor
    • 2、重写三个方法:preHandle、postHandle、afterCompletion
    • 3、在springmvc.xml的配置文件中装配拦截器
  • preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    • 预处理回调方法,实现处理器方法的预处理(如:登录检查);
    • 第三个参数为响应的处理器返回值;
    • true 表示放行,继续向下执行(如调用下一个拦截器或处理器);
    • false 表示拦截(如登录检查失败),终止执行。此时我们需要通过response来产生响应;
  • postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
    • 后处理回调方法,实现处理器的后处理(但在渲染视图之前);
    • 此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对
      视图进行处理,modelAndView也可能为null;
  • afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    • 请求处理完毕后回调方法,在视图渲染完后执行;
    • 如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清
      理,类似于try­catch­finally中的finally,但仅当上面的preHandle方法返回true时才会执行。
  • 自定义拦截器
@Component
public class MyInterceptor implements HandlerInterceptor {/*** 执行1【Controller执行器中的处理方法执行之前执行】* @param request 可以在方法请求之前更改request中的属性值* @param response* @param handler 处理器对象,封装了当前这个处理方法的信息* @return*/public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {System.out.println("============>>>>preHandle()方法执行");//在请求映射到对应的处理方法映射时,实现类才是HandlerMethod,如果是视图控制器,则实现类是ParameterizableViewControllerHandlerMethod handlerMethod = (HandlerMethod) handler;System.out.println("处理方法所在类:"+handlerMethod.getBean().getClass().getName());System.out.println("处理方法的方法名:"+handlerMethod.getMethod().getName());System.out.println("处理方法的参数:" + Arrays.toString(handlerMethod.getMethod().getParameters()));return true; //返回true表示放行,返回false表示拦截}/*** 执行2【Controller执行器中的处理方法执行之后,此时还没渲染视图】* 当处理方法出现异常时,则不会执行该方法* @param request* @param response 可以在方法执行之后去更改response中的信息* @param handler* @param modelAndView 封装了model和视图信息,当请求结束后可以去修改model中的数据或者视图信息* @throws Exception*/public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {System.out.println("=========>>>postHandle()方法执行");}/*** 执行3【DispacherServlet执行之后,渲染视图之后执行】* 如果preHandle返回false,则不会执行该方法* @param request* @param response* @param handler* @param ex 在该方法中做一些记录异常日志的功能* @throws Exception*/public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {System.out.println("==========>>>afterCompletion()方法执行");}
}
  • 装配拦截器
 <!--配置拦截器--><mvc:interceptors><!--它会拦截SpringMVC所有的请求--><bean class="org.example.interceptor.MyInterceptor"></bean></mvc:interceptors>

2、拦截器与过滤器的区别

  • 过滤器是基于函数回调的,而拦截器是基于java反射的;
  • 过滤器依赖于servlet容器,而拦截器不依赖与Servlet容器,依赖于SpringMVC;
  • 过滤器几乎对所有的请求都可以起作用,而拦截器只能对SpringMVC请求起作用;
  • 拦截器可以访问处理方法的上下文,而过滤器不可以;
    环图
    执行过程

3、使用拦截器实现登录权限拦截

  • 自定义用户登录拦截器
public class UserInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HttpSession session = request.getSession();System.out.println("当前用户名:"+ session.getAttribute("username"));if (!"张三".equals(session.getAttribute("username"))) {//重定向到登录页面response.sendRedirect(request.getContextPath() + "/login");return false;}else {return true;}}}
  • 设置拦截请求映射
<!--配置拦截器--><mvc:interceptors><!--直接配置一个bean它会拦截SpringMVC所有的请求--><bean class="org.example.interceptor.MyInterceptor"></bean><!--如果不需要拦截所有的请求,可以单独配置--><mvc:interceptor><!--需要拦截的请求--><mvc:mapping path="/**"/><!--不需要拦截的请求--><mvc:exclude-mapping path="/login"/><!--拦截器--><bean class="org.example.interceptor.UserInterceptor"></bean></mvc:interceptor></mvc:interceptors>

六、异常处理

1、内置异常处理解析器

  • 在SpringMVC中拥有一套非常强大的异常处理机制,SpringMVC通过HandlerExceptionResolver处理程序的异常,包括请求映射、数据绑定以及目标方法执行时发生的异常。
  • 通过@ExceptionHandler可以在方法中记录日志,并转发到一个友好的界面进行提示;
@Controller
public class ExceptionController {@RequestMapping("/hello")public String testException(@RequestParam(value = "name") String name) {System.out.println("方法执行中...");return "index";}//只能处理当前处理器类的异常,但是优先级要比全局异常处理器高@ExceptionHandler(value = {Exception.class})public ModelAndView handleException(Exception e) {ModelAndView mv = new ModelAndView();mv.setViewName("exception");mv.addObject("ex", e);System.out.println(e.getMessage());return mv;}
}

2、全局统一异常处理

  • 如果想要对所有的控制器类进行统一异常处理,可以通过@ControllerAdvice注解来实现。
  • @ControllerAdvice 是Spring3.2提供的新注解,它是对Controller的增强,可对Controller中被 @RequestMapping注解标识的方法加一些逻辑处理: 全局异常处理、全局数据绑定、全局数据预处理;
  • 全局异常处理的实现步骤:
    • 添加@ControllerAdvice注解
    • 添加@ExceptionHandler注解
    • 处理器中自己的异常处理器优先级高于全局异常处理
    • 如果处理器类中存在异常处理方法,则优先使用处理器异常处理方法,否则,使用全局异常处理中的异常(精准异常 > 全局异常)
  • 统一异常处理:同时处理普通请求和ajax请求
    • 普通请求:返回ModelAndView对象,跳转到指定页面
    • ajax请求:返回json数据
	@ControllerAdvicepublic class GolablExceptionController {@ExceptionHandler(value = {Exception.class})public ModelAndView handleException(HttpServletRequest request, HttpServletResponse response, HandlerMethod handler, Exception e) {System.out.println("全局异常处理");ModelAndView mv = new ModelAndView();//1、根据用户请求的处理方法,判断是否是ajax请求RestController restAnnotation = handler.getClass().getAnnotation(RestController.class);//获取类上某个注解ResponseBody resAnnotation = handler.getMethod().getAnnotation(ResponseBody.class);//获取方法上某个注解//2、可以根据请求头中的类型,判断是否是ajax请求,即:Content-Type是否包含 application/jsonif (restAnnotation != null || resAnnotation != null) {//ModelAndView支持返回jsonmv = new ModelAndView(new MappingJackson2JsonView());mv.addObject("方法名", handler.getMethod().getName());mv.addObject("ex", e.getMessage());mv.addObject("code", HttpStatus.INTERNAL_SERVER_ERROR.value());}else {//返回视图mv.setViewName("exception");mv.addObject("ex", e);StringWriter stringWriter = new StringWriter();PrintWriter printWriter = new PrintWriter(stringWriter);e.printStackTrace(printWriter);System.out.println(stringWriter); //日志记录}return mv;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/362304.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端 Array.sort() 源码学习

源码地址 V8源码Array 710行开始为sort()相关 Array.sort()方法是那种排序呢&#xff1f; 去看源码主要是源于这个问题 // In-place QuickSort algorithm. // For short (length < 22) arrays, insertion sort is used for efficiency.源码中的第一句话就回答了我的问题…

微软发布Phi-3系列语言模型:手机端的强大AI助手

大模型&#xff08;LLMs&#xff09;在处理复杂任务时展现出的巨大潜力&#xff0c;但却需要庞大的计算资源和存储空间&#xff0c;限制了它们在移动设备等资源受限环境中的应用。微软公司最新发布的Phi-3系列语言模型&#xff0c;以其卓越的性能和小巧的体积&#xff0c;打破了…

FairGuard游戏加固无缝兼容 Android 15 预览版

2024年6月25日&#xff0c;谷歌发布了 Android 15 Beta 3 &#xff0c;作为Android 15 “平台稳定性”的里程碑版本&#xff0c;谷歌建议所有应用、游戏、SDK、库和游戏引擎开发者都将“平台稳定性”里程碑版本作为规划最终兼容性测试和公开发布的目标。 安卓开发者博客提供的版…

积分的可视化

积分的可视化 flyfish 考虑平方根函数 f ( x ) x f(x) \sqrt{x} f(x)x ​&#xff0c;其中 x ∈ [ 0 , 1 ] x \in [0, 1] x∈[0,1] 。在区间 [ 0 , 1 ] [0, 1] [0,1] 上&#xff0c;函数 f f f 下方的面积是指函数 y f ( x ) y f(x) yf(x) 的图像与 x x x 轴之间的部…

【微服务网关——中间件实现】

1.中间件的意义 避免成为if狂魔提高复用、隔离业务调用清晰、组合随意 2.实现原理 中间件一般都封装在路由上&#xff0c;路由是URL请求分发的管理器中间件选型 基于链表构建中间件 基于责任链的实现缺点&#xff1a;实现复杂&#xff0c;调用方式不灵活 使用数组构建中间件 控…

cad怎么导出为图片?分享四种导出方法

cad怎么导出为图片&#xff1f;在工程设计、建筑设计、机械设计等领域&#xff0c;CAD图纸的编辑和分享是一项日常工作。然而&#xff0c;如何将CAD图纸高效、准确地导出为图片格式&#xff0c;一直是设计师们关注的焦点。今天&#xff0c;就为大家推荐四款强大的CAD导出图片软…

连接Huggingface报requests.exceptions.SSLError错误

最近在学习使用 SHAP 算法解释 BERT 模型的输出结果&#xff0c;然而在从 Huggingface 上导入模型和数据集的过程中出现了网络连接相关的错误&#xff0c;本文用于记录错误类型和解决错误的方法。 1 代码示例 SHAP 官方展示的代码如下&#xff1a; import datasets import nu…

企业微信内嵌H5项目接入聊天功能

产品需求是,在列表中把符合条件的列表接入聊天功能,以下是详细步骤: 1.引入企业微信 <script src"https://res.wx.qq.com/wwopen/js/jsapi/jweixin-1.0.0.js"></script> 2.获取wx签名(必须要) /*** 获取wx签名**/ export function getWxJsApi(data) {r…

如何在信创领域中做好防泄露

随着信息技术的迅猛发展&#xff0c;数据安全和防泄露成为了企业和政府机构面临的重大挑战。在信创&#xff08;Creative and Innovative Intelligent Products&#xff09;领域中&#xff0c;沙箱技术以其独特的隔离和保护机制&#xff0c;成为了防泄露的关键手段之一。 一、沙…

上古世纪战争台服官网地址+台服预约+预创建角色教程

上古世纪战争台服上线啦&#xff0c;在《上古世纪战争》中&#xff0c;通过主要势力和地区&#xff0c;剧情和角色可以想起原作。《上古世纪战争》的主要背景为&#xff0c;原大陆消失之后&#xff0c;完成移民的种族们定居在诺伊大陆之后遇到的多个势力之间的冲突。同时&#…

鸿蒙期末项目(4)

day4 页面的设计与编写基本完成&#xff0c;接下来使用我们之前搭建好的服务器与相关的网络接口将鸿蒙中的逻辑真正实现一下。 在实现购物车页面展示功能时&#xff0c;使用了如下代码&#xff1a; getCartList(uid: number): Promise<CartItem[]> {return new Promise…

MTK平台Android13实现三方launcher为默认

一、前言 目前有遇到客户的定制需求,希望使用三方的launcher作为默认的launcher使用,一般情况下直接将三方launcher通过内置到系统并通过overlay机制即可很方便的实现launcher的替换,但是存在一个问题,需要增加ROM的维护成本。本文通过设备在使用前联网通过后台下发三方lau…

基于SpringBoot的财务管理系统

根据您提供的论文内容和模板要求&#xff0c;以下是定制化的文章输出&#xff1a; 你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; SpringBoot…

沙龙圆满举行 | 数据资产入表新动向·驱动企业新质生产力!

近日&#xff0c;由四川智慧城市发展联盟、璞华科技有限公司等公司主办的“数据治理与入表专题沙龙会”在成都圆满落幕。璞华科技有限公司作为数据治理、数据资产入表领域的领军企业&#xff0c;为此次盛会贡献了我们的专业见解与实战经验。 沙龙现场&#xff0c;业内精英齐聚一…

Redis优化之持久化

目录 1.Redis高可用 2.Redis持久化 2.1 RDB持久化 2.1.1 触发条件 2.1.2 执行流程 2.1.3 启动时加载 2.2 AOF持久化 2.2.1 开启AOF 2.2.2 执行流程 2.2.3 文件重写触发方式 2.2.4 文件重写的流程 2.2.5 启动时加载 2.3 RDB和AOF的优缺点 3.Redis性能管理 3.1 查看…

btrace使用记录

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、使用三、 推荐阅读 一、导…

Vivo手机怎么录屏?分享2种录屏方法

“新换的Vivo手机还挺好用的&#xff0c;但是今天看到一个视频想录下来保存&#xff0c;但找不到录屏功能啊&#xff0c;想问问大家Vivo手机的录屏功能怎么打开啊&#xff1f;还有Vivo手机能不能录制出高质量的视频呢&#xff1f;” 随着智能手机的普及&#xff0c;录屏功能已…

C++系统编程篇——Linux第一个小程序--进度条

&#xff08;1&#xff09;先引入一个概念&#xff1a;行缓冲区 \r和\n \r表示回车 \n表示回车并换行 ①代码一 #include<stdio.h> #include<unistd.h> int main()…

深度学习 --- stanford cs231学习笔记五(训练神经网络之数据的预处理)

数据的预处理(Data Preprocessing) 2 Data Preprocessing数据的预处理 数据预处理的几种方法 2&#xff0c;1 数据的零点中心化 数据的零点中心化的目的就是为了把数据的整体分布拉回到原点附近&#xff0c;也就是让数据的整体均值变为0。 ​ 2&#xff0c;2 数据的标准化 数据…

必应bing搜索广告投放介绍,投放的广告形式和效果

必应Bing搜索广告以其独特的市场定位、高质量的用户群体和强大的全球覆盖能力&#xff0c;成为众多企业拓展业务、提升品牌影响力的重要渠道。作为微软旗下的一款搜索引擎&#xff0c;必应不仅在美国市场占据重要份额&#xff0c;其在全球范围内的影响力也不容小觑。对于寻求国…