SpringMVC进阶(自定义拦截器以及异常处理)

文章目录

    • 1.自定义拦截器
        • 1.基本介绍
          • 1.说明
          • 2.自定义拦截器的三个方法
          • 3.流程图
        • 2.快速入门
          • 1.Myinterceptor01.java
          • 2.FurnHandler.java
          • 3.springDispatcherServlet-servlet.xml配置拦截器
          • 4.单元测试
        • 3.拦截特定路径
          • 1.拦截指定路径
          • 2.通配符配置路径
        • 4.细节说明
        • 5.多个拦截器
          • 1.执行流程图
          • 2.应用实例
            • 1.FurnHandler.java目标方法
            • 2.拦截器
            • 3.结果展示
    • 2.异常处理
        • 1.基本介绍
        • 2.局部异常处理器
          • 1.需求分析
          • 2.抛出问题
            • 1.MyExceptionHandler.java
            • 2.不处理异常则交给tomcat处理
          • 3.局部异常实例
            • 1.MyExceptionHandler.java
            • 2.exception_mes.jsp
            • 3.结果展示
        • 3.全局异常处理器
        • 1.基本介绍
        • 2.全局异常实例
            • 1.MyGlobalException.java
            • 2.global_exception.jsp
            • 3.结果展示
        • 3.细节说明
          • 1.局部异常优先级高于全局异常
          • 2.处理异常机制
        • 4.自定义异常
          • 1.基本介绍
          • 2.自定义异常应用实例
            • 1.SelfException.java
            • 2.selfex.java
            • 3.结果展示
          • 3.可以使用有参构造,抛出异常交给异常处理器接管
            • 1.SelfException.java
            • 2.selfex.java抛出自定义异常并制定message
            • 3.MyGlobalException.java捕获自定义异常
            • 4.结果展示
        • 5.统一异常处理器
          • 1.基本介绍
          • 2.需求分析
          • 3.具体实现
            • 1.MyExceptionHandler.java抛出数组越界异常
            • 2.springDispatcherServlet-servlet.xml配置统一异常处理器
            • 3.arrEx.jsp异常处理页面
            • 4.结果展示
        • 6.对未知异常进行统一处理
          • 1.具体实现
            • 1.MyExceptionHandler.java抛出异常
            • 2.springDispatcherServlet-servlet.xml修改统一异常处理器
            • 3.allEx.jsp所有未知异常的处理
            • 4.结果展示
        • 7.异常处理的优先级
          • 1.局部异常处理器
          • 2.全局异常处理器
          • 3.统一异常处理器
          • 4.Tomcat默认机制
    • 3.springMVC阶段的配置文件
        • 1.springDispatcherServlet-servlet.xml
        • 2.web.xml

1.自定义拦截器

1.基本介绍
1.说明

image-20240229191836862

2.自定义拦截器的三个方法

image-20240229191851734

3.流程图

image-20240229192327787

image-20240229192339458

2.快速入门
1.Myinterceptor01.java
package com.sun.web.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author 孙显圣
 * @version 1.0
 */
@Component //注入容器
public class Myinterceptor01 implements HandlerInterceptor {
    /**
     * 在目标方法执行前被调用,如果返回false,目标方法不会被执行
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return true;
    }

    /**
     * 在目标方法执行后被调用,可以获取目标方法返回的ModelAndView,可以根据业务进行二次处理
     *
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    /**
     * 在渲染之后会被调用,可以进行资源清理工作
     *
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

2.FurnHandler.java
package com.sun.web.interceptor;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 孙显圣
 * @version 1.0
 */
@Controller
public class FurnHandler {
    @RequestMapping("/hi")
    public String hi() {
        System.out.println("hi方法被调用");
        return "success";
    }

    @RequestMapping("/hello")
    public String hello() {
        System.out.println("hello方法被调用");
        return "success";
    }
}

3.springDispatcherServlet-servlet.xml配置拦截器
    <!--配置拦截器-->
    <mvc:interceptors>
        <!--直接引用配置好的拦截器,这种配置方式会对所有的目标方法生效-->
        <ref bean="myinterceptor01"/>
    </mvc:interceptors>
4.单元测试

image-20240229195032847

3.拦截特定路径
1.拦截指定路径
    <!--配置拦截器-->
    <mvc:interceptors>
        <!--这样配置的拦截器可以指定路径-->
        <mvc:interceptor>
            <mvc:mapping path="/hi"/>
            <ref bean="myinterceptor01"/>
        </mvc:interceptor>
    </mvc:interceptors>

image-20240229200251647

2.通配符配置路径
    <!--配置拦截器-->
    <mvc:interceptors>
        <!--拦截器可以使用通配符配置路径-->
        <mvc:interceptor>
            <!--匹配所有/h。。。的路径-->
            <mvc:mapping path="/h*"/>
            <!--排除掉/hi的路径-->
            <mvc:exclude-mapping path="/hi"/>
            <ref bean="myinterceptor01"/>
        </mvc:interceptor>
    </mvc:interceptors>

image-20240229200737823

4.细节说明

image-20240229201207944

5.多个拦截器
1.执行流程图

image-20240229205530687

2.应用实例

image-20240229212432036

1.FurnHandler.java目标方法
    @RequestMapping("/topic")
    public String topic() {
        System.out.println("topic执行!");
        return "success";
    }
2.拦截器
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //只要参数中有topic是topic就直接响应
        String topic = request.getParameter("topic");
        if (topic.equals("topic")) {
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write("<h1>请不要乱说话!!</h1>");
        }
        //后面的不再执行
        return false;
    }
3.结果展示

image-20240229212753792

2.异常处理

1.基本介绍

image-20240229213057838

2.局部异常处理器
1.需求分析

image-20240301082909238

2.抛出问题
1.MyExceptionHandler.java
package com.sun.web.exception;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 孙显圣
 * @version 1.0
 */
@Controller
public class MyExceptionHandler {
    @RequestMapping("/getNum/{num}")
    public String getNUm(@PathVariable("num") Integer num) {
        //这里如果传进来的是0则会出现异常
        System.out.println(10 / num);
        return "success";
    }
}

2.不处理异常则交给tomcat处理

image-20240301083829770

3.局部异常实例
1.MyExceptionHandler.java
package com.sun.web.exception;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 孙显圣
 * @version 1.0
 */
@Controller
public class MyExceptionHandler {
    @RequestMapping("/getNum/{num}")
    public String getNUm(@PathVariable("num") Integer num) {
        //这里如果传进来的是0则会出现异常
        System.out.println(10 / num);
        return "success";
    }
    //处理异常
    @ExceptionHandler({ArithmeticException.class, NullPointerException.class}) //参数是一个数组,可以接受多个异常类型
    public String exceptionHandler(Exception ex, HttpServletRequest request) { //当出现异常时,异常会自动封装到ex中(数据绑定)
        System.out.println("异常的信息=" + ex.getMessage());
        //可以将异常信息请求转发给下一个页面
        request.setAttribute("reason", ex.getMessage());
        return "exception_mes";
    }

}

2.exception_mes.jsp
<%--
  Date: 2024/3/1
  Time: 8:47
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>出现异常</h3>
<h4>异常信息是${requestScope.reason}</h4>
</body>
</html>

3.结果展示

image-20240301085027684

3.全局异常处理器
1.基本介绍

image-20240301085551521

2.全局异常实例
1.MyGlobalException.java
package com.sun.web.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 孙显圣
 * @version 1.0
 */
@ControllerAdvice //表示这个是处理全局异常的类
public class MyGlobalException {
    @ExceptionHandler(ArithmeticException.class) //这个是处理算数异常的算数异常处理器
    public String globalException(Exception ex, HttpServletRequest request) {
        System.out.println("全局异常信息是=" + ex.getMessage());
        //将全局异常信息请求转发
        request.setAttribute("reason", ex.getMessage());
        return "global_exception";
    }

}

2.global_exception.jsp
<%--
  Date: 2024/3/1
  Time: 9:02
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>出现异常</h3>
<h4>全局异常信息是${requestScope.reason}</h4>
</body>
</html>

3.结果展示

image-20240301090535405

3.细节说明
1.局部异常优先级高于全局异常
2.处理异常机制
  • 先从发生异常的方法所在的类中查找有@ExceptionHandler 注解的方法,如果异常不匹配则进行下一步
  • 从有@ControllerAdvice 注解的类查找有@ExceptionHandler 注解的方法,如果匹配异常则处理,无法匹配则交给tomcat处理
4.自定义异常
1.基本介绍

image-20240301091749206

2.自定义异常应用实例
1.SelfException.java
package com.sun.web.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

/**
 * @author 孙显圣
 * @version 1.0
 */
//reason指的是返回的异常原因信息,value指的是返回的响应状态
@ResponseStatus(reason = "年龄需要在1-120之间", value = HttpStatus.BAD_REQUEST)
public class SelfException extends RuntimeException{

}

2.selfex.java
package com.sun.web.exception;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 孙显圣
 * @version 1.0
 */
@Controller
public class selfex {
    @RequestMapping("/selfex")
    public void ex() {
        throw new SelfException();
    }
}

3.结果展示

image-20240301093453282

3.可以使用有参构造,抛出异常交给异常处理器接管
1.SelfException.java
package com.sun.web.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

/**
 * @author 孙显圣
 * @version 1.0
 */
//reason指的是返回的异常原因信息,value指的是返回的响应状态
@ResponseStatus(reason = "年龄需要在1-120之间", value = HttpStatus.BAD_REQUEST) //注意这个是给tomcat看的
public class SelfException extends RuntimeException{
    public SelfException() {
    }

    //这样就可以从全局异常里获取message了
    public SelfException(String message) {
        super(message);
    }
}

2.selfex.java抛出自定义异常并制定message
package com.sun.web.exception;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 孙显圣
 * @version 1.0
 */
@Controller
public class selfex {
    @RequestMapping("/selfex")
    public void ex() {
        throw new SelfException("年龄需要在1-100"); //指定message
    }
}

3.MyGlobalException.java捕获自定义异常
package com.sun.web.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 孙显圣
 * @version 1.0
 */
@ControllerAdvice //表示这个是处理全局异常的类
public class MyGlobalException {

    //处理自定义异常
    @ExceptionHandler(SelfException.class)
    public String selfex(Exception ex, HttpServletRequest request) {
        //将全局异常信息请求转发
        request.setAttribute("reason", ex.getMessage());
        return "global_exception";
    }

}
4.结果展示

image-20240301094532487

5.统一异常处理器
1.基本介绍

image-20240301095021696

2.需求分析

image-20240301095108246

3.具体实现
1.MyExceptionHandler.java抛出数组越界异常
package com.sun.web.exception;

import org.springframework.stereotype.Controller;


import org.springframework.web.bind.annotation.RequestMapping;



/**
 * @author 孙显圣
 * @version 1.0
 */
@Controller
public class MyExceptionHandler {

    //抛出数组越界异常,局部异常处理器和全局异常处理器都没有处理,则会交给统一异常处理器来处理
    @RequestMapping("/arr")
    public String array() {
        int[] ints = {1, 2, 3};
        System.out.println(ints[1222]); //交给统一异常处理器来处理
        return "success";
    }

}

2.springDispatcherServlet-servlet.xml配置统一异常处理器
    <!--配置统一异常处理器-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" id="exceptionResolver">
        <property name="exceptionMappings">
            <props>
                <!--这里的arrEx会返回给视图解析器,然后默认视图解析器进行前后缀拼接-->
                <prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop>
            </props>
        </property>
    </bean>
3.arrEx.jsp异常处理页面
<%--
  Date: 2024/3/1
  Time: 10:02
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>数组越界异常</h1>
</body>
</html>

4.结果展示

image-20240301100734501

6.对未知异常进行统一处理
1.具体实现
1.MyExceptionHandler.java抛出异常
package com.sun.web.exception;

import org.springframework.stereotype.Controller;


import org.springframework.web.bind.annotation.RequestMapping;



/**
 * @author 孙显圣
 * @version 1.0
 */
@Controller
public class MyExceptionHandler {


    //没有归类的异常
    @RequestMapping("/test")
    public String test() {
        String str = "hello";
        char c = str.charAt(10); //这里会抛出异常
        return "success";
    }
}

2.springDispatcherServlet-servlet.xml修改统一异常处理器
    <!--配置统一异常处理器-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" id="exceptionResolver">
        <property name="exceptionMappings">
            <props>
                <!--这里的arrEx会返回给视图解析器,然后默认视图解析器进行前后缀拼接-->
                <prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop>
                <prop key="java.lang.Exception">allEx</prop>
            </props>
        </property>
    </bean>
3.allEx.jsp所有未知异常的处理
<%--
  Date: 2024/3/1
  Time: 10:12
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>所有未知异常的处理界面</h1>
</body>
</html>

4.结果展示

image-20240301101531345

7.异常处理的优先级
1.局部异常处理器
  • 方法上加@ExceptionHandler({ArithmeticException.class, NullPointerException.class}) //参数是一个数组,可以接受多个异常类型
2.全局异常处理器
  • 类上加@ControllerAdvice //表示这个是处理全局异常的类
  • 方法上加@ExceptionHandler({ArithmeticException.class, NullPointerException.class}) //参数是一个数组,可以接受多个异常类型
3.统一异常处理器
  • 匹配方式是匹配尽可能具体的类型,跟配置的顺序无关
  • 在Spring配置文件中配置
    <!--配置统一异常处理器-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" id="exceptionResolver">
        <property name="exceptionMappings">
            <props>
                <!--这里的arrEx会返回给视图解析器,然后默认视图解析器进行前后缀拼接-->
                <prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop>
                <prop key="java.lang.Exception">allEx</prop>
            </props>
        </property>
    </bean>
4.Tomcat默认机制

3.springMVC阶段的配置文件

1.springDispatcherServlet-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--容器扫描-->
    <context:component-scan base-package="com.sun.web"/>

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--配置前缀和后缀-->
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--配置国际化错误信息的资源处理bean-->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <!--这里是默认到src下的properties文件中去读取的basename配置的就是文件名,所以他会读取src的i18n.properties文件-->
        <property name="basename" value="i18n"></property>
    </bean>

    <!--配置文件上传解析器,注意这里的id必须是接口首字母小写-->
    <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver"></bean>

    <!--加入两个常规配置-->
    <!--支持SpringMVC的高级功能,比如JSR303校验,映射动态请求-->
    <mvc:annotation-driven></mvc:annotation-driven><!--注意:这个annotation-driven要选择mvc的那个-->
    <!--springMVC不能处理的请求,交给tomcat处理,比如css,js-->
    <mvc:default-servlet-handler/>

    <!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/topic"/>
            <ref bean="myinterceptor01"/>
        </mvc:interceptor>
    </mvc:interceptors>

    <!--配置统一异常处理器-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" id="exceptionResolver">
        <property name="exceptionMappings">
            <props>
                <!--这里的arrEx会返回给视图解析器,然后默认视图解析器进行前后缀拼接-->
                <prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop>
                <prop key="java.lang.Exception">allEx</prop>
            </props>
        </property>
    </bean>


    <!--视图解析器按照order的大小来决定优先级,默认的视图解析器是最低的优先级MAX_VALUE = 0x7fffffff-->
    <!--配置自定义视图解析器-->
    <!--<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">-->
    <!--    <property name="order" value="99"/>-->
    <!--</bean>-->
</beans>
2.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--配置Spring自带的过滤器,解决乱码问题-->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <!--这里指定字符编码-->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--&lt;!&ndash;配置过滤器——放到最前面,因为这个应该是最先处理的&ndash;&gt;-->
    <!--<filter>-->
    <!--    <filter-name>MyCharacterFilter</filter-name>-->
    <!--    <filter-class>com.sun.web.filter.MyCharacterFilter</filter-class>-->
    <!--</filter>-->
    <!--&lt;!&ndash;过滤所有请求&ndash;&gt;-->
    <!--<filter-mapping>-->
    <!--    <filter-name>MyCharacterFilter</filter-name>-->
    <!--    <url-pattern>/*</url-pattern>-->
    <!--</filter-mapping>-->

    <!--配置HiddenHttpMethodFilter-->
    <!--把post方式提交的delete和put请求进行转换-->
    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <!--所有请求都经过这个过滤器-->
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


    <!--配置中央控制器-->
    <!--只要服务器启动,这个servlet就调用init方法读取spring的配置文件,并且接收所有请求-->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--这里如果不配置init-param,则会按照springDispatcherServlet-servlet.xml在WEB-INF目录下找Spring的配置文件-->
        <!--服务器启动就装载这个servlet,直接创建servlet实例,调用init方法-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <!--所有的请求都交给这servlet处理-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>


</web-app>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

刷代码随想录有感(49):找树左下角的值

题干&#xff1a; 用层序遍历方便些&#xff0c;因为只需要把res不断替换成每一层第一个节点值即可&#xff0c;代码如下&#xff1a; class Solution { public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*>que;if(root ! NULL)que.push(root);int res …

逆向案例三十——webpack登录某游戏

网址&#xff1a;aHR0cHM6Ly93d3cuZ205OS5jb20v 步骤&#xff1a; 进行抓包分析&#xff0c;找到登录接口&#xff0c;发现密码有加密 跟栈分析&#xff0c;从第三个栈进入&#xff0c;打上断点&#xff0c;再次点击登录 明显找到password,它由o赋值&#xff0c;o由a.encode(…

【哈希】Leetcode 面试题 01.02. 判定是否互为字符重排

题目讲解 面试题 01.02. 判定是否互为字符重排 算法讲解 直观的想法&#xff1a;我们找到一个字符串的全排列&#xff0c;然后对比当前的排列是否等于另一个字符串。如果两个字符串如果互为排列&#xff0c;所以我们知道两个字符串对应的字符出现的个数相同&#xff0c;那么…

在config.json文件中配置出来new mars3d.graphic.PolylineCombine({大量线合并渲染类型的geojson图层

在config.json文件中配置出来new mars3d.graphic.PolylineCombine({大量线合并渲染类型的geojson图层 问题场景&#xff1a; 1.浏览官网示例的时候图层看到大量线数据合并渲染的示例 2.矢量数据较大量级的时候&#xff0c;这种时候怎么在config.json文件中尝试配置呢&#x…

高并发内存池: 介绍

一.功能介绍 功能: 用于实现高效的多线程内存管理(替代系统的内存分配相关的函数(malloc, free)) 性能的提升: 池化技术, 锁竞争的减小处理内存碎片: 内碎片, 外碎片 池化技术: 概念:预先向系统申请过量的资源, 自己管理.->提高性能(每次申请资源都有较大的开销, 提前申…

数字文旅重塑旅游发展新生态:以数字化转型为契机,推动旅游产业的创新发展,提升旅游服务的智能化、网络化和个性化水平

目录 一、引言 二、数字化转型推动旅游产业创新发展 1、数字化转型提升旅游产业效率 2、数字化转型拓展旅游产业边界 3、数字化转型促进旅游产业可持续发展 三、提升旅游服务智能化、网络化和个性化水平 1、智能化提升旅游服务体验 2、网络化拓宽旅游服务渠道 3、个性…

OpenHarmony实战开发-多层级手势事件

多层级手势事件指父子组件嵌套时&#xff0c;父子组件均绑定了手势或事件。在该场景下&#xff0c;手势或者事件的响应受到多个因素的影响&#xff0c;相互之间发生传递和竞争&#xff0c;容易出现预期外的响应。 本章主要介绍了多层级手势事件的默认响应顺序&#xff0c;以及…

【大学生电子竞赛题目分析】——2023年H题《信号分离装置》

今年的大赛已临近落幕&#xff0c;笔者打算陆续对几个熟悉领域的题目作一番分析与讨论&#xff0c;今天首先分析H题。 网上有一些关于H题的分析&#xff0c;许多都是针对盲信号分析的。然而本题具有明确的信号频率范围&#xff0c;明确的信号可能频率&#xff0c;明确的信号波…

全栈从0到1 3D旅游地图标记和轨迹生成

功能演示 演示视频 体验地址 Vercel App 开发技术栈&#xff1a; NextJs&#xff08;前端框架&#xff09;React&#xff08;前端框架&#xff09;TailwindCSS &#xff08;CSS样式&#xff09;echart echart gl &#xff08;地图生成&#xff09;shadui&#xff08;UI组件…

HTML5本地存储账号密码

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML5本地存储账号密码</title> </head…

[论文笔记]SEARCHING FOR ACTIVATION FUNCTIONS

引言 今天带来另一篇激活函数论文SEARCHING FOR ACTIVATION FUNCTIONS的笔记。 作者利用自动搜索技术来发现新的激活函数。通过结合详尽的搜索和基于强化学习的搜索&#xff0c;通过实验发现最佳的激活函数 f ( x ) x ⋅ sigmoid ( β x ) f(x) x \cdot \text{sigmoid}(βx…

Android 学习 鸿蒙HarmonyOS 4.0 第二天(项目结构认识)

项目结构认识 和 了解&#xff1a; 工程目录下的结构如下&#xff1a; 首先能看到有两个.开头的文件&#xff0c;分别是.hvigor 和 .idea。这两个文件夹都是与构建有关系的&#xff0c; 如果你开发过安卓app&#xff0c;构建完会生成一个apk安装包&#xff0c;鸿蒙则是生成hap…

android 分区存储(沙盒存储)适配总结

目录 一、分区存储概念 1.外部存储分类 2.分区存储如何影响文件访问 二、分区适配方案 1. 应用分区存储的文件访问规定 (1).应用专属目录--私有目录 (2).共享目录文件--公有目录 2.MediaStore API介绍 3.Storage Access Framework介绍 三、所有文件访问权限 四、总结…

急急急!微信朋友圈删除了怎么恢复?

微信朋友圈是我们与朋友分享生活点滴的重要平台&#xff0c;但有时候微信出现异常&#xff0c;导致我们编辑好的朋友圈被删除了&#xff0c;这时候该怎么办呢&#xff1f; 幸运的是&#xff0c;微信提供了一种简单的方式来恢复已删除的朋友圈内容。微信朋友圈删除了怎么恢复&a…

react 学习笔记二:ref、状态、继承

基础知识 1、ref 创建变量时&#xff0c;需要运用到username React.createRef()&#xff0c;并将其绑定到对应的节点。在使用时需要获取当前的节点&#xff1b; 注意&#xff1a;vue直接使用里面的值&#xff0c;不需要再用this。 2、状态 组件描述某种显示情况的数据&#…

tkinter中是否有必要使用类

1. 问题背景 在使用tkinter编写事件驱动程序时&#xff0c;Fredrik Lundh的教程中提到&#xff0c;创建一个类&#xff08;App&#xff09;作为框架&#xff0c;并以类的实例运行程序&#xff0c;这样会更好&#xff0c;而不是直接启动程序。 以下是问题&#xff1a; 在tkin…

【Go语言快速上手(五)】文件操作协程操作

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Go语言专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; GO快速上手 1. 前言2. GO语言的文件操…

武汉星起航:挂牌上海股权中心,开启资本新篇章助力跨境电商飞跃

2023年10月30日&#xff0c;武汉星起航电子商务有限公司在上海股权托管交易中心成功挂牌展示&#xff0c;标志着这家在跨境电商领域拥有卓越声誉的企业正式迈入了资本市场的大门。对于武汉星起航来说&#xff0c;这不仅是其发展历程中的一个重要里程碑&#xff0c;更是对其业务…

Python学习笔记------异常

当检测到错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现一些错误提示&#xff0c;就是所谓异常&#xff08;bug&#xff09; 1、异常的捕获方法 任何程序运行过程中都可能出现异常&#xff0c;我们可以在力所能及的范围内&#xff0c;对可能出现的bug提…

C语言趣味代码(四)

这一篇主要编写几个打字练习的小程序&#xff0c;然后通过这些小程序的实现来回顾复习我们之前学过的知识&#xff0c;然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。 1. 打字练习 1.1 基本打字练习 1.1.1 基本实现 首先我们来制作一个用于计算并显示输入一…
最新文章