⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parametersinterceptor.java

📁 在Struts2中的jar包xwork的源代码.版本为2.0.7
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 2002-2006 by OpenSymphony * All rights reserved. */package com.opensymphony.xwork2.interceptor;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.ValidationAware;import com.opensymphony.xwork2.inject.Inject;import com.opensymphony.xwork2.util.*;import java.util.Collection;import java.util.Collections;import java.util.Comparator;import java.util.HashSet;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.TreeMap;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;/** * <!-- START SNIPPET: description --> * This interceptor sets all parameters on the value stack. * <p/> * This interceptor gets all parameters from {@link ActionContext#getParameters()} and sets them on the value stack by * calling {@link ValueStack#setValue(String, Object)}, typically resulting in the values submitted in a form * request being applied to an action in the value stack. Note that the parameter map must contain a String key and * often containers a String[] for the value. * <p/> * <p/> The interceptor takes one parameter named 'ordered'. When set to true action properties are guaranteed to be * set top-down which means that top action's properties are set first. Then it's subcomponents properties are set. * The reason for this order is to enable a 'factory' pattern. For example, let's assume that one has an action * that contains a property named 'modelClass' that allows to choose what is the underlying implementation of model. * By assuring that modelClass property is set before any model properties are set, it's possible to choose model * implementation during action.setModelClass() call. Similiarily it's possible to use action.setPrimaryKey() * property set call to actually load the model class from persistent storage. Without any assumption on parameter * order you have to use patterns like 'Preparable'. * <p/> * <p/> Because parameter names are effectively OGNL statements, it is important that security be taken in to account. * This interceptor will not apply any values in the parameters map if the expression contains an assignment (=), * multiple expressions (,), or references any objects in the context (#). This is all done in the {@link * #acceptableName(String)} method. In addition to this method, if the action being invoked implements the {@link * ParameterNameAware} interface, the action will be consulted to determine if the parameter should be set. * <p/> * <p/> In addition to these restrictions, a flag ({@link XWorkMethodAccessor#DENY_METHOD_EXECUTION}) is set such that * no methods are allowed to be invoked. That means that any expression such as <i>person.doSomething()</i> or * <i>person.getName()</i> will be explicitely forbidden. This is needed to make sure that your application is not * exposed to attacks by malicious users. * <p/> * <p/> While this interceptor is being invoked, a flag ({@link InstantiatingNullHandler#CREATE_NULL_OBJECTS}) is turned * on to ensure that any null reference is automatically created - if possible. See the type conversion documentation * and the {@link InstantiatingNullHandler} javadocs for more information. * <p/> * <p/> Finally, a third flag ({@link XWorkConverter#REPORT_CONVERSION_ERRORS}) is set that indicates any errors when * converting the the values to their final data type (String[] -&gt; int) an unrecoverable error occured. With this * flag set, the type conversion errors will be reported in the action context. See the type conversion documentation * and the {@link XWorkConverter} javadocs for more information. * <p/> * <p/> If you are looking for detailed logging information about your parameters, turn on DEBUG level logging for this * interceptor. A detailed log of all the parameter keys and values will be reported. * <p/> * <p/> * <b>Note:</b> Since XWork 2.0.2, this interceptor extends {@link MethodFilterInterceptor}, therefore being * able to deal with excludeMethods / includeMethods parameters. See [Workflow Interceptor] * (class {@link DefaultWorkflowInterceptor}) for documentation and examples on how to use this feature. * <p/> * <!-- END SNIPPET: description --> * <p/> * <p/> <u>Interceptor parameters:</u> * <p/> * <!-- START SNIPPET: parameters --> * <p/> * <ul> * <p/> * <li>ordered - set to true if you want the top-down property setter behaviour</li> * <p/> * </ul> * <p/> * <!-- END SNIPPET: parameters --> * <p/> * <p/> <u>Extending the interceptor:</u> * <p/> * <!-- START SNIPPET: extending --> * <p/> * <p/> The best way to add behavior to this interceptor is to utilize the {@link ParameterNameAware} interface in your * actions. However, if you wish to apply a global rule that isn't implemented in your action, then you could extend * this interceptor and override the {@link #acceptableName(String)} method. * <p/> * <!-- END SNIPPET: extending --> * <p/> * <p/> <u>Example code:</u> * <p/> * <pre> * <!-- START SNIPPET: example --> * &lt;action name="someAction" class="com.examples.SomeAction"&gt; *     &lt;interceptor-ref name="params"/&gt; *     &lt;result name="success"&gt;good_result.ftl&lt;/result&gt; * &lt;/action&gt; * <!-- END SNIPPET: example --> * </pre> * * @author Patrick Lightbody * @author Rene Gielen */public class ParametersInterceptor extends MethodFilterInterceptor {    private static final Log LOG = LogFactory.getLog(ParametersInterceptor.class);    boolean ordered = false;    Set<Pattern> excludeParams = Collections.emptySet();    Set<Pattern> acceptParams = Collections.emptySet();    static boolean devMode = false;    private String acceptedParamNames = "[\\p{Graph}&&[^,#:=]]*";    private Pattern acceptedPattern = Pattern.compile(acceptedParamNames);    @Inject(value = "devMode", required = false)    public static void setDevMode(String mode) {        devMode = "true".equals(mode);    }    public void setAcceptParamNames(String commaDelim) {        Collection<String> acceptPatterns = asCollection(commaDelim);        if (acceptPatterns != null) {            acceptParams = new HashSet<Pattern>();            for (String pattern : acceptPatterns) {                acceptParams.add(Pattern.compile(pattern));            }        }    }    /**     * Compares based on number of '.' characters (fewer is higher)     */    static final Comparator rbCollator = new Comparator() {        public int compare(Object arg0, Object arg1) {            String s1 = (String) arg0;            String s2 = (String) arg1;            int l1 = 0, l2 = 0;            for (int i = s1.length() - 1; i >= 0; i--) {                if (s1.charAt(i) == '.') l1++;            }            for (int i = s2.length() - 1; i >= 0; i--) {                if (s2.charAt(i) == '.') l2++;            }            return l1 < l2 ? -1 : (l2 < l1 ? 1 : s1.compareTo(s2));        }    };    public String doIntercept(ActionInvocation invocation) throws Exception {        Object action = invocation.getAction();        if (!(action instanceof NoParameters)) {            ActionContext ac = invocation.getInvocationContext();            final Map parameters = ac.getParameters();            if (LOG.isDebugEnabled()) {                LOG.debug("Setting params " + getParameterLogMap(parameters));            }            if (parameters != null) {                Map contextMap = ac.getContextMap();                try {                    OgnlContextState.setCreatingNullObjects(contextMap, true);                    OgnlContextState.setDenyMethodExecution(contextMap, true);                    OgnlContextState.setReportingConversionErrors(contextMap, true);                    ValueStack stack = ac.getValueStack();                    setParameters(action, stack, parameters);                } finally {                    OgnlContextState.setCreatingNullObjects(contextMap, false);                    OgnlContextState.setDenyMethodExecution(contextMap, false);                    OgnlContextState.setReportingConversionErrors(contextMap, false);                }            }        }        return invocation.invoke();    }    protected void setParameters(Object action, ValueStack stack, final Map parameters) {        ParameterNameAware parameterNameAware = (action instanceof ParameterNameAware)                ? (ParameterNameAware) action : null;        Map params = null;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -