![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
一些关于Java的文章
穷目楼
白日依山尽,黄河入海流。欲穷千里目,更上一层楼。
展开
-
Java实现删除目录
Java文件处理传统的API是java.io.File这是一个在Java早起就一直有的API。从Java7开始,Java引入了另一套新的API来处理文件。java.nio.file.Files;java.nio.file.Path;java.nio.file.Paths;但无论是File的删除方法File.delete();还是Files的删除方法Files.delete(path);都只能用于删除文件或空目录,如果目录不为空则会抛出异常。为了实现非空目录的删除,需要遍历目录原创 2020-08-13 15:31:04 · 604 阅读 · 2 评论 -
Spring限定性依赖注入-@Primary @Qualifier
Spring自动匹配Bean注入的机制在有多个可选的Bean存在时是不可用的,需要进一步进行相关配置明确消除多个可选Bean存在的歧义性。基于Java注解的注入可通过@Primary 或@Qualify完成。@Primary注解符合@Autowired连接的候选bean有多个,如果依赖注入只需要一个bean, 在只有其中一个bean声明了@Primary的情况下,该bean将会被注入。@Co...原创 2020-04-30 14:45:55 · 448 阅读 · 0 评论 -
Java I/0流的概念
流(stream)代表了来自某个输入源,或者将要流向某个输出源的一系列数据。按流向,可以分为输入流和输出流。输入流(input stream)通过输入流,数据流入程序,程序读取输入流中的数据。输出流(output stream)通过输出流,数据流出程序,程序写输出流中的数据到数据的接收端。按对数据的处理方式,在比较抽象的层次上可以分为字节流(byte stream)和字符流(...原创 2020-04-28 15:02:25 · 256 阅读 · 0 评论 -
Java Servlet环境中获取完整的客户端请求地址
客户端请求服务的地址中除了基本的协议,主机,端口信息外,还可能包含查询串,若想获取完整的请求地址,则需要考虑到存在查询串的可能性。一个获取完整客户端请求地址的方法:public static String getFullURL(HttpServletRequest request) { StringBuffer requestURL = request.getRequestURL();...原创 2020-04-24 10:27:24 · 391 阅读 · 0 评论 -
Spring Xml配置中Bean的引用
Spring最早支持的配置方式是Java系技术很传统的Xml配置方式,通过Xml可以配置bean的声明,引用。如果bean之间有引用,Spring的<property>标签的的ref属性可以用来表达这种引用关系<bean class="com.me.Hello"> <property name="who" ref="people" /></be...原创 2020-03-31 10:01:54 · 742 阅读 · 0 评论 -
RestTemplate访问RESTful服务
Spring本身提供了访问RESTFul服务的的工具RestTemplate,在Spring Android项目中也提供了该工具。正如其名所示,其概念上和JdbcTemplate, JmsTemplate类似,虽然RestTemplate看似主要在于和遵循RESTful架构的服务交互,但是其实RestTemplate可以作为一个通用的http访问工具使用。RestTemplate 的底层默认使用...原创 2020-03-31 09:55:48 · 169 阅读 · 0 评论 -
Spring Security的Servlet集成
Spring Security 对 Servlet API 提供了一些集成支持。Servlet 2.5+获取当前用户的username,对其进行null检查可以得知用户是否通过认证。HttpServletRequest.getRemoteUser()等价于SecurityContextHolder.getContext().getAuthentication().getName()...原创 2020-03-30 16:39:18 · 333 阅读 · 0 评论 -
利用Maven的War Overlays实现War包资源共享
Maven War plugin提供了overlays功能,overlays提供了多个web应用程序共享资源的途径。通过overlays,可以通过包依赖实现个性化定制开发,而不是直接在已有成熟软件的源码下进行个性化定制开发。overlays 样例假设当前正在构建的项目documentedproject有如下结构 |-- pom.xml `-- src `-- main ...原创 2020-03-27 16:58:52 · 1167 阅读 · 0 评论 -
服务提供者接口(SPI)
SPI的概念在一些文章里经常能遇见,SPI(Service Provider Interface)顾名思义即服务提供者接口,其是一组将被服务提供方(第三方)实现,扩展的应用程序接口(API),服务提供方通过实现SPI实现具体服务。SPI本身是一个一般化的概念,可以应用于不同的平台中。Java平台中,一项服务定义了一组已知的接口和(abstract)类,服务提供者实现,扩展了定义在服务本身内的接...原创 2020-03-25 10:02:39 · 692 阅读 · 0 评论 -
配置枚举类型在Jackson中的序列化方式
枚举类型public enum Type { TYPE1(1, "Type A"), TYPE2(2, "Type 2"); private Integer id; private String name; private Type(final Integer id, final String name) { this.id = id; ...原创 2020-03-25 09:54:49 · 3036 阅读 · 0 评论 -
面向切面编程AOP
面向切面编程(Aspect-Oriented Programming-AOP)以另一种对程序结构的思考方式对面向对象做了补充。AOP中模块化的核心单元为切面(Aspect),Aspect使程序的关注点(事物,日志,认证,消息发送…)模块化。基本概念切面 (Aspect)横切多个方面(类,对象)的关注点模块连接点(Join point)程序执行过程的某一点(异常处理,方法执行…)增强(...原创 2020-03-24 11:07:54 · 87 阅读 · 0 评论 -
利用Axis访问rpc/encorded风格的Web Service
Soap 基于的Web Service在演化,实现其的技术栈也在随之变化。Java领域出现了许多了Web Service相关的技术,从早期的Apache Axis,xfire到今天的Apache Axis2, Apache CXF, Metro,Spring WS。Java对Soap Web Service在早期提出了JAX-RPC的模型,今天JAX-RPC则被JAX-WS代替,这也体现了业界正在...原创 2020-03-23 10:16:13 · 201 阅读 · 0 评论 -
同时使用Spring Data Jpa与Spring Data MongoDB
Spring Data Jpa 提供了Jpa存储的支持,而Spring data MongoDB则提供了MongoDB的抽象,有时候会有跨结构的存储需要,需要同时使用这两种存储技术。当同时使用两者的时候,由于其提供的Repository都是基于Spring Data Common的,所以两种存储方案的Repository声明可能很像,都是继承自PagingAndSortingRepository...原创 2020-03-21 22:15:12 · 1234 阅读 · 1 评论 -
Java由于生成随机内容被阻塞
VM环境下的Linux平台上,Java程序启动速度可能会很慢,表现为启动过程中日志突然停止输出,暂停执行。根据具体的环境,可能稍等会儿后,一切恢复正常,日志开始继续输出,程序继续执行,也可能等待很长的时间也没有结果。导致该问题的原因是Java程序对Linux平台/dev/random的调用,该调用为阻塞调用,所以如果没有足够的entropy让该调用返回,Java程序将会一直wait。解决方法:...原创 2020-03-21 22:02:28 · 212 阅读 · 0 评论 -
Java Servlet环境中获取客户端IP
由于用户可能采用了代理,或者服务器处于负载均衡的环境下,只调用HttpServletRequest.getRemoteAddr()得到的地址不一定是想要的数据。某些代理会在HTTP请求中加入一些头信息,通过这些头信息可以获取到客户端原始的IP地址。一种考虑了有代理存在的情况的获取客户端IP的方法:private static final String[] HEADERS_TO_TRY = { ...原创 2020-03-21 21:36:50 · 516 阅读 · 0 评论 -
用zt-zip Java库进行zip文件处理
Java 标准库本身自带java.util.zip包,利用该包可以解决zip文件的处理问题。但是该包提供的功能相对底层,想要实现zip文件的处理,需要写一 些代码,该包并没有封装API到调用一个方法就实现了压缩或者解压功能的层次。zt-zip库提供了这种上层的封装,只需要调用一个方法,可以很方便的实 现zip压缩与解压,zt-zip在底层也利用了java.util.zip包。maven中央仓库里...原创 2020-03-16 11:27:42 · 2456 阅读 · 3 评论 -
使用Apache Commons IO实现文件系统监听服务
Apache Commos IO中的org.apache.commons.io.monitor包提供了文件系统监听的功能。以FileAlterationObserver为核心,配合FileAlterationListener,FileAlterationMonitor,可以实现对文件系统的事件监听。创建事件监听的过程大体如下:创建FileAlterationListener实现对文件与目录的...原创 2020-03-13 11:40:51 · 1656 阅读 · 0 评论 -
Ubuntu通过apt-get安装Java
Java有许多实现,最常见的两种是OpenJdk和Oracle Jdk。OpenJDK安装OpenJDK是最简单的提供Java环境的方式。每个Ubuntu版本都有默认的OpenJDK版本可以直接安装。12.04上是OpenJDK6,14.04上是OpenJDK7, 16.04上是OpenJDK8。更新sudo apt-get update安装默认JREsudo apt-get install def原创 2017-02-10 23:01:17 · 527 阅读 · 0 评论 -
FreeMaker 宏(macro)与自定义指令
宏(macro)是自定义指令(directive)的一种方法,使用宏能实现在模版级别自定义指令,另一种自定义指令的方式是再Java级别实现指令。宏的概念宏是对一段模版片段的定义,在定义宏后,可通过用户自定义指令的语法<@ macro_name />引用,宏本身通过<#macro></#macro>预定义指令定义。<#macro hello> ...原创 2019-12-21 10:49:56 · 498 阅读 · 0 评论 -
JShell 基础
JShellJava9 引入了JShell, JShell是一种交互式的Java REPL(Read-Evaluate-Print-Loop)环境。JShell的引入让Java也能被即写即用,给人一种解释执行的感觉。启动jshell从jshell里退出jshell> /exit代码片段jshell里面输入的表达式,变量,类声明等语句统称为片段。jshell> int...原创 2019-12-01 23:03:52 · 159 阅读 · 0 评论 -
RedHat系Linux指定默认的Java版本
在一个系统环境中安装有多个版本的Java是一个比较普遍的现象。比如有历史程序运行在Java1.6上,部署的Hadoop套件运行在Java1.8上,因为其他目的需要使用Jshell,又需要使用Java9。在任何特定的时间,在终端中输入java -version只可能指向其中的一个Java版本。完全人工去维护java的指向是一件麻烦的事情,工具alternatives协助解决了这个问题。a...原创 2019-11-29 22:29:35 · 628 阅读 · 0 评论 -
Maven 镜像的设置
Maven中央库的下载速度较慢,可以通过配置镜像库的方式非常方便地切换到更快的下载源。配置镜像库的配种是在Maven的配置文件settings.xml进行的,可以分为全局和用户两个层面配置,全局配置一般位于:${maven.conf}/settings.xml用户配置一般位于:${user.home}/.m2/settings.xml在settings.xml中找到<mirr...原创 2019-11-21 22:03:37 · 143 阅读 · 0 评论 -
java.lang.Object对象equals()和hashCode()
java.lang.Object对象equals()和hashCode()之间是有一定的契约关系的。Java doc如此描述hashCode():The general contract of hashCode is:Whenever it is invoked on the same object more than once during an execution of a Java a...原创 2019-11-12 22:34:51 · 120 阅读 · 0 评论 -
SLF4J日志框架
SLF4J是JAVA生态里面的一个日志门面,可APACHE JAKARTA COMMONs LOGGING(JCL)类似,门面抽象了底层的日志实现,是较新的日志技术的一种模式,API层面尽可能使用门面的API,减少直接对底层具体实现的依赖,便于切换底层的日志实现。SLF4J和JCL除了API方面的差异外,另一个主要的不同点在于和具体日志实现绑定的时候,SLF4J没采用类加载器的机制,采用的是编译...原创 2019-10-23 10:09:48 · 95 阅读 · 0 评论 -
Thymeleaf中的迭代
Thymleaf中用th:each属性实现迭代操作。 <tr th:each="prod : ${prods}"> <td th:text="${prod.name}">Onions</td> <td th:text="${prod.price}">2.41</td> <td th:text="${prod.inStock}? #{true} : #{原创 2017-03-16 23:19:31 · 9044 阅读 · 0 评论 -
Thymeleaf条件判断
th:ifth:if属性求Bool值,只有true的时候其所在的标签及该标签中的内容才会被渲染到输出结果中<a href="comments.html" th:href="@{/product/comments(prodId=${prod.id})}" th:if="${not #lists.isEmpty(prod.comments)}">view</a>th:if=“express原创 2017-03-12 22:30:08 · 33631 阅读 · 0 评论 -
Thymeleaf属性优先级
同计算机语言中各种操作符有优先级一样,类似的当同一个标签中有多个th:*属性时,Thymleaf在处理这些属性时也有优先级的问题。<ul> <li th:each="item : ${items}" th:text="${item.description}">Item description here...</li></ul>Thymleaf中定义的属性优先级,从上到下优先级越来越低 Or原创 2017-03-09 21:43:48 · 682 阅读 · 0 评论 -
Debain系Linux管理多个Java版本
如果存在多个Java版本被安装,则可能需要配置默认的使用版本,否则可能会出现使用错误版本的情况。比较常见的多版本情况是有多个OpenJDK版本,以及同时有Oracle JDK和OpenJDK被安装。配置默认使用的Javasudo update-alternatives --config java系统提示已安装的Java可供选择There are 2 choices for the alternati原创 2017-03-07 22:16:44 · 1288 阅读 · 0 评论 -
Java 7 try-with-resources自动关闭资源
Java 7开始,提供了一种新的语法try-with-resources用于在资源使用完毕后自动关闭资源,和python中的with语句类似。“资源”指的是实现了java.lang.AutoCloseable的任意对象,因为java.io.Closeable是AutoCloseable的子接口,所以实现了Closeable的对象也可以用于该语法。从文件中读取第一行,无论try{}中的代码块是正常结束原创 2017-03-03 23:20:05 · 1579 阅读 · 0 评论 -
Maven resources plugin 损坏二进制数据
Maven resources plugin在执行资源处理的时候,如果处理的资源存在二进制形式的数据,同时filtering选项被打开,则会出现二进制文件损坏的情况,比如导致字体文件被顺坏,渲染端不能正确解析字体文件。对此,Maven官方文档有说: Warning: Do not filter files with binary content like images! This will mo原创 2017-02-28 22:33:02 · 2354 阅读 · 0 评论 -
用YAJWS创建Windows上的Java服务
Unix上部署Java时常把其作为Daemon部署,Windows有时候也有这个需求,把Java作为Windows上面的Service有许多现存的方案可选,也可以自己直接针对Windows Service API做。YAJWS是一个易用的把普通Java程序Daemon化的工具,其对支持Unix和Windows。官方给的一个和其他方案的功能对比 通过脚本的方式,可以在不用改动原始程序代码的情况下,包原创 2017-02-26 21:03:16 · 1031 阅读 · 0 评论 -
Thymeleaf在属性头部与尾部附加值
Thymeleaf支持在属性的头部和尾部,在原有值的基础上附加新的值,而不仅仅是重新设置整个值。与th:attr对应,有头部附加属性th:attrprepend和尾部附加属性th:attrappend。<input type="button" value="Do it!" class="btn" th:attrappend="class=${' ' + cssStyle}" />当cssStyle为原创 2017-02-21 21:42:18 · 1908 阅读 · 0 评论 -
Thymeleaf中用HTML5语法设置标签和属性
Thymeleaf支持HTML5的 “data-{prefix}-{name}” 语法作为使用th命名空间前缀设置属性的代替。<table> <tr data-th-each="user : ${users}"> <td data-th-text="${user.login}">...</td> <td data-th-text="${user.name}">原创 2017-02-21 21:39:37 · 2543 阅读 · 0 评论 -
Thymeleaf一次性设置多个属性为相同值
Thymeleaf提供了两个特殊的属性用于一次性设置多个属性为相同的值:th:alt-title和th:lang-xmllang。 按名字即可知道 th:alt-title 设置 alt 和title. th:lang-xmllang 设置 lang 和 xml:lang.<img src="../../images/gtvglogo.png" th:attr="src=@{/im原创 2017-02-21 21:37:05 · 1218 阅读 · 0 评论 -
Thymeleaf设置固定值属性
一些属性的值比较特殊,要么该属性不出现在标签中,要么以固定的内容作为值出现,比如checked,的值只应该是“checked”,其他属性readonly, selected等也有类似的情况。Thymeleaf提供了与这些属性对应的th:*属性,其值作为一个条件被求值,求值如果为true,该属性被设置为对应的固定值,否则该属性将不会被赋值。<input type="checkbox" name="ac原创 2017-02-21 21:34:20 · 1356 阅读 · 0 评论 -
Thymeleaf设置特定属性
Thymeleaf除了有th:attr这种通用的设置属性的方法外,提供了th:*语法设置特定的属性,*为标准属性的属性名。<input type="submit" value="Subscribe me!" th:value="#{subscribe.submit}"/><form action="subscribe.html" th:action="@{/subscribe}"><li><a原创 2017-02-21 21:30:42 · 744 阅读 · 0 评论 -
Thymeleaf设置任意属性
Thymeleaf通过th:attr属性,可以设置任意的html属性。<form action="subscribe.html" th:attr="action=@{/subscribe}"> <fieldset> <input type="text" name="email" /> <input type="submit" value="Subscribe me!" th:at原创 2017-02-21 21:17:54 · 6200 阅读 · 0 评论 -
Thymeleaf条件表达式和默认表达式
条件表达式条件表达式condition?then:else根据conditon的值,只会有then,else中的一个表达式被求值。conditon为true->then, condition为false->else。<tr th:class="${row.even}? 'even' : 'odd'"> ...</tr>其中条件表达式的三个部分`condition?then:else`本身都是表原创 2017-02-16 22:47:55 · 2997 阅读 · 0 评论 -
Thymeleaf的算术操作和比较操作
算术操作Thymeleaf标准表达式引擎支持算术操作符:+, -, *, /(div), %(mod)th:with="isEven=(${prodStat.count} % 2 == 0)"也可以把算术操作符写在变量表达式中th:with="isEven=${prodStat.count % 2 == 0}"此时,表达式的解析实际上是由OGNL/SpringEL完成的比较操作Thymeleaf支持原创 2017-02-16 22:42:02 · 10340 阅读 · 0 评论 -
Maven resources的include和exclude
Maven resources plugin支持明确声明<directory>指定的资源目录中哪些资源需要处理,哪些资源可以不被处理。<include>指明需要包括的资源,位于src/my-resources中的任何txt和rtf文件(包括子目录)都会被处理 <project> ... <name>My Resources Plugin Practice Project原创 2017-02-13 11:55:51 · 12011 阅读 · 1 评论