第08章 Spring-Boot 使用简介

2023-11-18

第08章 Spring Boot 简介

Spring框架功能很强大,但是就算是一个很简单的项目,我们也要配置很多东西。因此就有了Spring Boot框架,它的作用很简单,就是帮我们自动配置。Spring Boot框架的核心就是自动配置,只要存在相应的jar包,Spring就帮我们自动配置。如果默认配置不能满足需求,我们还可以替换掉自动配置类,使用我们自己的配置。另外,Spring Boot还集成了嵌入式的Web服务器,系统监控等很多有用的功,让我们快速构建企业及应用程序。

创建项目

创建项目

创建项目很简单。如果使用STS的话,新建Spring Starter项目即可。如果使用IDEA的话,新建Spring Initializer项目。如果不想使用IDE的话,从start.spring.io创建项目也可以。例如下面就是一个Spring Boot项目的build.gradle文件,是我用IDEA创建的项目。由于我是用了最新的快照版本,因此这里的仓库还多了两个Spring的快找仓库,可以直接无视。(因为1.5的稳定版中Thymeleaf的支持才到2,为了使用最新Thymeleaf3,只能使用最新的快照版。)

我们可以看到Spring Boot和一般的项目差不多,只不过多应用了Spring Boot插件,它会让我们更方便的运行Spring。另外在项目中没有其他依赖的引用,只引用了Spring Boot Starter依赖,这些依赖会将可能会使用到的依赖帮我们引用。例如spring-boot-starter-test会引用JUnit、AssertJ等一些测试框架,我们不用再引用了。这极大地方便了我们的开发。而且这些依赖不需要指定具体版本,具体的版本由Spring帮我们决定。关于详细的Starter项目和具体jar包的版本号,参考13.5. StartersF. Dependency versions

buildscript {
    ext {
        springBootVersion = '2.0.0.BUILD-SNAPSHOT'
    }
    repositories {
        mavenCentral()
        maven { url "https://repo.spring.io/snapshot" }
        maven { url "https://repo.spring.io/milestone" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

jar {
    baseName = 'spring-boot-sample'
    version = '0.0.1-SNAPSHOT'
}

sourceCompatibility = 1.8

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/snapshot" }
    maven { url "https://repo.spring.io/milestone" }
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter-aop')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    compile('org.springframework.boot:spring-boot-starter-web')
    runtime('org.springframework.boot:spring-boot-devtools')
    runtime('org.hsqldb:hsqldb')
    runtime('mysql:mysql-connector-java')
    compileOnly('org.projectlombok:lombok')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

项目格式

项目格式类似下图,和一般的Maven或者Gradle项目类似,只不过多了点东西。资源文件夹下static文件夹用来存放web程序的静态资源,例如图片、css、js等。template文件夹存放web程序的视图模板,html等需要渲染的模板文件就放在这里。application.properties文件很重要,它是Spring Boot项目的全局配置文件。以往我们需要编写层级XML配置文件,现在只需要在这里使用key=value方式即可指定这些属性。默认的模板还为我们添加了两个类。一个在main下,是Spring Boot项目的运行类,另一个在test下,是测试类。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h35nDlpf-1599828442285)(assets/832668-298d29280ceb2424.png)]

运行类的代码如下。它是一个简单的类,包含了主方法,而且类上使用了@SpringBootApplication注解。这是一个惯用注解,它会帮我们启用自动配置等特性。

@SpringBootApplication
public class SpringBootSampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootSampleApplication.class, args);
    }
}

如果看一下SpringBootApplication的源代码,类似下面这样。可以看到,SpringBootApplication的功能是通过几个注解实现的。EnableAutoConfiguration注解启用了自动配置功能。ComponentScan注解会扫描该类所在的包和子包。所以Spring推荐我们将这个运行类放到项目的根包下,以便我们不需要任何配置即可扫描到所有配置类。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

Spring Boot项目更喜欢Java配置方式。因此从这里开始,所有的Spring配置都是用Java方式配置。当然如果你还想使用XML配置文件也可以,新建一个空的配置类,然后添加@ImportResource注解并传递要使用的XML文件路径即可。

运行项目

如果使用Maven的话,运行下面的命令。

mvn spring-boot:run

如果使用Gradle的话,使用下面的命令。

gradle bootRun

然后就会显示类似下面的输出,后面会跟一大堆日志信息。如果是命令行程序的话,日志信息之后就会显示程序的运行结果了。如果是Web程序的话,默认情况下会使用内嵌的Tomcat来运行。我们使用localhost:8080来访问即可。

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v2.0.0.BUILD-SNAPSHOT)

这个日志可以是彩色的。如果你的输出不是彩色的,可以在application.properties文件中添加下面一句。

spring.output.ansi.enabled=always

项目配置

自定义 SpringApplication

前面我们看到了SpringBoot项目的启动类是这样的。

@SpringBootApplication()
public class SpringBootSampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootSampleApplication.class, args);
    }
}

其实,我们可以自定义它的各种属性。这时候需要创建SpringApplication对象并设置它的各种属性。比方说下面不显示Banner。还有很多配置和用法请查阅官方文档。

@SpringBootApplication()
public class SpringBootSampleApplication {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(SpringBootSampleApplication.class);
        application.setBannerMode(Banner.Mode.OFF);
        application.run(args);
    }
}

事件和监听器

如果有更高级的需求可以使用监听器来管理Spring Boot程序的各个生命周期。监听器需要实现org.springframework.context.ApplicationListener接口。

public class MyAppListener implements ApplicationListener<ApplicationReadyEvent> {


    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        System.out.println("应用程序准备就绪");
    }
}

在监听器中可以设置下面几种事件。

  • ApplicationStartingEvent
  • ApplicationEnvironmentPreparedEvent
  • ApplicationPreparedEvent
  • ApplicationReadyEvent
  • ApplicationFailedEvent

之后,把监听器添加到Spring程序中。

@SpringBootApplication()
public class SpringBootSampleApplication {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(SpringBootSampleApplication.class);
        application.setBannerMode(Banner.Mode.OFF);
        application.addListeners(new MyAppListener());
        application.run(args);
    }
}

Profiles

在Spring Boot中Profiles更简单了。我们使用application-{profile}.properties格式来区分不同的Profile,例如一个测试profile(application-test.properties),一个生产环境profile(application-product.properties)。

定义好多个Profiles之后,还需要在标准的application.properties中列出和启用这些Profiles。列出使用spring.profiles.include,激活其中的一个使用spring.profiles.active

spring.output.ansi.enabled=always
spring.thymeleaf.cache=false
spring.profiles.include[0]=test
spring.profiles.include[1]=product
spring.profiles.active[0]=test

使用YAML

YAML也是一种配置文件格式,比方说上面的properties,就可以改写为下面这样的YAML文件(application.yaml)。

spring:
  output:
    ansi:
      enabled: always
  thymeleaf:
    cache: false
  profiles:
    include:
    - product
    - test
    active: test

如果需要多个Profile,YAML只需要一个文件即可,profiles之间使用---分隔开。

server:
    address: 192.168.1.100
---
spring:
    profiles: development
server:
    address: 127.0.0.1
---
spring:
    profiles: production
server:
    address: 192.168.1.120

使用Properties还是YAML,根据个人喜好即可。

自动配置

修改自动配置

Spring Boot的核心就是自动配置,它为几乎所有的Spring组件都提供了相应的自动配置类,而且默认是打开的。所以只要相关的jar文件存在,这些自动配置就会被使用。其中有些配置属于必配的(例如Web模板),自动配置会为我们省下不少时间;有些配置(例如数据源)则往往需要我们修改。Spring的自动配置是非侵入式的,所以如果我们声明了自己的数据源,那么Spring自动配置的嵌入式数据源就会取消。

当然如果想要关闭某些自动配置也是可以的。如果你有自己的主配置类,手动在上排除某些自动配置类即可。

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}

如果我们使用了SpringBootApplication注解,那么上面这种方式需要修改一下。SpringBootApplication注解提供了几个属性,可以控制排除的自动配置和组件搜索的路径。

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class SpringBootSampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootSampleApplication.class, args);
    }
}

另外还可以直接修改项目的属性。我们可以编辑application.properties文件,在其中添加spring.autoconfigure.exclude属性并指定要排除的类即可。

Spring的自动配置类一般在org.springframework.boot.autoconfigure包下,如果我们需要查看当前使用了多少个自动配置类,可以在运行程序的时候添加--debug标志,这样Spring会打印额外的调试信息。如果需要详细的自动配置类的列表,可以参考Spring Boot文档 附录C. Auto-configuration classes

Spring Web MVC自动配置

自动配置

MVC自动配置会启用以下功能。

  • ContentNegotiatingViewResolverBeanNameViewResolver beans.
  • 静态资源和WebJars的支持.
  • 自动注册 Converter, GenericConverter, Formatter beans.
  • HttpMessageConverters 的支持.
  • 自动注册MessageCodesResolver.
  • 静态index.html的支持.
  • 自定义Favicon(浏览器页面的小图标) 支持.
  • 自动使用ConfigurableWebBindingInitializer bean.

自动注册指的是,只需要在Spring中注册相应类型的Bean。Spring Web MVC会自动识别和使用这些Bean。例如,我们要添加新的HttpMessageConverter,只需要向下面这样。

@Configuration
public class MyConfiguration {

    @Bean
    public HttpMessageConverters customConverters() {
        HttpMessageConverter<?> additional = ...
        HttpMessageConverter<?> another = ...
        return new HttpMessageConverters(additional, another);
    }

}

静态资源

静态资源默认放在resources文件夹的/static (或/public/resources/META-INF/resources下面。如果需要配置位置的话,在属性文件中添加spring.mvc.static-path-pattern=/resources/**

如果需要静态主页,直接在resources/static/下放入一个index.html即可。

favicon.ico

如果需要配置自己的favicon.ico,只需要将自己的favicon.ico直接放到resources文件夹下即可。

视图模板

Spring会对Thymeleaf、Freemarker、Groovy和mustache四种模板进行自动配置。默认的模板路径为resources/templates

错误处理

错误处理和一般的Spring Web MVC类似,使用@ControllerAdvice

自定义错误页面放在下面的路径。

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- public/
             +- error/
             |   +- 404.html
             +- <other public assets>

如果错误页面也需要使用模板引擎动态生成,那么放在下面的路径。

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- templates/
             +- error/
             |   +- 5xx.ftl
             +- <other templates>

SQL数据库自动配置

嵌入式数据库

如果类路径中包含HSQL、Derby或H2的相应jar包,那么Spring就会自动配置这些嵌入式数据库的实例和数据源。它们会将数据保存在内存中,当程序结束之后数据会丢失。这非常适合开发和测试。

在不同的测试中Spring默认会重用这些嵌入式数据库。假如不同测试之间的数据不同,你可能希望每次测试都使用新的数据库。这时候可以在属性文件中指定spring.datasource.generate-unique-name=true

生产数据库

Spring会自动选择带连接池的数据源,遵循以下规则:

  • 如果存在tomcat-jdbc数据源,则使用它。
  • 否则,如果存在HikariCP,则使用它。
  • 如果前两个都不存在,而存在DBCP2,则使用它。

这时候我们需要提供数据源的额外配置信息。

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

JdbcTemplate

JdbcTemplateNamedParameterJdbcTemplate会由上面的数据源自动配置。我们直接使用@Autowire注入到程序中即可。

JPA自动配置

实体类

JPA Entity类(标记了@Entity的类)默认在persistence.xml中配置。在Spring Boot中,@EnableAutoConfiguration@SpringBootApplication包下的实体类会被自动扫描到。如果希望自定义实体类的位置,可以使用@EntityScan注解,添加到配置类上即可。

Spring Data JPA

继承了 Repository的接口会被自动扫描到,我们不需要做任何配置。如果需要配置,设置spring.jpa.*属性。例如下面指定了数据的生成策略。

spring.jpa.hibernate.ddl-auto=update

H2的web控制台

H2嵌入式数据库提供了一个基于web界面的控制台。这个控制台也可以由Spring自动配置。当(1:存在H2相关jar包,2:当前程序是一个web程序,3:devtoos存在)的情况下,Spring便会自动配置H2控制台。

web控制台的访问路径默认为/h2-console。我们可以使用spring.h2.console.path属性修改它。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-phfchW0N-1599828442290)(assets/832668-d6790aa829503ae0.png)]

如图,这是一个完整的交互界面,我们可以方便的在这里处理数据。如果需要设置访问控制权限,添加下面的属性。

  • security.user.role
  • security.basic.authorize-mode
  • security.basic.enabled

如果不想使用该控制台,可以使用spring.h2.console.enabled=false关闭它。在生产环境中记得把它关掉。

最后我要说一点,Spring Boot文档包含了很多其他Spring项目的自动配置,这里不可能全写完。所以如果需要详细信息的话还是直接啃文档吧。

其他配置

调试工具(devtools)

如果使用Maven,添加下面的依赖。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

如果使用Gradle,添加下面的依赖。

dependencies {
    compile("org.springframework.boot:spring-boot-devtools")
}

这样就可以将调试工具添加到项目中。调试工具添加了热更新、自动重启等几个非常有用的调试功能。自动重启需要Spring检测到类路径上有更改,在Spring Tool Suite中,简单的保存文件即可达到效果。如果在Intellij IDEA中,只能选择Build Project。

输出日志

Spring Boot默认使用Logback来打印日志。不过我们直接使用slf4j提供的接口就可以了。slf4j和Logback也都由Spring自动配置好了。我们只需要在属性文件中设置日志级别即可。

logging.level.yitian.study=debug

然后在代码中调用slf4j的日志接口并打印日志即可。

@Controller
public class MainController {
    private Logger logger = LoggerFactory.getLogger(MainController.class);

    @RequestMapping("/")
    public String index(@RequestParam(defaultValue = "苟") String name, Model model) {
        model.addAttribute("name", name);
        logger.debug("访问了主页");
        return "index";
    }
}

日志信息和Spring的输出格式一样。另外随着日志级别的变化,日志的颜色也会在绿、黄和红之间变化,非常方便。

2017-03-16 23:50:19.628  INFO 17220 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 4 ms
2017-03-16 23:50:19.632 ERROR 17220 --- [nio-8080-exec-1] yitian.study.controller.MainController   : 访问了主页

自定义Banner

这个Banner也是可以定制的。在类路径(也就是resource文件夹下)添加banner.txt,Banner就会使用你的文本。Banner甚至可以是一张图片,支持gif、jpg、png等格式。Spring会将图片转换成字符形式。

Servlet容器

默认情况下Spring使用Tomcat作为嵌入式容器。

端口号

端口号使用server.port设置。如果希望在运行时随机分配一个未使用的端口号,可以将端口号设置为0:server.port=0

使用Jetty

spring-boot-starter-web包默认使用Tomcat,如果我们希望使用Jetty,就需要排除Tomcat的包。使用Maven的话,这么做。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

如果使用Gradle的话,这么做。

configurations {
    compile.exclude module: "spring-boot-starter-tomcat"
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:2.0.0.BUILD-SNAPSHOT")
    compile("org.springframework.boot:spring-boot-starter-jetty:2.0.0.BUILD-SNAPSHOT")
    // ...
}

响应压缩

使用server.compression.enabled=true启用HTTP的响应压缩。默认情况下要压缩的响应体至少需要2048字节,可以使用server.compression.min-response-size修改这个值。

打包和运行

Spring Boot项目默认打包为jar文件。我们可以使用Maven或Gradle的打包命令来打包项目。打包好之后,就可以和一般jar文件一样,使用java命令来运行了。如果希望打包为war文件的话也可以,不过由于篇幅所限就不介绍了。直接看源文档吧。

系统监控(Actuator)

Actuator我没理解怎么翻译,所以凭我的感觉就叫做系统监控吧。这些功能可以帮助我们监控正在运行的Spring Boot项目。要启用监控功能,需要添加spring-boot-starter-actuator。使用Maven的话,添加下面的依赖。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

如果使用Gradle的话,添加下面的依赖。

dependencies {
    compile("org.springframework.boot:spring-boot-starter-actuator")
}

端点(Endpoints)

每个端点就是一个监控项。Spring包含了很多端点,详细列表在这里47. Endpoints。除了health之外,其余端点都属于敏感信息,在没有设置Spring Security的情况下无法访问。为了简单的在本地访问,我们可以设置management.security.enabled=false。注意该选项在生产环境中务必打开,保证服务器信息不会泄露。

端点的访问路径默认是/端点名,例如health的访问路径就是/health。比较有用的几个端点是beans(列出当前所有已注册的Spring Beans)、mappings(所有的控制器映射路径)、trace(最近100个HTTP连接的信息)、health(服务器当前的运行状态和磁盘剩余空间以及数据库的运行状态)。还有一个有趣的端点是shutdown,当我们向/shutdown发送post请求时服务器就会关闭,不过该功能是默认关闭的。

端点可以在属性文件中设置,每个端点敏感性和是否启用都是可以定制的。

endpoints.beans.sensitive=false
endpoints.shutdown.enabled=true

端点的访问也是可以定制的。

management.port=8081
management.address=127.0.0.1

。除了health之外,其余端点都属于敏感信息,在没有设置Spring Security的情况下无法访问。为了简单的在本地访问,我们可以设置management.security.enabled=false。注意该选项在生产环境中务必打开,保证服务器信息不会泄露。

端点的访问路径默认是/端点名,例如health的访问路径就是/health。比较有用的几个端点是beans(列出当前所有已注册的Spring Beans)、mappings(所有的控制器映射路径)、trace(最近100个HTTP连接的信息)、health(服务器当前的运行状态和磁盘剩余空间以及数据库的运行状态)。还有一个有趣的端点是shutdown,当我们向/shutdown发送post请求时服务器就会关闭,不过该功能是默认关闭的。

端点可以在属性文件中设置,每个端点敏感性和是否启用都是可以定制的。

endpoints.beans.sensitive=false
endpoints.shutdown.enabled=true

端点的访问也是可以定制的。

management.port=8081
management.address=127.0.0.1

好了,Spring Boot框架的介绍到此为止。我们已经基本看到了Spring Boto的使用方法。当然官方文档还有很多内容这里没有列出。这里也不可能完全列出来。如果需要更详细的介绍还是直接看官方文档吧。没有比这个更全面的了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第08章 Spring-Boot 使用简介 的相关文章

  • Gradle 构建错误:无法从 https://repo1.maven.org/maven2/io/fabric/tools/gradle/maven-metadata.xml 加载 Maven 元数据

    我在 Android studio 中遇到 gradle 构建错误 如下所示 Error A problem occurred configuring project MyApp Could not resolve all dependen
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 大数据技术之 Flink-CDC

    第1章 CDC简介 1 1 什么是 CDC CDC 是 Change Data Capture 变更数据获取 的简称 核心思想是 监测并捕获数据库的变动 包括数据或数据表的插入 更新以及删除等 将这些变更按发生的顺序完整记录下来 写入到消息
  • Java RMI 调用链与源码解析

    本篇简单说一下RMI的调用流程和攻击历史 以及分析RMI的JDK源码 对于RMI攻击的各种反序列化并不做过多的分析 关于JDK源码 详情请参考 https github com frohoff jdk8u jdk tree master s
  • Python(4)list和tuple(类似js里的数组)

    6 list list其实就是js里的数组 放置在中括号里 用逗号分隔 就是数组的元素 例如 foo 1 2 3 print foo 1 2 3 len 访问list的长度 foo 1 2 3 print len foo 3 list n
  • 二叉树层次遍历的相关应用(伪代码)

    1 层次遍历 void LevelOrder BTree t Queue Q initQueue Q EnQueue Q t while Empty Q TNode p DeQueue Q if p gt lchird EnQueue Q
  • Redis主从复制(读写分离)、哨兵(主从切换)配置

    Redis的主从复制功能非常强大 一个master可以拥有多个slave 而一个slave又可以拥有多个slave 如此下去 形成了强大的多级服务器集群架构 官网 https redis io 环境 Master root Master u
  • Java架构直通车——ThreadLocal实现RabbitMQ消息的批量发送

    文章目录 引入 什么是ThreadLocal 使用ThreadLocal 引入 之前 我们完成了单个消息的发送 以及单个消息发送的多线程池化 这里 我们继续完成批量发送消息的封装 因为rabbitMq本身是不支持批量发消息的 所以我们可以直
  • Ubuntu 20.04安装配置opencv4.2.0及踩坑

    Ubuntu 20 04安装配置opencv4 2 0及踩坑 所需各种文件链接在此 链接 https pan baidu com s 1kf cljseuUbq7MqzBg TQw 提取码 ooh2 一 在安装配置opencv之前如果没换源
  • spacemacs创建layer

    m x configuration layer create layer 选择目录 默认是private 然后命名layername 比如my 在 spacemacs文件里 增加my到layer list里 在private my pack
  • 马踏棋盘算法(骑士周游问题)

    将马随机放在国际象棋的8 8棋盘的某个方格中 马按走棋规则进行移动 要求每个方格只进入一次 走遍棋盘上全部64个方格 代码 include stdafx h include
  • HackPorts – Mac OS X 渗透测试框架与工具

    HackPorts是一个OS X 下的一个渗透框架 HackPorts是一个 超级工程 充分利用现有的代码移植工作 安全专业人员现在可以使用数以百计的渗透工具在Mac系统中 而不需要虚拟机 工具列表 0trace 3proxy Air Au
  • 调用 matlab的function函数出现未定义函数的现象

    调用 matlab的function函数出现未定义函数的现象 将matlab的默认位置 C Users Administrator Desktop 改为当前文件所在位置即可 具体参考 链接 https blog csdn net wzgl
  • 2019-12-28

    c语言 入门级别代码解一元二次方程 其实实现输入a b c解出x的值并不难 首先我们先要了解一元二次方程的解法 将步骤一步步套入程序 include
  • SpringSecurity一日干

    前后端登录校验的逻辑 完整流程 本质就是过滤器链 1 提交用户名和密码 2 将提交的信息封装Authentication对象 3 传给下一个 调用2中的authenticate方法进行验证 4 3步骤也验证不了需要调用3的authentic
  • 【计算机组成原理】总线宽度和总线带宽的区别,总线带宽的计算

    总线宽度 总线的宽度 指总线在单位时间内可以传输的数据总数 即平常说的32位 64位 总线宽度 总线位宽 数据线的根数 总线带宽 总线带宽 指总线在单位时间内可以传输的数据总数 等于总线的宽度与工作频率的乘积 通常单位 MB s MBps
  • vscode修改插件的安装的位置,从c盘转移到其他盘

    作为一个电脑非常落后的人 c盘每MB位置都很珍贵 能安装到别的盘的就尽量安装到其他盘 首先在c盘找到 vscode文件 下面的extensions文件就是插件放置的位置 将extensions里的文件全部剪切到自己定义的位置下 原来的ext
  • Quartz 体系结构

    Quartz的体系结构 Quartz的重要组件 Scheduler 用于与调度程序交互的主程序接口 Scheduler调度程序 任务执行计划表 只有安排进执行计划的任务Job 通过scheduler scheduleJob方法安排进执行计划
  • TFT-LCD显示屏工作原理图文解析

    一直很好奇手机屏幕的显示原理 这是LCD的 OLED 屏幕的与此不同 直接贴上原文链接 http www 58display com article zixun 208 html 以下是复制的原文 液晶显示器是什么 不同的应用环境 有不同的
  • C++-对四个智能指针:shared_ptr,unique_ptr,weak_ptr,auto_ptr的理解

    回答如下 C 的智能指针是一种特殊类型的 指针 其主要目的是自动跟踪内存分配和释放 以避免程序中出现内存泄露或空悬指针等问题 主要采用的技术是 借助于类的生命周期 当超出了类的作用域时 类对象会自动调用析构函数 然后就可以释放内存等资源 无
  • Mac M1安装Homebrew 简单实用

    1 首先创建安装目录 sudo mkdir p opt homebrew 2 将目录属主修改为当前用户 方便直接实用brew install sudo chown R whoami opt homebrew 3 进入 opt文件夹 cd o
  • 第08章 Spring-Boot 使用简介

    第08章 Spring Boot 简介 Spring框架功能很强大 但是就算是一个很简单的项目 我们也要配置很多东西 因此就有了Spring Boot框架 它的作用很简单 就是帮我们自动配置 Spring Boot框架的核心就是自动配置 只