流程是 请求-》拦截-》结果的一个响应。
xml配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 2.0//EN" "http://www.opensymphony.com/xwork/xwork-2.0.dtd"> <xwork> <include file="xwork-default.xml" /> <package name="myPackage" namespace="/helloWorld"> <result-types> <result-type name="myConsole" class="com.stx.result.ResultTest"/> </result-types> <interceptors> <interceptor name="helloInterceptor" class="com.stx.interceptor.InterceptorTest"/> </interceptors> <action name="actionTest" class="com.stx.action.ActionTest"> <interceptor-ref name="helloInterceptor"/> <result type="myConsole"></result> </action> </package> </xwork>
action 配置
package com.stx.action; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext; public class ActionTest implements Action{ @Override public String execute() throws Exception { System.out.println("action="+ActionContext.getContext().get("name")); return SUCCESS; } }
interceptor拦截器
package com.stx.interceptor; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class InterceptorTest extends AbstractInterceptor{ @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("intercept:"+ActionContext.getContext().get("name")); //返回值invocation.invoke(); //中止整个执行,直接返回一个字符串作为resultCode //通过递归调用负责调用堆栈中下一个Interceptor的执行invocation.invoke(); //这个参数其实是负责调度到action的类本身参数传进来 形成一个递归 //如果在堆栈内已经不存在任何的Interceptor,调用Action return null; } }
result类
package com.stx.result; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.Result; public class ResultTest implements Result { @Override public void execute(ActionInvocation arg0) throws Exception { System.out.println("result execute:"+ ActionContext.getContext().get("name")); } }
test测试
package com.stx.test; import java.util.HashMap; import java.util.Map; import com.opensymphony.xwork2.ActionProxy; import com.opensymphony.xwork2.ActionProxyFactory; import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.ConfigurationManager; import com.opensymphony.xwork2.inject.Container; public class TestXwork { public static void main(String[] args) { ConfigurationManager cm=new ConfigurationManager () Configuration cg=cm.getConfiguration(); Container c = cg.getContainer(); ActionProxyFactory actionProxyFactory = c.getInstance(ActionProxyFactory.class); Map<String,Object> m = new HashMap<String,Object>(); m.put("name","bobo"); ActionProxy actionProxy = actionProxyFactory.createActionProxy( "/helloWorld", "actionTest",null, m); for(int i=-2;i<actionProxy.getInvocation().getStack().size();i++){ System.out.println(actionProxy.getInvocation().getStack().pop()); } try { actionProxy.execute(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
整个运行流程出来了。。。
中间的一些细节不明白,看源码的时候 接口看的眼花缭乱!
这是第一次源码感觉很吃力。