之前写过一个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>
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