Java struts 2 源码阅读入门
一 搭建源碼閱讀環境
首先新建一個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 源码阅读入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图解观察托管程序线程
- 下一篇: osgearth入门图解-用VC++做一