Source Taste: Struts 2:ModelDrivenInterceptor

PART 1:

public class ModelDrivenInterceptor extends AbstractInterceptor {

    protected boolean refreshModelBeforeResult = false;

    public void setRefreshModelBeforeResult(boolean val) {
        this.refreshModelBeforeResult = val;
    }

    //Derek: the signature is impressive and noteworthy, recursively invoked scenario
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        Object action = invocation.getAction();

        if (action instanceof ModelDriven) {
            ModelDriven modelDriven = (ModelDriven) action;
            ValueStack stack = invocation.getStack();
            Object model = modelDriven.getModel();
            if (model !=  null) {
                //Derek: Notice the exact simple behavior of ModelDriven
                stack.push(model);
            }
            if (refreshModelBeforeResult) {
                invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model));
            }
        }
        //Derek: Notice the return clause, which enables recurrsive invoking.
        return invocation.invoke();
    }

THINK: Under the params-prepare-params pattern, the first time parametersInterceptor invoked must not apply the params to any model, since no model pushed into ValueStack at that moment.

INVESTIGATE: When does Struts 2 set values for the model's properties?

DELVE: the model object would be on the top of the stack? and would be matched with priority(given top-down retrieval)?


你可能感兴趣的:(Source Taste: Struts 2:ModelDrivenInterceptor)