DispatchServlet类:
package com.zzz.jbpm.web;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 分发请求,处理中文,控制登录
*
*/
public abstract class DispatchServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
System.out.println("DispatchServlet uri:" + request.getRequestURI());
// jbpm.do:index
String method = request.getParameter("method");
System.out.println("DispatchServlet method:" + method);
if (method == null || "".equals(method.trim())) {
index(request, response);
return;
}
dispatchMethod(request, response, method);
}
protected HashMap methods = new HashMap();
protected Class clazz = this.getClass();
protected Class[] types = { HttpServletRequest.class, HttpServletResponse.class };
// 实现回调子类的公共方法
private void dispatchMethod(HttpServletRequest request, HttpServletResponse response, String name) throws ServletException, IOException {
Method method = null;
try {
synchronized (methods) {
method = (Method) methods.get(name);
if (method == null) {
method = clazz.getMethod(name, types);
methods.put(name, method);
}
}
} catch (Exception e) {
throw new RuntimeException(clazz.getSimpleName() + "子类没有找到对应的方法:" + e.getMessage());
}
try {
Object[] args = { request, response };
method.invoke(this, args);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("不能成功调用子类的方法:" + e.getMessage());
}
}
// 没有输入method,默认访问此方法
protected abstract void index(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}
使用方法:
public class DeployServlet extends BaseServlet { @Override protected void index(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//TODO }