博客

War 文件格式

August 12, 2020
War

WAR file (Web Application Resource or Web application ARchive)。WAR 组织文件的标准方式: WEB-INF 存储在这个文件夹内的文件,默认情况下浏览器访问不到。 web.xml Tomcat 需要 classes 所有编译的 class 文件 lib 包含项目依赖的所有的 JAR 库 tags 包含 Tag 文件 参考 Web Modules

JSP

August 11, 2020
JSP

JSP 脚本 脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的。 <% 代码片段 %> JSP 声明 <%! int i = 0; %> <%! int a, b, c; %> <%! Circle a = new Circle(2.0); %> JSP 表达式 <p> 今天的日期是: <%= (new java.util.Date()).toLocaleString()%> </p> JSP 注释 <%-- 该部分注释在网页中不会被显示--%> JSP 指令 <%@ directive attribute="value" %> 三种 directive: 指令 描述 <%@ page … %> 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等 <%@ include … %> 包含其他文件 <%@ taglib … %> 引入标签库的定义,可以是自定义标签 <%@ page import="java. ...

IBM MQ

August 10, 2020
MQ

IBM MQ 架构 IBM WebSphere MQ 架构: IBM WheSphere MQ 特性: 支持事务 具有特殊的技术防止消息重复传送,确保消息一次且仅一次传递 概念 消息 队列 本地队列:位于本地物理磁盘 远程队列:本地应用程序只能往里面放消息,不能直接读消息。只能从本地队列读取消息 传输队列:临时存储将要发送到远程队列的消息 启动队列:触发中使用的队列,触发器触发事件时,将触发器消息发送到启动队列 死信队列:存储无法正确发送到目的地的消息的队列 通道 通道:提供从一个队列管理器到另外一个队列管理器的通信路径 通道如何使用: MQSC MQSC 是用来管理队列管理器等对象的脚本命令,可以使用 runmqsc 向队列管理器发出 MQSC 命令。 MQSC 的官方命令文档:The MQSC Commands MQSC 的一些规则: 关键字不区分大小写:ALTER、alter、AlteR 都是一样的 很多命令都有同义词:例如 DEFINE CHANNEL 可以写为 def chl 用单引号引用的字符串,IBM MQ 不做转换处理 每条命令必须以新行开始 Control Commands Control Commands 的官方文档:The control commands 发送消息步骤 发送消息前,需要启动队列管理器、启动监听器(监听在某个端口)。 为了把消息从一个队列管理器发送到另一个队列管理器,您需要定义两个通道;一个是在源队列管理器(指明传输队列名、目标系统的IP:PORT),另一个是在目标队列管理器。 为把消息从一个队列管理器发送到另一个队列管理器,您需要定义六个队列;在源队列管理器需要定义四个(远程队列、启动队列、传输队列、死信队列-推荐),目标队列管理器要定义两个(本地队列、死信队列-推荐)。 编程接口 Queue Manager // declare an object of type queue manager MQQueueManager queueManager = new MQQueueManager(); MQQueueManager queueManager = new MQQueueManager("qMgrName"); . ...

Spring Boot

August 10, 2020
Spring

Spring Boot 提供了两个接口 CommandLineRunner 和 ApplicationRunner,用以当 Spring Boot 应用程序完全启动之前运行指定的代码。 CommandLineRunner @Component public class CommandLineAppStartupRunner implements CommandLineRunner { private static final Logger logger = LoggerFactory.getLogger(CommandLineAppStartupRunner.class); @Override public void run(String...args) throws Exception { logger.info("Application started with command-line arguments: {} . \n To kill this application, press Ctrl + C.", Arrays.toString(args)); } } ApplicationRunner 将参数封装为一个对象,可以调用 getOptionNames()、getOptionValues() 和 getSourceArgs() 等便捷的方法。 @Component public class AppStartupRunner implements ApplicationRunner { private static final Logger logger = LoggerFactory.getLogger(AppStartupRunner.class); @Override public void run(ApplicationArguments args) throws Exception { logger. ...

JAX-WS

August 7, 2020
JAX-WS

JAX-WS JAX-WS 代表 Java API for XML Web Service。 WebService @WebService 用来将**某个类(一个 Interface)**声明为一个 Web Service EndPoint,这个类的实现类也得需要声明 @WebService 接口类的方法必须 public,并且不能使用 static 或 final 来修饰 接口类的方法必须声明 @WebMethod 实现类必须有一个默认的 public 构造器 实现类不要定义 finalize 方法 Apache CXF 定义 Endpoint,此处的 endpointInterface 非常重要,指向的是 Interface 类全称。 @WebService(endpointInterface = "com.baeldung.cxf.introduction.Baeldung") public class BaeldungImpl implements Baeldung {} 查看 WSDL 信息 URL 后面往往跟一个 ?wsdl 字符串。 底层数据传输 GET WSDL 发送 POST 请求 接受 POST 响应 阅读更多 java 实现WebService 以及不同的调用方式、JAX-WS Web 服务开发调用和数据传输分析 ...

Oracle

August 7, 2020
Oracle

内置数据类型 分类 数据类型 介绍 字符 CHAR [(size [BYTE | CHAR])] 定长字符串,占据 n 字节 NCHAR[(size)] 定长字符串,占据 2n 字节 VARCHAR2(size) 可变长度的字符串 NVARCHAR2(size) 可变长度的 UNICODE 字符串 数值 NUMBER(p,s) p 代表精度(1 - 38),s 代表 scale (-84 - 127) FLOAT [(p)] 小数,精度不高 LONG 仅仅为了兼容 日期 DATE 大小固定占用 7 bytes TIMESTAMP 字节 RAW(size) 定长 LONG RAW 变长,图像、声音、文档、数组,建议使用 LOB LOB ROWID 伪列 SELECT ROWID from your_table; ROWID 不能被用作主键。 ...

Ant

August 6, 2020
Ant

Ant 官方教程 官方教程链接 Ant Properties 提供一些键值对,使用 ${key} 来获取其 value。官网 列举了很多内置的 properties。 Ant Classpath 定义 classpath: <project name="HelloWorld" basedir="." default="main"> <path id="classpath"> <fileset dir="${lib.dir}" includes="**/*.jar"/> </path> <target name="compile"> <mkdir dir="${classes.dir}"/> <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath"/> </target> <target name="run" depends="jar"> <java fork="true" classname="${main-class}"> <classpath> <path refid="classpath"/> <path location="${jar.dir}/${ant.project.name}.jar"/> </classpath> </java> </target> </project> Ant Targets Target 是多个 tasks 的容器,这个 Target 用来完成在整个 build 过程中的某个任务,使之达到某个状态。 <target name="A"/> <target name="B" depends="A"/> <target name="C" depends="B"/> <target name="D" depends="C,B,A"/> 调用链: ...

Struts 2

August 6, 2020
Struts

Action 访问 Servlet API 使用 ActionContext 来访问 Servlet API。 Servlet API JSP 对象 HttpServletRequest request HttpSession session ServletContext application 操作 Session: ActionContext.getContext().getSession().put("user", userName); 在 JSP 页面中可以通过 ${sessionScope.user} 来输出userName。 数据校验 ActionSupport 是一个工具类,已经实现了 Action 接口,实现了 Validatable 接口,提供数据校验功能。 @Override public void validate() { if (getUserName() == null || getUserName().trim().equals("")) { addFieldError("username", getText("user.required")); } } struts.xml 配置文件 分为多个配置文件: ...

如何维持缓存的一致性?

May 31, 2020

Phil Karlton 曾经说过,“计算机科学中只有两件困难的事情:缓存失效和命名问题。” 这句话还有其他很好的举例。我个人最喜欢 Jeff Atwood 的一句话:“计算机科学中有两件困难的事情:缓存失效、命名和一个错误就关闭。”显然,缓存是困难的。就像分布式系统中的几乎所有东西一样,它甚至可能一眼就看不清。我将介绍分布式系统中几种常见的缓存方法,这些方法应该涵盖您将使用的绝大多数缓存系统。具体来说,我将关注如何维护缓存一致性。

...

如何改进 NGINX 配置文件节省带宽?

May 24, 2020
Nginx

2014年,Admiral William H. McRaven 在得克萨斯大学发表了著名的演讲,他说,如果你想改变世界,就从整理床铺开始。有时候小事情会有很大的影响——不管是在早上整理床铺,还是对网站的HTTP服务器配置做一些更改。

...