关于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
分享到:
相关推荐
apache mina 简单示例apache mina 简单示例apache mina 简单示例apache mina 简单示例apache mina 简单示例apache mina 简单示例
Mina 示例 Mina 示例 Mina 示例 Mina 示例
导入到myeclipse或eclipse中可以直接运行。该项目是在myeclipse中直接编译测试好的。主要是用于学习和交 流。
mina简单客户端服务端示例
最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 首先,Mina是个什么东西?看下官方网站(http://mina.apache.org/)对它的解释: Apache的Mina(Multipurpose Infrastructure ...
mina mina传输对象的示例 mina框架 mina示例
该项目是采用mina框架做的客户端与服务端通信 mina框架相比socket通信有许多好处还是非常不错的 这个项目示例比较经典
mina-filter-compression-2.0.7.jar,mina 过滤器jar包,核心包之一
mina客户端示例,包括一些封闭的帮助类,编码器,解码器,用起来也比较简单,本人是打成jar包供其他项目使用的.
Mina 服务端客户端示例程序
运行客户端hello会弹出一个窗体,点击按钮模拟客户端主动发送。只是简单的例子很多没有处理,但是基本的数据连接没有问题
Mina通信框架应用示例,学会运用Mina 框架
mina-filter-codec-netty-2.0.0-M6.jar mina-filter-compression-2.0.0-M6.jar mina-integration-beans-2.0.0-M6.jar mina-integration-jmx-2.0.0-M6.jar mina-integration-ognl-2.0.0-M6.jar mina-integration-...
mina-filter-compression-2.0.2.jar
这个代码,在mina框架中,实现了编码解码,包含了服务器端发送数据的代码和作为客户端接收数据的代码。
MINA—TCP案例
这是我学习apache mina框架中研究ssl过滤器u做的一个测试的例子。希望对于刚刚学习mina框架的朋友有所帮助。如果有什么疑问可以发送到我的emai:pengli.bj@163.com与我联系
Mina自定义协议通信的示例
Mina文件上传的例子 mina mina2 file 文件上传
mina-core-2.0.0-RC1.jar,mina-filter-compression-2.0.0-RC1.jar,mina-transport-apr-2.0.0-RC1.jar