一 搭建源码阅读环境
首先新建一个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的相关对象.