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的相关对象.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值