java基于包结构的请求路由实现实例分享
package com.hongyuan.route;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class WebFilter implements Filter {
public static final String BASE_PACKAGE="com.hongyuan";
public static final String CLASS_FLAG="Action";
@Override
public void destroy() {}
@Override
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
if(!hasResouce(request)){
String requestPath=((HttpServletRequest)request).getServletPath();
if(requestPath.indexOf(".")>=0){
requestPath=requestPath.substring(0, requestPath.indexOf("."));
}
if(requestPath.endsWith("/")){
requestPath=requestPath.substring(0, requestPath.length()-1);
}
//获取请求的类全限定名
String className=BASE_PACKAGE+requestPath.replaceAll("/", ".")+CLASS_FLAG;
//获取请求方法名称
String methodName=request.getParameter("method");
if(methodName==null||"".equals(methodName.trim())){
methodName="index";
}
try {
//获取处理类并响应请求
Class clazz=Class.forName(className);
Object instance=this.initContext(clazz,request,response);
Method method=clazz.getMethod(methodName, new Class[]{});
Object result=method.invoke(instance, new Object[]{});
response.getWriter().print(result);
} catch (Exception e) {
e.printStackTrace(response.getWriter());
}
}else{
chain.doFilter(request, response);
}
}
//判断是否存在请求的资源
private boolean hasResouce(ServletRequest request) {
String realPath=request.getServletContext().getRealPath(((HttpServletRequest)request).getServletPath());
File resouce=new File(realPath);
if(resouce.exists()){
return true;
}else{
return false;
}
}
//初始化上下文
private Object initContext(Class clazz, ServletRequest request,
ServletResponse response) throws Exception{
Object instance=clazz.newInstance();
clazz.getMethod("setRequest",new Class[]{ServletRequest.class}).invoke(instance, new Object[]{request});
clazz.getMethod("setResponse", new Class[]{ServletResponse.class}).invoke(instance, new Object[]{response});
return instance;
}
@Override
public void init(FilterConfig arg0) throws ServletException {}
}
package com.hongyuan.route;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public abstract class BaseAction {
protected ServletRequest request=null;
protected ServletResponse response=null;
public ServletRequest getRequest() {
return request;
}
public void setRequest(ServletRequest request) {
this.request = request;
}
public ServletResponse getResponse() {
return response;
}
public void setResponse(ServletResponse response) {
this.response = response;
}
}