`
lochen514
  • 浏览: 10275 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

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
分享到:
评论

相关推荐

    servlet模拟struts1工作原理

    本文将通过使用Servlet来模拟Struts1的工作流程,深入理解其核心机制。 首先,让我们探讨Struts1的基本架构。Struts1框架的核心组件包括ActionServlet、ActionForm、Action、Tiles以及配置文件(struts-config.xml...

    JDK1.4 运行struts2

    **标题:“JDK1.4 运行Struts2”** 在Java开发领域,Struts2是一个非常流行的MVC框架,它为构建基于Java Web的应用程序提供了强大的支持。然而,随着时间的推移,JDK版本也在不断更新,从JDK1.4到更现代的版本。...

    让struts支持jdk1.8的spring包

    struts项目在jdk1.8环境下报错,提示升级到jdk1.5以上,最后修改了spring这个jar包才解决这个问题。

    最详细的Struts工作流程图

    这是一个详细的Struts工作流程图,里面包含JSP、java(Action、ActionForm等)类

    Servlet简单模拟Struts2

    通过这种方式,我们可以理解Servlet的基本工作原理,同时也能体验到框架(如Struts2)带来的便利。不过,这种方法虽然可行,但相比成熟的框架,其复杂度较高,不易维护。在实际开发中,使用成熟的框架能提高开发效率...

    struts2工作流程

    在深入探讨Struts2的工作流程之前,我们先了解一下MVC模式的基本概念。MVC模式将应用逻辑分隔为三个部分:模型(Model)处理业务逻辑,视图(View)负责展示数据,控制器(Controller)协调用户输入和模型间的交互。...

    Struts2工作流程图

    虽然Struts2号称是一个全新的框架,但这仅仅是相对Struts 1而言。Struts 2 与Struts 1相比,确实有很多革命性的改进,但它并不是新发布的新框架,而是在另一个赫赫有名的框架:WebWork基础上发展起来的。从某种程度...

    Struts工作流程

    以下是Struts工作流程的详细说明: 1. **模型(Model)**: 模型层主要负责应用程序的状态管理和业务逻辑处理。在Struts框架中,模型通常由JavaBean或Enterprise JavaBeans(EJB)来实现。JavaBean是简单的Java类...

    模拟struts2框架代码.rar_模拟struts框架

    在模拟实现中,我们可以逐步添加这些功能,以更全面地理解和掌握Struts2的工作流程。 总结来说,模拟Struts2框架的实现主要包括以下几个部分: 1. 创建Action类并定义业务逻辑方法。 2. 配置Action映射,指定...

    自己模拟实现struts的dispatcherAction

    Struts是Apache软件基金会下的一个开源框架,主要用于构建企业级的Java Web应用程序。DispatcherAction是Struts框架中的核心组件之一,它负责处理用户请求并调度到相应的Action进行业务逻辑处理。在这里,我们将深入...

    模拟struts

    Struts是Apache软件基金会 Jakarta项目下的一个开源框架,主要用于构建基于Java的企业级Web应用程序。它提供了MVC(Model-View-Controller)设计模式的实现,帮助开发者更好地组织和管理代码,提高开发效率和代码可...

    用servlet模拟struts_mvc框架

    但通过Servlet模拟Struts_MVC,我们可以了解其基本工作流程,这对于理解MVC架构和面试中的相关问题非常有帮助。 总结来说,Servlet模拟Struts_MVC是一个学习MVC模式的好方法,它让我们亲身体验到控制器如何调度模型...

    jsp项目开发实录 Struts 实现 程序完整Struts 实现 程序完整

    jsp项目开发实录 jsp项目开发实录 Struts 实现 程序完整 Struts 实现 程序完整 Struts 实现 程序完整 Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整...

    模拟Struts责任链工作流及简单AOP实现

    通过以上步骤,我们成功地模拟了Struts责任链的工作流程,并实现了一个简单的AOP机制。这种设计不仅使得代码结构清晰,而且便于维护和扩展,因为每个拦截器都专注于自己的职责,而整个系统的流程则由Struts框架自动...

    servelt模拟struts1框架

    这个过程可以帮助开发者深入理解Struts1的工作流程,为实际开发打下坚实基础。同时,这也是一种学习和研究框架原理的好方法,能够提升对Web应用程序设计模式的认识。在实际项目中,结合其他现代框架如Spring MVC或...

    利用java反射模拟struts2工作.doc

    总结来说,通过Java反射和XML解析,我们可以模拟Struts2的工作流程:解析配置文件,根据请求找到相应的Action,动态调用方法,处理结果。尽管这可能与Struts2的实际实现有所不同,但它可以帮助我们理解框架的核心...

    Struts2工作流程

    在深入理解Struts2的工作流程之前,我们需要先了解一些基本概念。 1. **MVC模式**: MVC模式将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。模型负责业务逻辑,视图负责显示...

    模拟STRUTS的小项目

    Struts是Apache软件基金会下的一个开源框架,主要用于构建企业级的Java Web应用程序。这个小项目显然是为了帮助开发者理解和实践Struts框架的核心概念和技术。在本文中,我们将深入探讨Struts框架的基本原理、主要...

    jdk1.4下struts2应用实例含单元测试

    总结来说,这个实例提供了一个在旧版JDK环境下使用Struts2和Spring构建Web应用的例子,通过它你可以了解到如何在早期的Java环境中实现MVC架构,以及如何利用Spring进行依赖管理和测试。同时,这也是一个很好的历史...

    struts2简单模拟

    通过实践简单的Struts2模拟代码,可以更好地理解和体验Struts2框架的工作原理和优势。在实际开发中,还需要不断学习和熟悉Struts2的高级特性,如自定义拦截器、类型转换、插件使用等,以提升开发能力。

Global site tag (gtag.js) - Google Analytics