自己写的一个servlet Dispatchar,便于在osgi使用(二)

之前写过一个servlet Dispatchar  ,但是并不是在osgi环境运行的,有些时候我们需要在osgi环境去运行web,或者去实现一些http的api,提供给其它业务组调用,这时候我们需要在osgi环境下面去写servlet,但是传统的springmvc或者struts又不能很好的运行在osgi环境上,所以针对这种情况,自己开发出来一个基于osgi环境下的servlet Dispatchar  ,简单高效。

废话不多说,上代码。

采用的是blueprint配置

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
	xmlns:camel-cxf="http://camel.apache.org/schema/blueprint/cxf"
	xmlns:cxfcore="http://cxf.apache.org/blueprint/core"
	xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd  
                                http://camel.apache.org/schema/blueprint/cxf http://camel.apache.org/schema/blueprint/cxf/camel-cxf.xsd
                                http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd
                                http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.1.0.xsd">
	<bean  class="com.cn.yyc.Controller"/>
	
	<bean id="dispatcher" class="com.cn.yyc.Dispatcher">
		<property name="container" ref="blueprintContainer"/>
	</bean>
	<service ref="dispatcher" interface="javax.servlet.http.HttpServlet">
        <service-properties>
            <entry key="alias" value="/dispatcher/*"/>
        </service-properties>
    </service>
    
    
    <bean id="filter" class="com.cn.yyc.Filter"/>
    <service ref="filter" interface="javax.servlet.Filter">
        <service-properties>
            <entry key="urlPatterns" value="/dispatcher/*"/>
        </service-properties>
    </service>

</blueprint>


Dispatcher.java

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.osgi.service.blueprint.container.BlueprintContainer;

public class Dispatcher extends HttpServlet{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private BlueprintContainer container;
	
	
	
	public void setContainer(BlueprintContainer container) {
		this.container = container;
	}
	@Override  
    public void doGet(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        doPost(request, response);  
    }  
    @Override  
    public void doPost(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        String uri = request.getRequestURI();  
        String classMethodName = uri.substring(uri.lastIndexOf("/")+1,uri.lastIndexOf(".do"));  
        String className = classMethodName.split("_")[0];  
        String methodName = classMethodName.split("_")[1];  
        Object controller =  null;  
        Set<String> classObject  = container.getComponentIds();
        for(String id :classObject){
        	
        	String objectName = container.getComponentInstance(id).getClass().getName();
        	
        	if(className.equals(objectName.substring(objectName.lastIndexOf(".")+1,objectName.length() ))){
        		controller = container.getComponentInstance(id);
        		break;
        	}
        }
        
        System.out.println("sss----"+controller);
        try {  
            controller.getClass().getMethod(methodName,new Class[]{HttpServletRequest.class,HttpServletResponse.class}).invoke(controller.getClass().newInstance(),new Object[]{request,response});  
        }catch(NoSuchMethodException ex){

        	response.getWriter().println("url set  error  no such method!!");
        }catch(NullPointerException  ex){

        	response.getWriter().println("url set  error  no such class!!!");
        }
        catch (IllegalArgumentException e) {  
        	response.getWriter().println("service  error!!!");
        } catch (SecurityException e) {  
        	response.getWriter().println("service  error!!!");
        } catch (IllegalAccessException e) {  
        	response.getWriter().println("service  error!!!");
        } catch (InvocationTargetException e) {  
        	response.getWriter().println("service  error!!!");
        } catch (InstantiationException e) {  
        	response.getWriter().println("service  error!!!");
        }      
    }  

}

Controller.java

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Controller {
	
	
	public void aaaa(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		ServletUtils.renderJson(resp, "aaaa");
	}
	
	public void ccc(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.sendRedirect("http://www.baidu.com");
    }
	
	public void ddd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	
		ServletUtils.renderJson(resp, "dddd");

    }

}

这样就实现在osgi环境简单高效的分发。这里设计思想是,约定优于配置,采用类_方法,去找到需要的controller。

http://localhost:8181/dispatcher/Controller_ccc.do


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值