PrepareOperationsのcreateActionContext
6847 ワード
//ValueStack , OgnlValueStack
//OgnlValueStack :
//CompoundRoot root
//transient Map<String, Object> context;
// context OgnlContext,OgnlContext :
//private Object _root;
//private Map _values = new HashMap(23);
package org.apache.struts2.dispatcher.ng;
PrepareOperationsクラス:
public ActionContext createActionContext(HttpServletRequest request, HttpServletResponse response) {
ActionContext ctx;
Integer counter = 1;
Integer oldCounter = (Integer) request.getAttribute(CLEANUP_RECURSION_COUNTER);
if (oldCounter != null) {
counter = oldCounter + 1;
}
ActionContext oldContext = ActionContext.getContext();
if (oldContext != null) {
ctx = new ActionContext(new HashMap<String, Object>(oldContext.getContextMap()));
} else {
ValueStack stack = dispatcher.getContainer().getInstance(ValueStackFactory.class).createValueStack();
stack.getContext().putAll(dispatcher.createContextMap(request, response, null, servletContext));
ctx = new ActionContext(stack.getContext());
}
request.setAttribute(CLEANUP_RECURSION_COUNTER, counter);
ActionContext.setContext(ctx);
return ctx;
}
//一言ずつ見て
ValueStack stack = dispatcher.getContainer().getInstance(ValueStackFactory.class).createValueStack();
//dispatcher.getContainer().getInstance(ValueStackFactory.class)の部分はまだよくわかりませんが、
//文字通り見積もると、ValueStackFactoryを作成するインスタンスです.
//ValueStackFactoryはインタフェースであり、デフォルトの実装はOgnlValueStackFactoryである
//OgnlValueStackFactoryのcreateValueStack()を呼び出す:
public ValueStack createValueStack() {
//ValueStack , OgnlValueStack, new OgnlValueStack 。
ValueStack stack = new OgnlValueStack(xworkConverter, compoundRootAccessor, textProvider, allowStaticMethodAccess);
container.inject(stack);
// OgnlValueStack.context, OgnlContext context 。
stack.getContext().put(ActionContext.CONTAINER, container);
return stack;
}
//OgnlValueStack
protected OgnlValueStack(XWorkConverter xworkConverter, CompoundRootAccessor accessor, TextProvider prov, boolean allowStaticAccess) {
//new CompoundRoot
setRoot(xworkConverter, accessor, new CompoundRoot(), allowStaticAccess);
push(prov);
}
protected void setRoot(XWorkConverter xworkConverter, CompoundRootAccessor accessor, CompoundRoot compoundRoot,
boolean allowStaticMethodAccess) {
//OgnlValueStack.root = compoundRoot;
this.root = compoundRoot;
// / 。
this.securityMemberAccess = new SecurityMemberAccess(allowStaticMethodAccess);
// context , context ongl 。
//Ognl.createDefaultContext OgnlContext
// OgnlContext ,root OgnlValueStack compoundRoot,map OgnlContext private Map _values = new HashMap(23);
this.context = Ognl.createDefaultContext(this.root, accessor, new OgnlTypeConverterWrapper(xworkConverter), securityMemberAccess);
// , :
//context OgnlContext, HashMap _values k-v:
//key:com.opensymphony.xwork2.util.ValueStack.ValueStack
//value:this, OgnlValueStack 。
// ,_values :
//com.opensymphony.xwork2.ActionContext.container=com.opensymphony.xwork2.inject.ContainerImpl@96231e
//com.opensymphony.xwork2.util.ValueStack.ValueStack=com.opensymphony.xwork2.ognl.OgnlValueStack@4d912
context.put(VALUE_STACK, this);
// :OgnlValueStack compoundRoot ;
//context OgnlContext, _root OgnlValueStack root,_values , 。
//OgnlContext 。
Ognl.setClassResolver(context, accessor);
((OgnlContext) context).setTraceEvaluations(false);
((OgnlContext) context).setKeepLastEvaluation(false);
}
// :package ognl;
public static Map createDefaultContext( Object root, ClassResolver classResolver, TypeConverter converter, MemberAccess memberAccess )
{
//new OgnlContext 。
// OgnlContext ,root,map , , 。
return addDefaultContext( root, classResolver, converter, memberAccess, new OgnlContext() );
}
// new OgnlContext , :
//root OgnlContext private Object _root;
//OgnlContext Map, ,new :private Map _values = new HashMap(23);
// , , 。
// OgnlContext ,root,map , , 。
public static Map addDefaultContext( Object root, ClassResolver classResolver, TypeConverter converter, MemberAccess memberAccess, Map context )
{
OgnlContext result;
if (!(context instanceof OgnlContext)) {
result = new OgnlContext();
result.setValues(context);
} else {
result = (OgnlContext)context;
}
if (classResolver != null) {
result.setClassResolver(classResolver);
}
if (converter != null) {
result.setTypeConverter(converter);
}
if (memberAccess != null) {
result.setMemberAccess(memberAccess);
}
result.setRoot(root);
return result;
}
///OgnlContextの_root、OgnlValueStackのrootを指す
public void setRoot(Object value)
{
_root = value;
_accessorStack.clear();
_typeStack.clear();
_currentObject = value;
if (_currentObject != null)
{
setCurrentType(_currentObject.getClass());
}
}