Tomcat
未读引言在前端优化的第一部分中,主要讲解了对静态资源的一些优化措施,包括图片压缩、CSS Sprites 技术、GZIP 压缩等。这一部分,本文将讲解前端优化里重要的 Flush 机制、动静分离、HTTP 持久连接、HTTP 协议灵活应用、CDN 等。结合这些技术或思想,相信会使 Java Web 应用程序的性能更上一层楼。
Flush 机制的使用实际上在 Web 技术中,Flush 机制并不新鲜,它的思想是无需等到网页内容全部加载完毕,一次性写回客户端,而是可以部分逐次的返回。如果网页很大的话,一次性写回全部内容显然是个不明智的选择,因为这会造成网页的长时间空白。Flush 机制允许开发人员将网页的内容按文档流顺序逐步返回给客户端,这样可以使得用户知道我们的系统正在工作,只是等待的时间稍长而已,这样用户也会“心甘情愿”的等下去。Flush 机制是一个经典的提高用户体验的方法,至今也一直在用。如果网页很大,这个机制也是建议使用的。在 Java Web 技术中,实现 Flush 非常简单,只要调用 HttpServletResponse.getWriter 输出流的 flush 方法,就可以 ...
Java设计模式—抽象工厂模式一、抽象工厂模式概述(一)定义抽象工厂模式属于创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,并且无需指定这些对象的具体类。这种模式在创建对象时,将对象的创建和使用分离开来,使得系统在创建对象时具有更高的灵活性和可维护性。
(二)适用场景
当系统需要创建一系列相关或相互依赖的对象时,例如在一个游戏开发中,需要创建游戏角色、武器、道具等一系列相关对象,并且这些对象的创建过程较为复杂,相互之间存在一定的关联关系,抽象工厂模式可以很好地组织和管理这些对象的创建过程。
当系统希望与具体的产品实现解耦,即不希望系统代码依赖于产品的具体类,而是依赖于抽象产品接口时,抽象工厂模式可以通过抽象工厂和抽象产品接口来实现这种解耦,使得系统更容易进行扩展和维护。
(三)角色构成
抽象工厂角色(AbstractFactory)
这是抽象工厂模式的核心角色,它声明了一系列创建产品对象的抽象方法。这些方法通常返回抽象产品类型,例如在一个图形绘制系统中,抽象工厂可能定义创建抽象图形(如抽象圆形、抽象矩形等)的方法。
抽象工厂角色不负责创建具体的产品对象,而是将这个任务 ...
在上一篇文章中介绍了Java 字节代码的操纵,其中提到了利用Java 类加载器来加载修改过后的字节代码并在JVM 上执行。本文接着上一篇的话题,讨论Java 类的加载、链接和初始化。Java 字节代码的表现形式是字节数组(byte[]),而Java 类在JVM 中的表现形式是 java.lang.Class 类的对象。一个 Java 类从字节代码到能够在 JVM 中被使用,需要经过加载、链接和初始化这三个步骤。这三个步骤中,对开发人员直接可见的是 Java 类的加载,通过使用 Java 类加载器(class loader)可以在运行时刻动态的加载一个 Java 类;而链接和初始化则是在使用 Java 类之前会发生的动作。本文会详细介绍 Java 类的加载、链接和初始化的过程。
Java 类的加载Java 类的加载是由类加载器来完成的。一般来说,类加载器分成两类:启动类加载器(bootstrap)和用户自定义的类加载器(user-defined)。两者的区别在于启动类加载器是由 JVM 的原生代码实现的,而用户自定义的类加载器都继承自 Java 中的 java.lang.ClassLoa ...
java
未读前言在使用 Java 开发客户端程序时,有时会需要在界面中使用网页浏览器组件,用来显示一段 HTML 或者一个特定的网址。本文将介绍在界面中使用浏览器组件的四种方法,给出示例的代码,并且分析每种方法的优点与不足,便于 Java 开发者在实际开发过程中根据自己的需要来选择。
JDK 中的实现 - JEditorPaneSwing 是一个用于开发 Java 应用程序图形化用户界面的工具包,它是以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格,而且它是轻量级(light-weight)组件,没有本地代码,不依赖于操作系统的支持,这是它与 AWT 组件的最大的区别。
在 Swing 中,有一个组件是 JEditorPane,它是一个可以编辑任意内容的文本组件。这个类使用了 EditorKit 来实现其操作,对于给予它的各种内容,它能有效地将其类型变换为适当的文本编辑器种类。该编辑器在任意给定时间的内容类型由当前已经安装的 EditorKit 来确定。
默认情况下,JEditorPane 支持以下的内容类型:
text/plain
纯文本的内容,在此情况下 ...
多线程-并发
未读Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己。
一、Java中断的现象首先,看看Thread类里的几个方法:
public static boolean interrupted测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)boolean isInterrupted ()测试线程是否已经中断。线程的中断状态 不受该方法的影响。public void interrupt ()中断线程。
上面列出了与中断有关的几个方法及其行为,可以看到interrupt是中断线程。如果不了解Java的中断机制,这样的一种解释极容易造成误解,认为调用了线程的interrupt方法就一定会中断线程。
其实,Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求 ...
jvm
未读字节码指令集
Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码(Opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(Operands)所构成。
对于大部分为与数据类型相关的字节码指令,他们的操作码助记符中都有特殊的字符来表明专门为哪种数据类型服务:i代表对int类型的数据操作,l代表long,s代表short,b代表byte,c代表char,f代表float,d代表double,a代表reference。
加载和存储指令:
将一个局部变量加载到操作栈的指令包括有:iload、iload_、lload、lload_、fload、fload_、dload、dload_、aload、aload_将一个数值从操作数栈存储到局部变量表的指令包括有:istore、istore_、lstore、lstore_、fstore、fstore_、dstore、dstore_、astore、astore_将一个常量加载到操作数栈的指令包括有:bipush、sipush、ldc、ldc_w、ldc2_w、aconst_null、iconst_m1、iconst_、l ...
在上一篇文章中,我介绍了新的Servlet 3,这是Spring MVC 3.2的新特性——异步支持——的运行环境。第二种使用异步处理的非常主要的原因是使浏览器接受信息的实时更新。例如网页聊天室、股票报价、状态更新、体育赛事直播等。虽然这些应用对于信息延迟的敏感度不同,但是它们的功能需求是类似的。
在标准的HTTP的“请求—响应”语义中,浏览器发出一个请求,服务器端响应一个请求,这就意味着直到浏览器发送请求,服务器才能够返回更新信息。要想实时获取服务器的更新信息,当前有很多种方法可以实现,例如传统轮询、长轮询、HTTP流和最近兴起的WebSocket协议。
传统轮询: 传统轮询采用浏览器不断发送请求,而服务器在收到请求后立即返回信息的方式进行。这种方式适合发送请求较少的情况下使用(请求发送过多服务器就崩溃了)。例如邮箱客户端可以每十分钟检查一次是否有新邮件到来。这种方式简单有效。但是如果需要信息实时反馈给客户端时,请求的发送就非常频繁,这种方式的实现效率就会大大降低。
长轮询: 长轮询中浏览器不断发送请求,而服务器只在有新信息 ...
摘要WWW是互联网上最受欢迎的应用之一,其快速增长导致网络拥塞和服务器超载,缓存技术被认为是减轻服务器负载、降低网络拥塞,减少客户访问延迟的有效途径之一。本文首先描述了Web缓存系统的基本要素及理想属性,然后介绍目前围绕Web缓存技术已经开展的研究,最后讨论Web缓存技术需要进一步研究的问题。
关键字WWW缓存技术代理
1引言
WWW是互联网上最受欢迎的应用之一,其快速增长造成网络拥塞和服务器超载,导致客户访问延迟增大,WWW服务质量问题日益显现出来。缓存技术被认为是减轻服务器负载、降低网络拥塞、增强WWW可扩展性的有效途径之一,其基本思想是利用客户访问的时间局部性(Temporal Locality)原理,将客户访问过的内容在Cache中存放一个副本,当该内容下次被访问时,不必连接到驻留网站,而是由Cache中保留的副本提供。
Web内容可以缓存在客户端、代理服务器以及服务器端。研究表明,缓存技术可以显著地提高WWW性能[1][2],它可以带来以下好处:
(1)减少网络流量,从而减轻网络拥塞;
(2)降低客户访问延迟,其主要原因有:①缓存在代理服务器中的内容,客户可以直接从代理获取而 ...
一. 前言(Introduction)时光如梭,转眼之间,几年时间就像做梦一样无声无息的逝去!回顾一下,发现2013年是我人生新的起点,因为终于和相恋将近七年的老婆结婚了,为此我在个人博客上发表了一篇文章简单回顾最近的几年,原本只是希望能回顾自己的得失,做一个简单的总结,没想到有那么多朋友能看到并祝福,在此表示感谢。
前段时间一直很忙,忙着项目的进度、忙着项目重构以及代码的优化、忙着应付用户需求的变化等等, 现在终于闲下来了!趁着闲下来的几天时间,想写点什么,却不知道怎么下笔。突然想起最近老婆在新加坡找工作和学习英语的点点滴滴,似乎有一些灵感,不如接下来写一些个人学习英语的切身体会,也好给各位同仁一些参考,同时也可以和大家一起学习交流。
顺便提一下,很多人发邮件问我新加坡怎么样,我的回答:新加坡是一座很漂亮的城市,如果你有机会来旅游、工作、学习或者生活,这里也是一个很不错的选择:
更多图片,请参考:
缅怀三年——炫丽的新加坡(上)
缅怀三年——炫丽的新加坡(下)
新加坡和其他世界都市一样,一则带有国际大都市繁华和忙碌,同时也带有花园城市的艳丽和宁静;仔细享受其中的工作、学习和生 ...
许多应用程序都要求动态生成 PDF 文档。这些应用程序涵盖从生成客户对帐单并通过电子邮件交付的银行到购买特定的图书章节并以 PDF 格式接收这些图书章节的读者。这个列表不胜枚举。在本文中,我们将使用 iText Java 库生成 PDF 文档。我们将向您演示一个样例应用程序,以便您可自行完成它并能更好地理解它。
熟悉 iText V5.3.0 版iText 是一个可从 http://itextpdf.com/ 免费获取的 Java 库(请参见 参考资料)。iText 库非常强大,且支持生成 HTML、RTF 和 XML 文档,还支持生成 PDF 文档。您可以选择各种各样的字体来用于文档中。另外,iText 的结构允许您使用相同代码生成上面提及的任何类型的文档。
iText 库包含使用各种字体生成 PDF 文本、在 PDF 文档中生成表格、向页面中添加水印等的类。iText 还提供了其他许多特性。在一篇文章中无法演示所有这些特性。我们将介绍生成 PDF 所需的基本知识。有关更多详细信息,请参阅供应商提供的文档(参见 参考资料)。
我们将使用 Eclipse 开发我们的样例应用程序。作为一 ...

