⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdexecutemethodfilter.java

📁 j2ee程序。 spring、xml、 实现增加内容选项。
💻 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 + -