一 搭建源码阅读环境

首先新建一个struts 2 实例工程,并附着源码;

在Eclipse中新建一个动态web工程;完成后结构如下;

添加如下图的包;可以直接拖到lib文件夹;完成后如下;

新建一个action类,结构如下,代码在后;

package strutsdemo1;public class FirstAction {public String hello(){//每次调用,都是不同的对象!System.out.println("世界,你好"+this);return "success";}}

前面建项目时忘记生成web.xml,添加之;添加struts.xml;结构如下;代码在后;

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><struts><package name="default" namespace="/" extends="struts-default"><action name="hello" class="strutsdemo1.FirstAction" method="hello"><result name="success">/first.jsp</result></action></package>
</struts>

在WebContent文件夹下新建first.jsp;

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body><%out.println("Hello World!");%>
</body>
</html>

如果jsp文件头部出现

The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

错误;

需要添加ServerRuntime;添加好后如下图;添加过程参见

http://blog.csdn.net/testcs_dn/article/details/36455669

添加了ServerRuntime后项目管理器中有如下内容;

执行项目,结果如下;

struts实例工程建好;一个好的搭建struts工程的参考见

http://www.yiibai.com/struts2/struts2_examples.html

http://www.jb51.net/article/72250.htm

下面附加源码包;

附加的方法见

http://blog.csdn.net/bcbobo21cn/article/details/52496261

附加struts2-core和xwork-core的源码,这两个是struts 2 的核心;附加好之后如下图;

开始debug,可以阅读 struts 2 的源码了;见下图;

所下的断点是这样的;

struts 2 包和源码包可在此下载;

http://pan.baidu.com/s/1qYnK784

二 Struts 2 原理

http://blog.csdn.net/w563847254/article/details/9120933

http://blog.csdn.net/w563847254/article/details/9146277

原理图;

三 Struts2源码阅读之ActionContext

https://my.oschina.net/mlongbo/blog/89878
 上一篇文章概述了Struts2的一些流程。这次说下ActionContext,直接进入正题。

static ThreadLocal actionContext = new ThreadLocal();//ActionContext

public static ActionContext getContext() {
  return (ActionContext) actionContext.get();
}

从上面可以看到ActionContext是被存放在当前线程中的,获取ActionContext也是从ThreadLocal中获取的。因此在执行拦截器、 action和result的过程中,由于他们都是在一个线程中按照顺序执行的,所以可以在任意时候从ThreadLocal中获取 ActionContext。

ActionContext是Action执行时的上下文,上下文可以看作是一个容器

Map<String, Object> context;
    public static void setContext(ActionContext context) {
        actionContext.set(context);
    }
    public static ActionContext getContext() {
      return (ActionContext) actionContext.get();
    }
        由上面可以看出,其实我们这里的容器就是一个Map而已,在容器中存放的是Action在执行时需要用到的对象.比如:VALUE_STACK、ACTION_NAME、SESSION、APPLICATION、ACTION_INVOCATION等等。

另外还一个类叫ServletActionContext,它直接继承了ActionContext,因此也是线程安全的。ServletActionContext还提供了一些直接与Servlet相关对象访问的功能,例如HttpServletRequest、HttpServletResponse、ServletContext、PageContextd等。

如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问Servlet的相关对象.

Java struts 2 源码阅读入门相关推荐

  1. Java String类源码阅读笔记

    文章目录 一.前置 二.String类源码解析 1.String类继承关系 2.成员变量 3.构造方法 4.长度/判空 5.取字符 6.比较 7.包含 8.hashCode 9.查询索引 10.获取子 ...

  2. java中talent-aio_talent-aio源码阅读小记(一)

    近来在oschina上看到一个很火的java 即时通讯项目talent-aio,恰巧想了解一下这方面的东西,就阅读了一下项目的源码,这里对自己阅读源码后的一些心得体会做一下备忘,也希望能够对其他项目中 ...

  3. spring 源码阅读入门

    spring和源码3.0.5下载 http://download.csdn.net/download/haluoyimo/7752753 http://pan.baidu.com/s/1qYnK784 ...

  4. java conditionobject_Java AbstractQueuedSynchronizer源码阅读4-ConditionObject

    AbstractQueuedSynchronizer为锁机制维护了一个队列,需要获取锁的线程们排在队列中,只有排在队首的线程才有资格获取锁. ConditionObject是AbstractQueue ...

  5. java工具类源码阅读,java学习日记第二天(实用的工具类和源码解析一Arrays)

    本帖最后由 三木猿 于 2020-9-18 11:17 编辑 每日名言 学者须先立志.今日所以悠悠者,只是把学问不曾做一件事看,遇事则且胡乱恁地打过了,此只是志不立. --朱熹 工作中经常会用到一些工 ...

  6. java java.lang.enum_源码阅读-java基础-java.lang.Enum

    1.引言 枚举类型是 JDK 5 之后引进的一种非常重要的引用类型,可以用来定义一系列枚举常量.相比与常量(public static final定义),在安全性.指意性.可读性方面更胜一筹.另外它可 ...

  7. java io中断_JDK源码阅读:InterruptibleChannel 与可中断 IO

    来源:木杉的博客 , imushan.com/2018/08/01/java/language/JDK源码阅读-InterruptibleChannel与可中断IO/ Java传统IO是不支持中断的, ...

  8. Android Framework源码阅读计划(2)——LocationManagerService.java

    Android Framework源码阅读计划 Android Framework源码阅读计划(1)--LocationManager.java Android Framework源码阅读计划(2)- ...

  9. SpringMVC源码阅读:过滤器

    SpringMVC源码阅读:过滤器 目录 1.前言 2.源码分析 3.自定义过滤器 3.1 自定义过滤器继承OncePerRequestFilter 3.2 自定义过滤器实现Filter接口 4.过滤 ...

最新文章

  1. 模式设计概述:代理者模式
  2. c++经典代码大全_宁海檩条C型钢型号大全
  3. git stage 暂存_什么是Git?下载和安装Git
  4. SpringBoot笔记:SpringBoot集成SpringbootAdmin监控
  5. GDCM:MD5的测试程序
  6. ipad和iphone切图_如何在iPhone,iPad和Mac上使消息静音
  7. 《Python Cookbook 3rd》笔记(4.13):创建数据处理管道
  8. Linux下尝鲜IDE Rider .NET又一开发利器
  9. s3 java_java – 我们可以迭代Amazon S3中的完整对象集
  10. 智能门锁电路图_蓝牙门锁原理图一览 蓝牙智能门锁工作原理介绍
  11. FFMpeg-6、Libavdevice+SDL捕获显示摄像头、录屏
  12. 物联网常见的无线传输协议类型
  13. Spark Streaming项目实战
  14. echarts立体柱状图
  15. scrapy下载图片(《精通scrapy网络爬虫》第九章)
  16. 2048总结 python_2048游戏的python实现
  17. Day10-服务调用-删除课程的同时删除所有小节视频-p158、p159
  18. JTAG、JLink、ULINK、ST-LINK仿真器区别
  19. 采样频率和带宽的关系_示波器关键参数---带宽
  20. Scala语法(一) 基础语法(变量常量判断循环数组集合)

热门文章

  1. 安卓x86程序安装目录_电脑上的安卓系统体验
  2. 手机型号大全资料_电子元器件知识资料大全
  3. springboot 的两种配置文件语法||配置文件占位符||@Value 读取配置文件及验证处理
  4. bugku 成绩单 sqlmap工具的爆破
  5. C++ leetcode 12. 整数转罗马数字 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
  6. javascript中not defined、undefined、null以及NaN的区别
  7. CTFshow 命令执行 web42
  8. [YTU]_2877(结构体---职工信息结构体)
  9. 【Kaggle-MNIST之路】两层的神经网络Pytorch(四行代码的模型)
  10. 【两行命令】R语言读取excel数据