📄 gdexecutemethodfilter.java
字号:
package com.gd.web.filter;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.gd.mvc.io.InfoInAndOut;
import com.gd.mvc.io.impl.GdInfoInAndOut;
import com.gd.mvc.util.GdParseXml;
public class GdExecuteMethodFilter implements Filter {
protected FilterConfig config;
//设定上下文路径
private ServletContext context;
private String filterName;
/**
* 初始化Filter,取得上下文路径
*/
public void init(FilterConfig config) throws ServletException {
this.config = config;
context = config.getServletContext();
filterName = config.getFilterName();
}
/**
* 进行过滤
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
try {
long startTime = System.currentTimeMillis();
if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
//将页面重传来的数据进行转换,置入InfoInAndOut
InfoInAndOut infoIn = (InfoInAndOut)req.getAttribute("infoIn");
InfoInAndOut infoOut = (InfoInAndOut)req.getAttribute("infoOut");
String actionName = (String)infoIn.get("actionName");
String extendsAction = (String)infoIn.get("extendsAction");
String method = (String)infoIn.get("method");
//获取对应的logic,根据method来执行该logic相对应的方法,传入参数infoIn,返回值infoOut
Class cls = Class.forName(getActionName(actionName));
Object obj = (Object)cls.newInstance();//获取对应逻辑的实例
Method mtd = null;
//假如Xml中指定逻辑类不使用继承GdAction的方式
if (extendsAction == null || "".equals(extendsAction.trim())) {
if (method == null || "".equals(method.trim())) {
method = "doInit";//假如指定的方法为空,则默认执行逻辑中的doInit方法
}
mtd = cls.getMethod(method.trim(), new Class[]{InfoInAndOut.class});
infoOut = (InfoInAndOut)mtd.invoke(obj, new Object[]{infoIn});//执行逻辑中对应的方法
} else {//假如Xml中指定逻辑类使用继承GdAction的方式
int voFlag = 0;//用来标识是否对VO进行验证,0表示验证成功,1表示失败
try {
mtd = cls.getMethod("doInit", new Class[]{InfoInAndOut.class, InfoInAndOut.class});
mtd.invoke(obj, new Object[]{infoIn, infoOut});//在GdAction的doInit方法里对VO进行验证
} catch(Exception e) {
e.printStackTrace();
infoOut.put("msg", e.getCause().getMessage());//获取验证失败的消息
voFlag = 1;//标识验证失败
}
if (voFlag == 0) {//假如验证成功
mtd = cls.getMethod("doBegin", null);//首先执行doBegin方法
mtd.invoke(obj, null);
if (method != null && !"".equals(method)) {
mtd = cls.getMethod(method.trim(), null);//再执行指定的方法
mtd.invoke(obj, null);
}
mtd = cls.getMethod("doEnd", null);//最后执行doEnd方法
mtd.invoke(obj, null);
}
}
request.setAttribute("infoIn", infoIn);
request.setAttribute("infoOut", infoOut);
context.log("actionName为:" + getActionName(actionName) + " ,method为:" + method + " ,extendsAction为:" + extendsAction + " ,调用业务逻辑共使用的时间:" + (System.currentTimeMillis() - startTime) + "ms" +
"(该日志由 " + filterName + " 报出)");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
chain.doFilter(request,response);
}
}
/**
* 获取指定的逻辑名,如果没有则默认com.gd.mvc.action.impl.GdAction
* @param actionName
* @return
* @throws IOException
* @throws Exception
*/
private String getActionName(String actionName) throws IOException, Exception {
if (actionName == null) {
return "com.gd.mvc.action.impl.GdAction";
} else {
return actionName.trim();
}
}
/**
* 销毁
*/
public void destroy() {
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -