找工作的时候老是会被问java框架熟悉吗,用哪个框架等等。表示我没用到过,趁现在闲着来粗粗学习下。
struts源码重要的两个部分是core和xwork-core,前者依赖后者。使用struts有两个配置文件很重要,struts.xml和web-inf/web.xml。struts.xml配置struts的package/action等。org.apache.struts2.config.StrutsXmlConfigurationProvider读struts.xml,解析,加载各个package、constant等。web.xml中配置filter过滤器(FilterDispatcher被废弃,可用org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter)、filter-mapping(url-pattern:/*,当客户请求的URL和该指定的URL相匹配时,就会触发过滤器)。
StrutsPrepareAndExecuteFilter是一个Servlet过滤器类。该类实现了接口StrutsStatics和Filter。前者定义了Struts的一些常量类路径,对常用的接口进行了重新封装,比如HttpServletRequest、HttpServletResponse、HttpServletContext等。后者是javax.servlet包的功能,它操纵客户端的请求或响应,在请求到达要访问的资源前或响应发送到客户端前截获之。
StrutsPrepareAndExecuteFilter类中实现Filter接口中的init、doFilter(chain.doFilter方法将该请求向后续过滤器传递,或者进行跳转等)、destroy方法。
init参数为FilterConfig,FilterConfig是servlet的类,通过getInitParameter方法读取web.xml配置文件中过滤器初始化参数。init方法中定义prepare和execute对象,分别表示过滤器请求准备和执行的过程,也创建Dispatcher对象。Dispatcher是一个重要的类,进行一系列初始化工作,如保存FilterConfig读取的配置初始化参数,调用StrutsXmlConfigurationProvider读struts.xml等,以及执行一些重要的代码,如serviceAction等。
doFilter是过滤的具体过程。
首先是prepare的工作,创建ActionContext(action执行环境,存储session、parameter、ServletContext等信息,ValueStack);调用Dispatcher.wrapRequest将请求和响应重新包装,例如针对请求类型是否为multipart/form-data,生成不同的request子类对象;之后根据requestUrl生成ActionMapping[name,namespace,method,extension,parameter]。
这之后就是execute的工作了。若当前强求不是一个action(如其他非.action为后缀),以静态资源方式处理,或交给chain.doFilter往下传递;若是个action请求,根据action配置生成执行相应的action。
首先是由ActionProxyFactory根据actionMapping的属性生成ActionProxy,ActionProxy只是个代理,真正完成创建、执行action工作的是ActionInvocation,在ActionProxyFactory生成ActionProxy的同时,生成ActionInvocation,该对象初始化时createAction->buildAction->buildBean->创建action的类实例。
随后便是执行相应的action,如DefaultActionInvocation.invoke()方法。Action被一个或者多个拦截器所包围,所有的用户请求都会被拦截器所拦截,所有拦截器处理完后交给Action处理,处理结果以逻辑视图方式返回给用户。用户可以自己配置拦截器,即在struts.xml中定义如package/interceptors/interceptor,同时在package/action/interceptor-ref中引用。invoke方法实现了截拦器的递归调用,即调用Interceptor.intercept,intercept方法又调用invoke(),就会往下找到下一个拦截器。直到拦截器全部调用完毕,执行invokeAction,根据class、method,利用反射机制执行方法
分享到:
相关推荐
这是对spring_hibernate_struts2的理解,可以在面试中简要的抓住重点进行陈述。
Struts2深入理解
作为struts2的初学者,有时候理解struts框架的原理,网上看图会一头雾水,所以要是能自己体会实现struts框架的整个过程,对理解struts思路会更加清晰一些,这个源码就是自己实现的过程,代码有详细注释
1. struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类。我们可以在web.xml文件中将符合某种特征的所有请求交给这个Servlet处理,这个...
Struts2是一套非常优秀的Java WEB应用框架,实现优雅、功能强大、使用简洁。目前已有大量的企业项目采用Struts2来...学习完本视频,你会真正理解Struts2相对于Struts1的优雅和简洁,并使你具备开发Struts2项目的能力。
Struts2值栈的理解Struts2值栈的理解Struts2值栈的理解
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...
详细介绍了java web开发的model2模式即mvc模式的理论,以及mvc框架struts框架的理解
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...
Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。struts-2.3.16.1.zip就是struts2.3的一个版本...
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。因为Struts 2和Struts 1有着太大的变化,...
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,...
简单的struts实现 非常适合初学者理解struts结构