请选择 进入手机版 | 继续访问电脑版
查看: 529|回复: 0

[Java学习] struts2源码解析

3万

主题

3万

帖子

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
100167
发表于 2016-12-27 19:16:28
struts2源码解析
  1. 1.struts2框架描述
  2. 1.1 struts2框架
  3. struts2 是一个优秀的MVC框架 , struts1 开发流程,webwork框架核心
  4. struts2 基于webwork ,webwork基于xwork ,struts2很多特性都是xwork提供
  5. 1.2 MVC设计
  6. MVC 诞生与web开发,将web程序分为三个部分 Model模型 View视图 Controller控制器
  7. View 视图 : JSP web层
  8. Model 模型 : JavaBean 业务逻辑层、持久层
  9. Controller 控制器: Servlet web层
  10. 1.3 struts2 核心功能
  11. 1、允许POJO(Plain Old Java Objects)对象 作为Action
  12. 2、Action的execute 方法不再与Servlet API耦合,更易测试
  13. 3、支持更多视图技术(JSP、FreeMarker、Velocity)
  14. 4、基于Spring AOP思想的拦截器机制,更易扩展
  15. 5、更强大、更易用输入校验功能
  16. 6、整合Ajax支持
  17. 1.4 struts2 目录结构
  18. apps 该文件夹包含了基于struts2 的示例应用,这些示例应用对于学习者是非常有用的
  19. docs 该文件夹下包含了struts2 相关文档,包括struts2 快速入门、struts2的文档以及API文档等
  20. lib 该文件夹下包含了Struts2框架和核心类库,以及struts2第三方插件类库
  21. src 该文件夹下包含了Struts2框架的全部源代码
  22. 2. struts2入门
  23. 2.1 编写jsp index.jsp 和返回结果 success.jsp
  24. <a href="${pageContext.request.contextPath }/hello.action">访问struts2 快速入门</a>
  25. 2.2 核心控制器,配置web.xml
  26. <!-- 配置struts2 核心控制器 -->
  27. <filter>
  28. <filter-name>struts2</filter-name>
  29. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  30. </filter>
  31. <filter-mapping>
  32. <filter-name>struts2</filter-name>
  33. <url-pattern>/*</url-pattern>
  34. </filter-mapping>
  35. 2.3 配置struts2 框架中的配置文件 struts.xml
  36. 在src目录创建struts.xml
  37. <package name="mystruts" extends="struts-default" namespace="/">
  38. <!-- 默认值 会 调用 Action 的 execute方法 -->
  39. <action name="hello" class="cn.jfree.action.HelloAction">
  40. <!-- 将逻辑视图success 映射 success.jsp 物理页面 -->
  41. <result name="success">/success.jsp</result>
  42. </action>
  43. </package>
  44. 2.4 Action请求
  45. public String execute(){
  46. return "success"; // 对应struts.xml 配置result 结果 ------ success.jsp
  47. }
  48. 在Action执行后,自动跳转到 success.jsp 页面
  49. 2.5 缺省的action
  50. 1) 默认处理类,指在struts.xml 中,找到action的name,但是<action> 没有配置 class属性
  51. 在struts-default.xml 中 定义
  52. <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
  53. 在struts.xml 中如果<action> 没有class属性 ,将会执行 ActionSupport类的execute方法
  54. <action name="index">
  55. <!-- 默认处理类 ActionSupport 返回 "success" -->
  56. <result name="success">/index.jsp</result>
  57. </action>
  58. **例子:ErrorAction.java
  59. 2) 缺省Action ,如果访问路径,没有找到对应<action> 元素,将执行缺省Action的execute
  60. 配置缺省Action后,就不会出现Action找不到错误
  61. <default-action-ref name="error"></default-action-ref>
  62. 3. 源码分析
  63. struts2 本质是对servlet封装,相应请求,返回view,是一个通用型的对http的请求处理机制
  64. 3.1 struts2视图
  65. 本质上是对servlet封装插件,可以返回jsp freemarket velocity等视图技术
  66. 3.2 struts2与设计模式
  67. 1) ThreadLocal 模式 线程安全
  68. public class ThreadLocal<T> {
  69. public T get() {
  70. Thread t = Thread.currentThread();
  71. ThreadLocalMap map = getMap(t);
  72. if (map != null) {
  73. ThreadLocalMap.Entry e = map.getEntry(this);
  74. if (e != null)
  75. return (T)e.value;
  76. }
  77. return setInitialValue();
  78. }
  79. /**
  80. * Variant of set() to establish initialValue. Used instead
  81. * of set() in case user has overridden the set() method.
  82. *
  83. * @return the initial value
  84. */
  85. private T setInitialValue() {
  86. T value = initialValue();
  87. Thread t = Thread.currentThread();
  88. ThreadLocalMap map = getMap(t);
  89. if (map != null)
  90. map.set(this, value);
  91. else
  92. createMap(t, value);
  93. return value;
  94. }
  95. /**
  96. * Sets the current thread's copy of this thread-local variable
  97. * to the specified value. Most subclasses will have no need to
  98. * override this method, relying solely on the {@link #initialValue}
  99. * method to set the values of thread-locals.
  100. *
  101. * @param value the value to be stored in the current thread's copy of
  102. * this thread-local.
  103. */
  104. public void set(T value) {
  105. Thread t = Thread.currentThread();
  106. ThreadLocalMap map = getMap(t);
  107. if (map != null)
  108. map.set(this, value);
  109. else
  110. createMap(t, value);
  111. }
  112. /**
  113. * Removes the current thread's value for this thread-local
  114. * variable. If this thread-local variable is subsequently
  115. * {@linkplain #get read} by the current thread, its value will be
  116. * reinitialized by invoking its {@link #initialValue} method,
  117. * unless its value is {@linkplain #set set} by the current thread
  118. * in the interim. This may result in multiple invocations of the
  119. * <tt>initialValue</tt> method in the current thread.
  120. *
  121. * @since 1.5
  122. */
  123. public void remove() {
  124. ThreadLocalMap m = getMap(Thread.currentThread());
  125. if (m != null)
  126. m.remove(this);
  127. }
  128. /**
  129. * Get the map associated with a ThreadLocal. Overridden in
  130. * InheritableThreadLocal.
  131. *
  132. * @param t the current thread
  133. * @return the map
  134. */
  135. ThreadLocalMap getMap(Thread t) {
  136. return t.threadLocals;
  137. }
  138. /**
  139. * Create the map associated with a ThreadLocal. Overridden in
  140. * InheritableThreadLocal.
  141. *
  142. * @param t the current thread
  143. * @param firstValue value for the initial entry of the map
  144. * @param map the map to store.
  145. */
  146. void createMap(Thread t, T firstValue) {
  147. t.threadLocals = new ThreadLocalMap(this, firstValue);
  148. }
  149. ...
  150. }
  151. /***** ThreadLocal 和 synchronized 区别
  152. ******/
  153. ThreadLocal开发应用场景:在同一个线程的不同开发层次共享数据;
  154. 开发步骤:
  155. 1)建立一个雷,并在其中封装一个静态的ThreadLocal变量,使其成为共享数据
  156. 2)在类中实现取值和赋值方法set和get方法
  157. 3.3 struts2初始化和执行http请求
  158. 初始化尽在web应用时请求一次,失败导致怎么web项目失败,用来创建struts2的很多内置对象
  159. http请求处理
  160. 1)预处理 为web请求准备数据并且为真正执行准备环境
  161. 2)xwork执行业务逻辑 完成http请求后,将http请求数据封装成java对象,并有xwork负责执行业务逻辑
  162. 严格说 xwork 才是执行mvc的框架
  163. 3.4 xwork的七大元素
  164. 1) ActionProxy
  165. 2) ActionInvocation
  166. 3) Action
  167. 4) Interceptor
  168. 5) ActionContext
  169. 6) ValueStack
  170. 7) Result
  171. 3.5 配置文件
  172. 1) include 节点
  173. <include> 元素, 将struts2 配置文件分离 ,分模块便于维护
  174. <include file="struts1.xml" /> 读取src下struts1.xml 配置文件
  175. 2)bean节点
  176. 和spring类似,通过name和type创建class,包含创建,销毁等,实现了依赖注入 IOC
  177. 3)constant节点
  178. 常量配置
  179. 4)package节点
  180. name和namespace划分了请求的种类,允许extends继承
  181. 5)
  182. 3.6 container容器
  183. public interface Container extends Serializable {
  184. /**
  185. * Default dependency name.
  186. */
  187. String DEFAULT_NAME = "default";
  188. /**
  189. * Injects dependencies into the fields and methods of an existing object.
  190. */
  191. void inject(Object o);
  192. /**
  193. * Creates and injects a new instance of type {@code implementation}.
  194. */
  195. <T> T inject(Class<T> implementation);
  196. /**
  197. * Gets an instance of the given dependency which was declared in
  198. * {@link com.opensymphony.xwork2.inject.ContainerBuilder}.
  199. */
  200. <T> T getInstance(Class<T> type, String name);
  201. /**
  202. * Convenience method.&nbsp;Equivalent to {@code getInstance(type,
  203. * DEFAULT_NAME)}.
  204. */
  205. <T> T getInstance(Class<T> type);
  206. /**
  207. * Gets a set of all registered names for the given type
  208. * @param type The instance type
  209. * @return A set of registered names or empty set if no instances are registered for that type
  210. */
  211. Set<String> getInstanceNames(Class<?> type);
  212. /**
  213. * Sets the scope strategy for the current thread.
  214. */
  215. void setScopeStrategy(Scope.Strategy scopeStrategy);
  216. /**
  217. * Removes the scope strategy for the current thread.
  218. */
  219. void removeScopeStrategy();
  220. }
  221. 定义一下几点:
  222. 1) 定义了一个对象的定义 name type获取对象实例
  223. 2) 定义了一个对象的依赖关系
  224. 3) 定义了一个对象的作用范围
  225. 3.7 对于获取对象实例
  226. 1)struts-default.xml 中的默认的bean节点
  227. <struts>
  228. <bean class="com.opensymphony.xwork2.ObjectFactory" name="xwork" />
  229. <bean type="com.opensymphony.xwork2.ObjectFactory" name="struts" class="org.apache.struts2.impl.StrutsObjectFactory" />
  230. <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="xwork" class="com.opensymphony.xwork2.DefaultActionProxyFactory"/>
  231. <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="struts" class="org.apache.struts2.impl.StrutsActionProxyFactory"/>
  232. ....
  233. 2)bean节点中声明的自定义对象
  234. 3)constant 或者 properties声明的系统运行参数
  235. 3.8 获取对象的依赖关系
  236. @Target({METHOD, CONSTRUCTOR, FIELD, PARAMETER})
  237. @Retention(RUNTIME)
  238. public @interface Inject {
  239. /**
  240. * Dependency name. Defaults to {@link Container#DEFAULT_NAME}.
  241. */
  242. String value() default DEFAULT_NAME;
  243. /**
  244. * Whether or not injection is required. Applicable only to methods and
  245. * fields (not constructors or parameters).
  246. */
  247. boolean required() default true;
  248. }
  249. 通过注解来实现的
  250. 1) 只需要为对象 属性等加入@Inject 注解
  251. 2) 完成被注解的对象的依赖
复制代码


回复

使用道具 举报