jdkproxy模拟struts工作流程

struts核心是StrutsPrepareAndExecuteFilter拦截器,这个拦截器的核心是jdkproxy。

一个url请求->拦截器->定位目标action->代理目标action->返回拦截器->目标action->拦截器->跳转页面

1,Action接口
public interface Action {
	
	public String execute();

}


2,UserAction
public class UserAction implements Action {
	
	private String name;
	private String password;

	public String execute() {
		System.out.println(name);
		System.out.println(password);
		return "index.jsp";
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}


3,StrutsPrepareAndExecuteFilter:模拟拦截器类
public class StrutsPrepareAndExecuteFilter implements Filter {

	public void destroy() {
		
	}

	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		
		HttpServletRequest request=(HttpServletRequest)req;
		HttpServletResponse response=(HttpServletResponse)res;
		
		String url=request.getRequestURL().toString();
		String actionName=url.substring(url.lastIndexOf("/")+1, url.lastIndexOf("."));
		
		JDKProxyFactory factory=new JDKProxyFactory();
		
		String result="";
		
		//这里我单为UserAction配置过滤,其实也可以更深的利用配置文件来做过滤,就相当于struts里面配置action标签的配置
		if("UserAction".equals(actionName)){
			UserAction ua=new UserAction();
			Action actionProxy=(Action)factory.createProxyInstance(ua,request,response);
			result=actionProxy.execute();
		}
		
		request.getRequestDispatcher(result).forward(request, response);
		
	}

	public void init(FilterConfig arg0) throws ServletException {
		System.out.println("初始化配置文件");
	}

}


4,JDKProxyFactory:jdkproxy代理工厂
public class JDKProxyFactory implements InvocationHandler {
	
	private Object targetObject;//代理的目标对象
	private HttpServletRequest request;
	private HttpServletResponse response;
	
	
	public  Object createProxyInstance(Object targetObject,HttpServletRequest request,HttpServletResponse response){
		this.targetObject = targetObject;
		this.request=request;
		this.response=response;
		/*
		* 第一个参数设置代码使用的类装载器,一般采用跟目标类相同的类装载器
		* 第二个参数设置代理类实现的接口
		* 第三个参数设置回调对象,当代理对象的方法被调用时,会委派给该参数指定对象的invoke方法
		*/
		return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
				this.targetObject.getClass().getInterfaces(), this);
	}
	
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
	
		Class clz=this.targetObject.getClass();
		try {
			Field[] fields=clz.getDeclaredFields();
			for(int i=0;i<fields.length;i++){
				Field field=fields[i];
				field.setAccessible(true);
				String name=field.getName();
				Object value=request.getParameter(name);
				if(value!=null){
					value=new String(value.toString().getBytes("iso8859-1"),"gb2312");
					/**
					 * 得到成员变量类型名,然后做相应的转型,因为value始终是字符型
					 * String typeName=field.getType().getName();
					 * if(typeName.equals("int")){
					 *	value=Integer.parseInt(((String)value));
					 *	}
					 */
					field.set(this.targetObject, value);
				}
				
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
		
		return method.invoke(this.targetObject, args);//把方法调用委派给目标对象
	}
	
}


5,web.xml配置模拟拦截器
<!-- 开始配置struts模拟拦截器 -->
	 <filter>
        <filter-name>struts2</filter-name>
        <filter-class>com.fairy.struts.jdkproxy.strutsfilter.StrutsPrepareAndExecuteFilter</filter-class>
 	</filter>
	
	<filter-mapping>
	    <filter-name>struts2</filter-name>
	    <url-pattern>*.action</url-pattern>
	</filter-mapping>
	<!-- 结束配置struts模拟拦截器 -->


6,测试url
http://ipAdress:port/projectName/UserAction.action?name=xxx&password=yyy

猜你喜欢

转载自lochen514.iteye.com/blog/1279096
今日推荐