Java中常用的模板技术

在进行web开发时,对数据进行展示是非常重要的一个环节。在基于Java开发的网站中,JSP技术是最为常见的视图展示技术。由于JSP技术是官方推荐的视图展示技术,文档相对比较丰富,所以本文不会对JSP技术进行介绍。 虽然JSP是官方推荐的视图展示技术,但是JSP依然存在一些不太尽如人意的缺点。比如,JSP中可以直接写Java代码,这使得业务逻辑和前端展示没有完全分开,这样在后期维护时将会非常麻烦。而且,如果想要在JSP中完全不使用Java代码,开发人员需要进行自定义标签的编写,这就无形中增加了开发人员的工作压力。 本文主要介绍常用的两种模板技术——即velocity和XSLT技术。velocity使用上跟JSP具有很大的相似性,但是velocity中不允许出现任何Java代码,实现了界面和Java代码真正意义上的分离。velocity和JSP,FreeMarker并称为三大视图展示技术。XSLT主要是用来对xml进行展示的一种技术,常见的比如将xml转换为html进行展示, »

TCP粘包,拆包及解决方法

在进行Java NIO学习时,发现,如果客户端连续不断的向服务端发送数据包时,服务端接收的数据会出现两个数据包粘在一起的情况,这就是TCP协议中经常会遇到的粘包以及拆包的问题。 我们都知道TCP属于传输层的协议,传输层除了有TCP协议外还有UDP协议。那么UDP是否会发生粘包或拆包的现象呢?答案是不会。UDP是基于报文发送的,从UDP的帧结构可以看出,在UDP首部采用了16bit来指示UDP数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题。而TCP是基于字节流的,虽然应用层和TCP传输层之间的数据交互是大小不等的数据块,但是TCP把这些数据块仅仅看成一连串无结构的字节流,没有边界;另外从TCP的帧结构也可以看出,在TCP的首部没有表示数据长度的字段,基于上面两点,在使用TCP传输数据时,才有粘包或者拆包现象发生的可能。 粘包、拆包表现形式 »

Java中BIO,NIO和AIO使用样例

上文中分析了阻塞,非阻塞,同步和异步概念上的区别以及各种IO模型的操作流程,本篇文章将主要介绍Java中BIO,NIO和AIO三种IO模型如何使用。需要注意的是,本文中所提到的所有样例都是在一个server对应一个client的情况下工作的,如果你想扩展为一个server服务多个client,那么代码需要做相应的修改才能使用。另外,本文只会讲解server端如何处理,客户端的操作流程可以仿照服务端进行编程,大同小异。文章最后给出了源码的下载地址。 BIO(Blocking I/O) 在Java中,BIO是基于流的,这个流包括字节流或者字符流,但是细心的同学可能会发现基本上所有的流都是单向的,要么只读,要么只写。在实际上编程时,在对IO操作之前, »

ThreadLocal基本使用方法

当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。 从线程的角度看,目标变量就象是线程的本地变量,这也是类名中Local所要表达的意思。 所以,在Java中编写线程局部变量的代码相对来说要笨拙一些,因此造成线程局部变量没有在Java开发者中得到很好的普及。 ThreadLocal的接口方法 ThreadLocal类接口很简单,只有4个方法,我们先来了解一下: // 设置当前线程的线程局部变量的值。 void set(Object value); // 该方法返回当前线程所对应的线程局部变量。 public Object get(); // 将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK »

Java动态代理模式

代理模式的定义,为其他对象提供一种代理以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制目标对象的访问,并且可以在不改变目标对象的情况下添加一些额外的功能。代理模式分为静态代理模式和动态代理模式。静态代理维护难度大,可扩展性较差,这是因为代理的功能在编译期就已经决定,如果代理发生在运行时期,就会灵活很多。动态代理模式可以很好的解决这个问题。 动态代理有两种实现方式,JDK提供的反射机制和CGLIB JDK反射机制 采用JDK反射机制,运用JDK1.3之后提供的Proxy和InvocationHandler两个接口,来实现运行时代理功能。核心代码如下: public class MyInvocationHandler implements InvocationHandler { private »