Springboot整合MVC进阶篇

一、概述

1.1SpringBoot整合SpringMVC配置

SpringBoot对SpringMVC的配置主要包括以下几个方面:

  1. 自动配置:SpringBoot会自动配置一个嵌入式的Servlet容器(如Tomcat),并为我们提供默认的SpringMVC配置。这样我们无需手动配置Servlet容器和SpringMVC,只需添加相应的依赖即可快速搭建一个Web应用。
  2.  视图解析器:SpringBoot默认使用Thymeleaf作为视图解析器,如果需要更换其他视图解析器,可以在pom.xml中修改对应的依赖。
  3. 静态资源处理:SpringBoot默认会处理静态资源(如HTML、CSS、JavaScript等),并将其放在项目的/static或/public目录下。如果需要自定义静态资源的处理方式,可以通过编写一个类实现WebMvcConfigurer接口,并重写addResourceHandlers方法来实现。
  4. 拦截器:SpringBoot支持自定义拦截器,可以通过实现HandlerInterceptor接口来创建拦截器,并在主配置类上添加@EnableWebMvc注解,然后在该注解的configurers属性中添加自定义的拦截器。
  5.  异常处理:SpringBoot默认使用WhitelabelErrorView来处理异常,如果需要自定义异常处理方式,可以通过编写一个类实现ErrorController接口,并重写errorHtml方法来实现。
  6. 参数绑定:SpringBoot支持多种参数绑定方式,如@RequestParam、@PathVariable、@RequestBody等。如果需要自定义参数绑定方式,可以通过编写一个类实现MethodArgumentResolver接口,并重写resolveArgument方法来实现。
  7.  跨域支持:SpringBoot默认支持CORS跨域请求,如果需要自定义跨域配置,可以通过编写一个类实现WebMvcConfigurer接口,并重写addCorsMappings方法来实现。

总之,SpringBoot为我们提供了丰富的默认配置和灵活的扩展机制,可以方便地定制和扩展SpringMVC以满足项目需求。

1.2WebMvcConfiguration概述

WebMvcConfigurer接口是Spring提供的一个用于自定义Spring MVC配置的接口,主要提供了WebMvcConfigurer接口是Spring提供的一个用于自定义Spring MVC配置的接口,主要提供了多个回调方法,包括添加或修改Spring MVC的配置,如添加拦截器,自定义消息转换器等。具体来说,WebMvcConfigurer接口的主要方法包括:

  • - configurePathMatch(S):此方法用于配置路由请求规则。
  • - configureContentNegotiation(S):该方法用于内容协商配置。
  • - configureAsyncSupport(S):该方法用于异步支持配置。
  • - configureDefaultServletHandling(S):该方法用于配置默认静态资源处理器。
  • - addFormatters(S):此方法用于注册自定义转化器。
  • - addInterceptors(S):此方法用于拦截器配置。
  • - addResourceHandlers(S):此方法用于资源处理。
  • - addCorsMappings(S):此方法用于CORS配置。

在使用时,只需要实现WebMvcConfigurer接口,重写上述的方法即可完成自定义配置。

二、详解

2.1资源处理器

import org.springframework.http.CacheControl;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.concurrent.TimeUnit;
@Configuration
public class MyConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 保留以前的配置
        WebMvcConfigurer.super.addResourceHandlers(registry);
        
        // 自定义配置
        registry.addResourceHandler("/static/**")
            .addResourceLocations("classpath:/a/", "classpath:/b/")
            .setCacheControl(CacheControl.maxAge(1180, TimeUnit.SECONDS));
    }
}

实现了WebMvcConfigurer接口。它的作用是配置静态资源的处理方式。具体来说,它会将"/static/**"路径下的资源映射到"classpath:/a/"和"classpath:/b/"这两个目录下,并设置缓存时间为1180秒。

2.2 路径匹配

Spring5.3之后加入了更多的请求路径匹配的实现策略;
以前只支持AntPathMatcher策略,现在提供了PathPatternParser策略。并且可以让我们指定到底使用那种策略。

 Ant风格

Ant风格的路径模式语法具有以下规则:

  • *:表示任意数量的字符。
  • ?:表示任意一个字符。
  • **:表示任意数量的目录。
  • {}:表示一个命名的模式占位符。
  • []:表示字符集合,例如[a-z]表示小写字母。

 PathPatternParser策略

PathPatternParser是Spring框架中用于解析URL路径模式的策略类。它可以解析和匹配URL路径模式,并且支持Ant风格的通配符,例如?***

  • ·PathPatternParser在jmh基准测试下,有6~8倍吞l提升,降低30%~40%空间分配率
  • ·PathPatternParser兼容AntPathMatcheri语法,并支持更多类型的路径模式
  • ·PathPatternParser"*"多段匹配的支持仅允许在模式末尾使用
 /**
     * 默认使用新版 PathPatternParser 进行路径匹配
     * 不能匹配 ** 在中间的情况,剩下的和 antPathMatcher语法兼容
     * @param request
     * @param path
     * @return
     */
    @GetMapping("/a*/b?/**/{p1:[a-f]+}/**")
    public String hello(HttpServletRequest request, @PathVariable("p1") String path) {

        log.info("路径变量p1: {}", path);
        String uri = request.getRequestURI();
        return uri;
    }

 模式转换

# 使用新版的路径匹配策略PathPatternParser
spring.mvc.pathmatch.matching-strategy=path_pattern_parser

# 使用老版的路径匹配策略AntPathMatcher
# spring.mvc.pathmatch.matching-strategy=ant_path_matcher

2.3内容协商配置

 在Spring Boot中,内容协商(Content Negotiation)是一种处理不同客户端请求的方法。它允许服务器根据请求的内容类型、参数或其他条件来选择合适的响应格式。要配置内容协商,你需要使用WebMvcConfigurer接口的实现类。

基于请求头内容协商:默认

客户端向服务端发送请求,携带HTTP标准的Accept请求头。

  • .Accept:application/json.text/xml.text/yaml
  • 服务端根据客户端情求头期望的数据类型进行动态返回

基于请求参数内容协商:需要开启

  • 发送请求GET/projects/spring-boot?format=json
  • 匹配到@GetMapping("*/projects/spring-boot")
  • 根据参数协商,优先返回json类型数据【需要开启参数匹配设置】
  • 发送请求GET/projects/spring-boot?format:=xml,优先返回xml类型数据

 web场景自动引入了json场景

在 spring-boot-starter-web 依赖下:
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-json</artifactId>
      <version>2.3.4.RELEASE</version>
      <scope>compile</scope>
</dependency>

 内容协助实现转xml

请求同一个接口,可以返回json和xml不同格式数据

  1. 引入支持写出xml内容依赖
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
    </dependency>
  2. 标注注解
    package com.yanyu.springplustest4.dto;
    
    import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @JacksonXmlRootElement  // 可以写出为xml文档
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Person {
        private Long id;
        private String userName;
        private String email;
        private Integer age;
        private String role;
    }
    

    @JacksonXmlRootElement注解是Jackson库中的一个注解,用于指定XML文档的根元素。当使用Jackson库将Java对象转换为XML时,可以使用此注解来设置根元素的标签名。例如:

    import com.fasterxml.jackson.annotation.JacksonXmlRootElement;
    
    @JacksonXmlRootElement(localName = "student")
    public class Student {
        private String name;
        private int age;
    
        // 省略getter和setter方法
    }

    在这个例子中,Student类被标记为@JacksonXmlRootElement(localName = "student"),表示生成的XML文档的根元素标签名为<student>

  3. 开启基于请求参数的内容协商
    # 开启基于请求参数的内容协商功能。 默认参数名:format。 默认此功能不开启
    spring.mvc.contentnegotiation.favor-parameter=true
    # 指定内容协商时使用的参数名。默认是 format
    spring.mvc.contentnegotiation.parameter-name=type
  4. 测试
    package com.yanyu.springplustest4.Controller;
    
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.yanyu.springplustest4.dto.Person;
    import jakarta.servlet.http.HttpServletRequest;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.MessageSource;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.Locale;
    
    /**
     * @author lfy
     * @Description
     * @create 2023-04-10 18:31
     */
    @Slf4j
    @RestController
    public class HelloController {
    
        /**
         * 1、默认支持把对象写为json。因为默认web场景导入了jackson处理json的包;jackson-core
         * 2、jackson也支持把数据写为xml。导入xml相关依赖
         * @return
         */
        @GetMapping("/person")
        public Person person(){
            Person person = new Person();
            person.setId(1L);
            person.setUserName("张三");
            person.setEmail("aaa@qq.com");
            person.setAge(18);
            return person;
        }
    
    }

 配置协商规则与支持类型

  1. 修改内容协商方式
    #使用参数进行内容协商
    spring.mvc.contentnegotiation.favor-parameter=true  
    #自定义参数名,默认为format
    spring.mvc.contentnegotiation.parameter-name=myparam 
  2. 大多数 MediaType 都是开箱即用的。也可以自定义内容类型
    spring.mvc.contentnegotiation.media-types.yaml=text/yaml

2.4消息转化器

WebMvcAutoConfiguration提供几种默认HttpMessageConverters

  • EnableWebMvcConfiguration通过 addDefaultHttpMessageConverters添加了默认的MessageConverter;如下:
    • ByteArrayHttpMessageConverter: 支持字节数据读写
    • StringHttpMessageConverter: 支持字符串读写
    • ResourceHttpMessageConverter:支持资源读写
    • ResourceRegionHttpMessageConverter: 支持分区资源写出
    • AllEncompassingFormHttpMessageConverter:支持表单xml/json读写
    • MappingJackson2HttpMessageConverter: 支持请求响应体Json读写

      默认8个: 

      image.png

      系统提供默认的MessageConverter 功能有限,仅用于json或者普通返回数据。额外增加新的内容协商功能,必须增加新的HttpMessageConverter

在Spring Boot中,可以通过配置类来自定义消息转换器。例如,以下代码演示了如何配置一个将Java对象转换为JSON格式的消息的转换器:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new MappingJackson2HttpMessageConverter());
    }
}

 举例

1. 增加yaml返回支持

导入依赖

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
</dependency>

把对象写出成YAML

package com.yanyu.springplustest4.Controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yanyu.springplustest4.dto.Person;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.bind.annotation.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
import java.util.Locale;


@Slf4j
@RestController
public class HelloController {
    @GetMapping("/person")
    public Person person(/*@RequestBody Person person*/){
        Person person = new Person();
        person.setId(1L);
        person.setUserName("张三");
        person.setEmail("aaa@qq.com");
        person.setAge(18);
        return person;
    }
    public static void aaa(String[] args) throws JsonProcessingException {
        Person person = new Person();
        person.setId(1L);
        person.setUserName("张三");
        person.setEmail("aaa@qq.com");
        person.setAge(18);

        YAMLFactory factory = new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER);
        ObjectMapper mapper = new ObjectMapper(factory);

        String s = mapper.writeValueAsString(person);
        System.out.println(s);
    }
}

编写配置

#新增一种媒体类型
spring.mvc.contentnegotiation.media-types.yaml=text/yaml

增加HttpMessageConverter组件,专门负责把对象写出为yaml格式

package com.yanyu.springplustest4;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;

/**
 * 自定义的HTTP消息转换器,用于将对象转换为YAML格式
 */
public class MyYamlHttpMessageConverter extends AbstractHttpMessageConverter<Object> {

    private ObjectMapper objectMapper = null; // 用于将对象转换为YAML格式的ObjectMapper

    /**
     * 构造方法,配置YAML格式的ObjectMapper
     */
    public MyYamlHttpMessageConverter(){
        super(new MediaType("text", "yaml", Charset.forName("UTF-8")));
 // 告诉SpringBoot这个MessageConverter支持哪种媒体类型
        YAMLFactory factory = new YAMLFactory()
                .disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER); 
// 禁用YAML文档起始标记
        this.objectMapper = new ObjectMapper(factory);
    }

    /**
     * 判断是否支持转换指定的类
     * @param clazz 要转换的类
     * @return 如果是对象类型(非基本类型),返回true;否则返回false
     */
    @Override
    protected boolean supports(Class<?> clazz) {
        return true;
    }

    /**
     * 从HTTP输入消息中读取数据,暂不实现
     * @param clazz 要转换的类
     * @param inputMessage HTTP输入消息
     * @return 返回null
     * @throws IOException 如果发生I/O错误
     * @throws HttpMessageNotReadableException 如果无法读取消息
     */
    @Override
    protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        return null;
    }

    /**
     * 将对象写入HTTP输出消息中
     * @param methodReturnValue 要写出的对象
     * @param outputMessage HTTP输出消息
     * @throws IOException 如果发生I/O错误
     * @throws HttpMessageNotWritableException 如果无法写出消息
     */
    @Override
    protected void writeInternal(Object methodReturnValue, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        // 使用try-with-resources语法,自动关闭流
        try(OutputStream os = outputMessage.getBody()){
            this.objectMapper.writeValue(os, methodReturnValue);
        }
    }
}

2.5国际化配置

国际化的自动配置参照MessageSourceAutoConfiguration

实现步骤

  1. Spring Boot 在类路径根下查找messages资源绑定文件。文件名为:messages.properties
  2. 多语言可以定义多个消息文件,命名为messages_区域代码.properties。如:
    1. messages.properties:默认
    2. messages_zh_CN.properties:中文环境
    3. messages_en_US.properties:英语环境
  3. 程序中可以自动注入 MessageSource组件,获取国际化的配置项值
  4. 页面中可以使用表达式  #{}获取国际化的配置项值
        @Autowired  //国际化取消息用的组件
        MessageSource messageSource;
        @GetMapping("/haha")
        public String haha(HttpServletRequest request){
    
            Locale locale = request.getLocale();
            //利用代码的方式获取国际化配置文件中指定的配置项的值
            String login = messageSource.getMessage("login", null, locale);
            return login;
        }
    
  5. 配置

    spring.messages.basename=messages
    spring.messages.encoding=UTF-8
    

1. `spring.messages.basename=messages`:这个属性设置了Spring Boot默认的消息文件的基本名称,即在类路径下查找名为"messages"的文件。这些文件通常用于存储国际化消息,例如错误消息、提示消息等。

2. `spring.messages.encoding=UTF-8`:这个属性设置了Spring Boot默认的消息文件的字符编码。在这个例子中,编码被设置为UTF-8,这意味着消息文件中的文本将使用UTF-8编码进行存储和读取。

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

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

相关文章

【Java、Python】获取电脑当前网络IP进行位置获取(附源码)

我相信看到这篇博客的时候心里肯定是想解决自己的一个问题的&#xff0c;而这篇博客我就以简单快速的方式解决这些烦恼&#xff01; 一、获取当前IP 在Java中自带了一些自己的流对象来获取当前的IP地址&#xff0c;不多说我们直接上代码。 //获取当前网络ip地址 ipAddress Ine…

在k8s中将gitlab-runner的运行pod调度到指定节点

本篇和前面的 基于helm的方式在k8s集群中部署gitlab 具有很强的关联性&#xff0c;因此如果有不明白的地方可以查看往期分享&#xff1a; 基于helm的方式在k8s集群中部署gitlab - 部署基于helm的方式在k8s集群中部署gitlab - 备份恢复基于helm的方式在k8s集群中部署gitlab - 升…

论文阅读——X-Decoder

Generalized Decoding for Pixel, Image, and Language Towards a Generalized Multi-Modal Foundation Model 1、概述 X-Decoder没有为视觉和VL任务开发统一的接口&#xff0c;而是建立了一个通用的解码范式&#xff0c;该范式可以通过采用共同的&#xff08;例如语义&#…

实战:朴素贝叶斯文本分类器搭建与性能评估

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

生成超清分辨率视频,南洋理工开源Upscale-A-Video

大模型在生成高质量图像方面表现出色,但在生成视频任务中&#xff0c;经常会面临视频不连贯、图像模糊、掉帧等问题。 这主要是因为生成式抽样过程中的随机性,会在视频序列中引入无法预测的帧跳动。同时现有方法仅考虑了局部视频片段的时空一致性,无法保证整个长视频的整体连贯…

基于电商场景的高并发RocketMQ实战-Broker写入读取流程性能优化总结、Broker基于Pull模式的主从复制原理

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 【11来了】文章导读地址&#xff1a;点击查看文章导读&#xff01; &#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f3…

关于OpenCV中 CV_Assert() 的使用引起程序中止/崩溃问题

CV_Assert() 的作用是&#xff1a;若括号中的表达式值为 false &#xff0c;则返回一个错误信息&#xff0c;并终止程序执行。 但是 CV_Assert() 与 assert 不同&#xff0c;CV_Assert() 会通过异常抛出&#xff0c;所以如果使用 CV_Assert()&#xff0c;可以通过捕获异常而不是…

三列布局 css

实现如下图的三列布局&#xff1a; .box {width:1400px;margin:0 auto;padding-bottom:40px;> .left {float:left;width:180px;margin-top:100px;text-align:center;}> .center {float:left;margin-top:100px;margin-left:130px;item-box {float:left;text-align:left;…

oom问题

问题描述 虚拟机集群节点上pod报oom&#xff0c;最后pod被驱逐&#xff0c;主节点上查看kubectl top node的mem使用率很高&#xff0c;重启系统后&#xff0c;mem会降下来&#xff0c;但还会慢慢增长。 node节点上查看 /sys/fs/cgroup/memory/memory.usage_in_bytes内存使用超…

Spring Boot简单多线程定时任务实现 | @Async | @Scheduled

Spring Boot简单多线程定时任务实现 实现步骤 1 创建一个Spring Boot项目 2 定义定时任务&#xff1a; package com.jmd.timertasktest.task;import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.Async; impor…

GenerateBlocks Pro插件 构建更好的WordPress网站

GenerateBlocks Pro插件 构建更好的WordPress网站 GenerateBlocks Pro插件是一个 WordPress 插件&#xff0c;几乎可以完成任何事情&#xff0c;可让您创建轻量级和多功能的网站。由与流行且快速的 GeneratePress 主题相同的创作者构建&#xff0c;该插件不负众望。使用 Genera…

H266/VVC帧间预测编码技术概述

帧间预测编码简述 帧间预测利用视频时间域的相关性&#xff0c;使用邻近已编码图像像素值预测当前图像的像素值&#xff0c;能有效去除视频时域冗余。 目前主要的视频编码标准中&#xff0c;帧间预测都采用基于块的运动补偿技术&#xff0c;不同的编码标准有不同的分块方式。 …

智能优化算法应用:基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.驾驶训练算法4.实验参数设定5.算法结果6.…

Android笔记(二十一):Room组件实现Android应用的持久化处理

一、Room组件概述 Room是Android JetPack架构组件之一&#xff0c;是一个持久处理的库。Room提供了在SQLite数据库上提供抽象层&#xff0c;使之实现数据访问。 &#xff08;1&#xff09;实体类&#xff08;Entity&#xff09;&#xff1a;映射并封装了数据库对应的数据表中…

微信小程序备案流程整理

一、备案流程 [找备案入口]–[填主体信息]–[填小程序信息]–[初审]–[短信核验]–[通管局审核] 1&#xff0c;在小程序后台找到备案入口 &#xff08;1&#xff09;新的未上架小程序&#xff0c;可以在小程序首页点击【去备案】进入。 &#xff08;2&#xff09;已上架小程…

交换机端口镜像技术原理与配置

在网络维护的过程中会遇到需要对报文进行获取和分析的情况&#xff0c;比如怀疑有攻击报文&#xff0c;此时需要在不影响报文转发的情况下&#xff0c;对报文进行获取和分析。镜像技术可以在不影响报文正常处理流程的情况下&#xff0c;将镜像端口的报文复制一份到观察端口&…

基于Java版本与鸿鹄企业电子招投标系统的二次开发实践-鸿鹄企业电子招投标系统源代码+支持二开+鸿鹄电子招投标系统

随着市场竞争的加剧和企业规模的扩大&#xff0c;招采管理逐渐成为企业核心竞争力的重要组成部分。为了提高招采工作的效率和质量&#xff0c;我们提出了一种基于电子化平台的解决方案。该方案旨在通过电子化招投标&#xff0c;使得招标采购的质量更高、速度更快&#xff0c;同…

L1-061:新胖子公式

题目描述 根据钱江晚报官方微博的报导&#xff0c;最新的肥胖计算方法为&#xff1a;体重(kg) / 身高(m) 的平方。如果超过 25&#xff0c;你就是胖子。于是本题就请你编写程序自动判断一个人到底算不算胖子。 输入格式&#xff1a; 输入在一行中给出两个正数&#xff0c;依次为…

ImageJ图像滤波基础

文章目录 滤波简单滤波器卷积滤波Unsharp MaskTop Hat ImageJ系列&#xff1a;安装与初步&#x1f48e;灰度图像处理 滤波 预设滤波器 ImageJ的Process菜单提供了诸多图像滤波器&#xff0c;其中大部分方法均可定制参数&#xff0c;但也提供了一些已经预设参数的处理方法。 …

博易大师智星系统外盘资管系统的功能介绍!

1. 市场行情数据接收和显示&#xff1a;软件需要接收实时的市场行情数据&#xff0c;并将其以图形或数字的形式显示出来&#xff0c;包括价格、成交量、成交额等信息。 2. 交易操作界面&#xff1a;软件需要提供一个交易操作界面&#xff0c;供用户进行交易操作&#xff0c;包括…