`

仿mina filter示例

    博客分类:
  • mina
阅读更多

关于filter,基本上都是通过cor模式来实例的,著名的servlet filter。

对于cor模式,Chain of Responsibility 模式    cor改进 说得很清楚了。

现在根据mina的filter实现,写小个示例,演示下mina的cor实现。其实mina的filter更加像是个双向链表。基于常见 的cor模式是有点诡异了[mina指南]诡 异的 IoFilterChain实现

 

所有代码都是基于接口编程。

Filter接口

package minacor;

public interface Filter {
	void messageReceived(NextFilter nextFilter,Object message);

	public interface NextFilter {
		void messageReceived(Object message);
	}
}

FilterChain接口,这只有一个简单方法,mina中还有更多方法

package minacor;

public interface FilterChain {
	/**
	 * 在filter chain尾部加个filter
	 * @param filter
	 */
	void addLast(Filter filter);
}

Request接口

package minacor;

/**
 * 请求类
 * Request.java 2010-3-1 下午09:41:42
 * @Description:
 *
 * @author <a href="www.java1995.cn">Xingsheng.Zhu@gmail.com</a>
 * @version 2.6
 */
public interface Request {
	/**
	 * 请求真正业务执行
	 * @param message
	 */
	public void execute(Object message);
	/**
	 * 得到请求数据
	 * @return
	 */
	public Object getMessage();
}

FilterChain的默认实现

package minacor;

import minacor.Filter.NextFilter;
/**
 * 
 * DefaultFilterChain.java 2010-3-1 下午09:46:03
 * @Description:FilterChain默认实现
 *
 * @author <a href="www.java1995.cn">Xingsheng.Zhu@gmail.com</a>
 * @version 2.6
 */
public class DefaultFilterChain implements FilterChain {
	//chain上的第一个实体,相当于链表的第一个节点
	private Entry head;
	//chain上的最后一个实体,相当于链表最后一个节点
	private Entry tail;

	private Request request;

	public Request getRequest() {
		return request;
	}

	public void setRequest(Request request) {
		this.request = request;
	}

	public DefaultFilterChain() {
		this.head = new Entry(null, null, new HeadFilter());
		this.tail = new Entry(head, null, new TailFilter());
		head.nextEntry = tail;
	}

	@Override
	public void addLast(Filter filter) {
		register(tail.prevEntry, filter);
	}

	private void register(Entry prevEntry, Filter filter) {
		Entry newEntry = new Entry(prevEntry, prevEntry.nextEntry, filter);
		prevEntry.nextEntry.prevEntry = newEntry;
		prevEntry.nextEntry = newEntry;
	}
	
	/**
	 * 
	 *实体类,相当于链表上的节点,节点中包括了上一个节点与下一个节点
	 *以及真实数据,也就是Filter
	 */
	private class Entry {

		private Entry prevEntry;
		private Entry nextEntry;
		private Filter filter;
		private final NextFilter nextFilter;

		public Entry(Entry prevEntry, Entry nextEntry, Filter filter) {
			this.prevEntry = prevEntry;
			this.nextEntry = nextEntry;
			this.filter = filter;

			this.nextFilter = new NextFilter() {

				@Override
				public void messageReceived(Object message) {
					Entry nextEntry = Entry.this.nextEntry;
					callNextMessageReceived(nextEntry, message);

				}

			};
		}

		public Entry getPrevEntry() {
			return prevEntry;
		}

		public void setPrevEntry(Entry prevEntry) {
			this.prevEntry = prevEntry;
		}

		public Entry getNextEntry() {
			return nextEntry;
		}

		public void setNextEntry(Entry nextEntry) {
			this.nextEntry = nextEntry;
		}

		public Filter getFilter() {
			return filter;
		}

		public void setFilter(Filter filter) {
			this.filter = filter;
		}

		public NextFilter getNextFilter() {
			return nextFilter;
		}

	}

	public void fireMessageReceived(Object message) {
		Entry head = this.head;

		callNextMessageReceived(head, message);
	}

	private void callNextMessageReceived(Entry entry, Object message) {
		System.out.println("call next");
		Filter filter = entry.getFilter();

		NextFilter nextFilter = entry.getNextFilter();

		filter.messageReceived(nextFilter, message);

	}

	private class HeadFilter implements Filter {

		@Override
		public void messageReceived(NextFilter nextFilter, Object message) {
			nextFilter.messageReceived(message);
		}

	}

	private class TailFilter implements Filter {

		@Override
		public void messageReceived(NextFilter nextFilter, Object message) {
			request.execute(message);
		}

	}

}

 

package minacor;
/**
 * Filter的一个简单实现
 * DemoFilter.java 2010-3-1 下午09:50:47
 * @Description:
 *
 * @author <a href="www.java1995.cn">Xingsheng.Zhu@gmail.com</a>
 * @version 2.6
 */
public class DemoFilter implements Filter{

	@Override
	public void messageReceived(NextFilter nextFilter,Object message) {
		message = message.toString()+" demofilter ";
		nextFilter.messageReceived(message);
	}

}

 

package minacor;
/**
 * Request的一个简单实现
 * PrintRequest.java 2010-3-1 下午09:53:50
 * @Description:
 *
 * @author <a href="www.java1995.cn">Xingsheng.Zhu@gmail.com</a>
 * @version 2.6
 */
public class PrintRequest implements Request {
	private Object message;

	public Object getMessage() {
		return message;
	}

	public void setMessage(Object message) {
		this.message = message;
	}

	public PrintRequest(Object message) {
		this.message = message;
	}

	@Override
	public void execute(Object message) {
		System.out.println(" print request " + message.toString());
	}

}
package minacor;

/**
 * 服务器端,管理FilterChain,Request
 * Server.java 2010-3-1 下午09:55:19
 * @Description:
 *
 * @author <a href="www.java1995.cn">Xingsheng.Zhu@gmail.com</a>
 * @version 2.6
 */
public class Server {
	
	private DefaultFilterChain filterChain = new DefaultFilterChain();

	public FilterChain getFilterChain(){
		return filterChain;
	}
	
	/**
	 * 处理请求
	 * @param request
	 */
	public void handleRequest(Request request){
		filterChain.setRequest(request);
		filterChain.fireMessageReceived(request.getMessage());
	}
	

}
package minacor;
/**
 * 客户端
 * Client.java 2010-3-1 下午09:56:48
 * @Description:
 *
 * @author <a href="www.java1995.cn">Xingsheng.Zhu@gmail.com</a>
 * @version 2.6
 */
public class Client {
	
	public static void main(String[] args) {
		Server server = new Server();
		server.getFilterChain().addLast(new DemoFilter());
		server.handleRequest(new PrintRequest("ffff"));
	}
}

 

http://www.java1995.cn/blog/item/123

1
0
分享到:
评论
1 楼 pywepe 2011-10-08  
和java ee filter最大的区别就是双向了

另外就是mina的filter方法特别多,有点像事件监听器

相关推荐

    Mina 1.1.7 示例源码(apache.mina.example)

    在Mina 1.1.7版本中,提供的示例源码是学习和理解Mina框架工作原理及其实现各种网络协议的重要资源。这个压缩包"apache.mina.example"包含了一系列的示例项目,可以帮助开发者快速上手并深入理解Mina。 1. **Mina...

    apache mina 简单示例

    3. **Filter Chain**:Mina使用过滤器链(Filter Chain)模式处理网络通信。过滤器可以用于数据编码解码、安全处理、日志记录等。每个过滤器都可以对数据进行处理并传递给下一个过滤器。 4. **Service**:服务端的...

    mina简单示例

    2. **Filter**:过滤器是Mina的核心概念之一,它们允许你在数据传输过程中进行拦截和处理。你可以添加多个过滤器来实现如数据编码解码、安全加密等功能。 3. **ProtocolCodecFactory**:这个接口用于定义如何将数据...

    mina项目示例

    - **Filter**:过滤器是MINA的核心组件,用于处理数据的编码、解码以及各种业务逻辑。 - **Handler**:处理器接口,用于处理实际的业务逻辑,每个网络事件都会触发相应的处理器方法。 - **ProtocolDecoder/Encoder...

    Mina基础示例

    Mina基础示例 Mina,全称是Java Mina框架,是一个开源的网络通信应用框架,主要用于构建高性能、高可用性的网络服务器。Mina旨在简化网络编程,它提供了高级抽象,如事件驱动和异步I/O,使得开发者能够专注于业务...

    mina编解码示例

    mina编解码示例是基于Apache Mina框架的一个实践项目,主要展示了如何在Mina中进行数据的编码和解码操作。Apache Mina是一个高度可扩展的网络通信框架,广泛应用于开发高性能、高并发的网络应用程序,如TCP/IP和UDP...

    mina传输对象的示例

    在标题和描述中提到的“mina传输对象的示例”指的是如何在Mina框架下处理和传输自定义的数据对象。Mina允许开发者通过事件驱动和异步I/O模型来高效地构建网络服务。 Mina的核心组件包括: 1. **Session**: 表示...

    Mina 服务端客户端示例程序

    3. **过滤器链**:Mina的过滤器(Filter)机制允许开发者插入自定义的逻辑在数据读写流程中,如数据编码解码、安全加密等。过滤器链可以灵活组合,提高代码复用性和模块化。 4. **服务端构建**:在服务端示例中,...

    MINA 2.0.7 官方示例

    在2.0.7版本中,官方提供了一系列示例来帮助开发者理解和使用MINA框架。 首先,MINA的核心概念是“Session”和“Filter”。Session代表了网络连接,是MINA中处理I/O事件的基础。而Filter则类似于拦截器,用于处理在...

    Mina通信框架应用示例

    - Filter链:MINA采用过滤器链模式,允许开发者插入自定义的过滤器来处理数据,如编码、解码、安全等。 - IoSession:表示网络连接,包含与连接相关的状态信息和操作。 - IoProcessor:负责实际的I/O操作,如读写...

    Mina+Socket通信

    import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; public class MinaServer { public static void main(String[] args) ...

    mina demo mina jar包

    "Mina demo mina jar包"指的是使用Apache Mina框架创建的一个演示示例,这个示例展示了如何运行一个基本的服务端,能够接收客户端的数据并返回响应。 在Mina框架中,服务端通常会创建一个Acceptor,监听特定的端口...

    Mina入门:mina版之HelloWorld

    这就是一个基本的Mina应用示例,展示了如何使用Mina进行网络通信。 在实际开发中,你可以根据需求扩展过滤器,实现更复杂的业务逻辑,例如加密解密、身份验证等。同时,Mina还提供了丰富的API来处理异常、管理会话...

    apache mina实例免费下载

    压缩包中的"mina"文件很可能包含了MINA的示例代码,这些代码可以帮助初学者快速理解如何使用MINA框架。通过这些实例,你可以学习到如何配置Acceptor、创建Filter链、编写Handler以及如何处理各种网络事件。这些实例...

    apache-mina源码

    - **示例应用**:MINA通常会附带一些示例程序,帮助开发者理解如何使用框架构建实际应用。 - **测试用例**:源码中包含了大量的单元测试,用于验证MINA的功能和性能。 通过阅读和分析`apache-mina-2.0.16`的源码,...

    mina2.0.7所有jar

    9. **mina-filter-compression-2.0.7.jar**:提供了数据压缩过滤器,可以压缩在网络上传输的数据,减少带宽使用,提高传输效率。 综合以上,Apache MINA 2.0.7的这些JAR文件涵盖了网络通信的各个方面,包括核心库、...

    mina通讯例子

    总的来说,这个"mina通讯例子"是一个基础的MINA使用示例,展示了如何使用MINA库在客户端和服务器之间交换自定义对象。通过学习这个例子,开发者可以了解MINA的基本工作原理,并进一步探索如何利用MINA构建更复杂的...

    mina2.0全部jar包

    mina-filter-compression-2.0.7.jar是MINA的压缩过滤器,用于在网络传输中对数据进行压缩,提高数据传输效率,尤其在传输大数据量时能显著减少网络带宽的消耗。 综上所述,MINA 2.0提供的这套jar包集合,不仅包含了...

    mina demo全套

    同时,你需要掌握Filter Chain的概念,这是Mina处理网络事件的关键机制,通过过滤器链,你可以添加自定义的逻辑来处理输入和输出数据。 此外,编码器和解码器(Encoder和Decoder)是Mina处理不同协议数据格式的重要...

    基于 MINA 的 TLS/SSL NIO Socket 实现(二)

    以下是一段创建SSLFilter并添加到过滤器链的基本代码示例: ```java SslFilter sslFilter = new SslFilter(sslContext); sslFilter.setUseClientMode(false); // 设置为服务器模式 filterChain.addFirst("sslFilter...

Global site tag (gtag.js) - Google Analytics