📄 requestutils.java.svn-base
字号:
if (bean instanceof ActionForm) { ((ActionForm) bean).setMultipartRequestHandler(null); } MultipartRequestHandler multipartHandler = null; if ((contentType != null) && (contentType.startsWith("multipart/form-data")) && (method.equalsIgnoreCase("POST"))) { // Get the ActionServletWrapper from the form bean ActionServletWrapper servlet; if (bean instanceof ActionForm) { servlet = ((ActionForm) bean).getServletWrapper(); } else { throw new ServletException("bean that's supposed to be " + "populated from a multipart request is not of type " + "\"org.apache.struts.action.ActionForm\", but type " + "\"" + bean.getClass().getName() + "\""); } // Obtain a MultipartRequestHandler multipartHandler = getMultipartHandler(request); if (multipartHandler != null) { isMultipart = true; // Set servlet and mapping info servlet.setServletFor(multipartHandler); multipartHandler.setMapping((ActionMapping) request .getAttribute(Globals.MAPPING_KEY)); // Initialize multipart request class handler multipartHandler.handleRequest(request); //stop here if the maximum length has been exceeded Boolean maxLengthExceeded = (Boolean) request.getAttribute(MultipartRequestHandler.ATTRIBUTE_MAX_LENGTH_EXCEEDED); if ((maxLengthExceeded != null) && (maxLengthExceeded.booleanValue())) { ((ActionForm) bean).setMultipartRequestHandler(multipartHandler); return; } //retrieve form values and put into properties multipartParameters = getAllParametersForMultipartRequest(request, multipartHandler); names = Collections.enumeration(multipartParameters.keySet()); } } if (!isMultipart) { names = request.getParameterNames(); } while (names.hasMoreElements()) { String name = (String) names.nextElement(); String stripped = name; if (prefix != null) { if (!stripped.startsWith(prefix)) { continue; } stripped = stripped.substring(prefix.length()); } if (suffix != null) { if (!stripped.endsWith(suffix)) { continue; } stripped = stripped.substring(0, stripped.length() - suffix.length()); } Object parameterValue = null; if (isMultipart) { parameterValue = multipartParameters.get(name); parameterValue = rationalizeMultipleFileProperty(bean, name, parameterValue); } else { parameterValue = request.getParameterValues(name); } // Populate parameters, except "standard" struts attributes // such as 'org.apache.struts.action.CANCEL' if (!(stripped.startsWith("org.apache.struts."))) { properties.put(stripped, parameterValue); } } // Set the corresponding properties of our bean try { BeanUtils.populate(bean, properties); } catch (Exception e) { throw new ServletException("BeanUtils.populate", e); } finally { if (multipartHandler != null) { // Set the multipart request handler for our ActionForm. // If the bean isn't an ActionForm, an exception would have been // thrown earlier, so it's safe to assume that our bean is // in fact an ActionForm. ((ActionForm) bean).setMultipartRequestHandler(multipartHandler); } } } /** * <p>If the given form bean can accept multiple FormFile objects but the user only uploaded a single, then * the property will not match the form bean type. This method performs some simple checks to try to accommodate * that situation.</p> * @param bean * @param name * @param parameterValue * @return * @throws ServletException if the introspection has any errors. */ private static Object rationalizeMultipleFileProperty(Object bean, String name, Object parameterValue) throws ServletException { if (!(parameterValue instanceof FormFile)) return parameterValue; FormFile formFileValue = (FormFile) parameterValue; try { Class propertyType = PropertyUtils.getPropertyType(bean, name); if (propertyType.isAssignableFrom(List.class)) { ArrayList list = new ArrayList(1); list.add(formFileValue); return list; } if (propertyType.isArray() && propertyType.getComponentType().equals(FormFile.class)) { return new FormFile[] { formFileValue }; } } catch (IllegalAccessException e) { throw new ServletException(e); } catch (InvocationTargetException e) { throw new ServletException(e); } catch (NoSuchMethodException e) { throw new ServletException(e); } // no changes return parameterValue; } /** * <p>Try to locate a multipart request handler for this request. First, * look for a mapping-specific handler stored for us under an attribute. * If one is not present, use the global multipart handler, if there is * one.</p> * * @param request The HTTP request for which the multipart handler should * be found. * @return the multipart handler to use, or null if none is found. * @throws ServletException if any exception is thrown while attempting to * locate the multipart handler. */ private static MultipartRequestHandler getMultipartHandler( HttpServletRequest request) throws ServletException { MultipartRequestHandler multipartHandler = null; String multipartClass = (String) request.getAttribute(Globals.MULTIPART_KEY); request.removeAttribute(Globals.MULTIPART_KEY); // Try to initialize the mapping specific request handler if (multipartClass != null) { try { multipartHandler = (MultipartRequestHandler) applicationInstance(multipartClass); } catch (ClassNotFoundException cnfe) { log.error("MultipartRequestHandler class \"" + multipartClass + "\" in mapping class not found, " + "defaulting to global multipart class"); } catch (InstantiationException ie) { log.error("InstantiationException when instantiating " + "MultipartRequestHandler \"" + multipartClass + "\", " + "defaulting to global multipart class, exception: " + ie.getMessage()); } catch (IllegalAccessException iae) { log.error("IllegalAccessException when instantiating " + "MultipartRequestHandler \"" + multipartClass + "\", " + "defaulting to global multipart class, exception: " + iae.getMessage()); } if (multipartHandler != null) { return multipartHandler; } } ModuleConfig moduleConfig = ModuleUtils.getInstance().getModuleConfig(request); multipartClass = moduleConfig.getControllerConfig().getMultipartClass(); // Try to initialize the global request handler if (multipartClass != null) { try { multipartHandler = (MultipartRequestHandler) applicationInstance(multipartClass); } catch (ClassNotFoundException cnfe) { throw new ServletException("Cannot find multipart class \"" + multipartClass + "\"" + ", exception: " + cnfe.getMessage()); } catch (InstantiationException ie) { throw new ServletException( "InstantiationException when instantiating " + "multipart class \"" + multipartClass + "\", exception: " + ie.getMessage()); } catch (IllegalAccessException iae) { throw new ServletException( "IllegalAccessException when instantiating " + "multipart class \"" + multipartClass + "\", exception: " + iae.getMessage()); } if (multipartHandler != null) { return multipartHandler; } } return multipartHandler; } /** * <p>Create a <code>Map</code> containing all of the parameters supplied * for a multipart request, keyed by parameter name. In addition to text * and file elements from the multipart body, query string parameters are * included as well.</p> * * @param request The (wrapped) HTTP request whose parameters are * to be added to the map. * @param multipartHandler The multipart handler used to parse the * request. * @return the map containing all parameters for this multipart request. */ private static Map getAllParametersForMultipartRequest( HttpServletRequest request, MultipartRequestHandler multipartHandler) { Map parameters = new HashMap(); Hashtable elements = multipartHandler.getAllElements(); Enumeration e = elements.keys(); while (e.hasMoreElements()) { String key = (String) e.nextElement(); parameters.put(key, elements.get(key)); } if (request instanceof MultipartRequestWrapper) { request = (HttpServletRequest) ((MultipartRequestWrapper) request) .getRequest(); e = request.getParameterNames(); while (e.hasMoreElements()) { String key = (String) e.nextElement(); parameters.put(key, request.getParameterValues(key)); } } else { log.debug("Gathering multipart parameters for unwrapped request"); } return parameters; } /** * <p>Compute the printable representation of a URL, leaving off the * scheme/host/port part if no host is specified. This will typically be * the case for URLs that were originally created from relative or * context-relative URIs.</p> * * @param url URL to render in a printable representation * @return printable representation of a URL */ public static String printableURL(URL url) { if (url.getHost() != null) { return (url.toString()); } String file = url.getFile(); String ref = url.getRef(); if (ref == null) { return (file); } else { StringBuffer sb = new StringBuffer(file); sb.append('#'); sb.append(ref); return (sb.toString()); } } /** * <p>Return the context-relative URL that corresponds to the specified * {@link ActionConfig}, relative to the module associated with the * current modules's {@link ModuleConfig}.</p> * * @param request The servlet request we are processing * @param action ActionConfig to be evaluated * @param pattern URL pattern used to map the controller servlet * @return context-relative URL relative to the module * @since Struts 1.1 */ public static String actionURL(HttpServletRequest request, ActionConfig action, String pattern) { StringBuffer sb = new StringBuffer(); if (pattern.endsWith("/*")) { sb.append(pattern.substring(0, pattern.length() - 2)); sb.append(action.getPath()); } else if (pattern.startsWith("*.")) { ModuleConfig appConfig = ModuleUtils.getInstance().getModuleConfig(request); sb.append(appConfig.getPrefix()); sb.append(action.getPath()); sb.append(pattern.substring(1)); } else { throw new IllegalArgumentException(pattern); } return sb.toString(); } /** * <p>Return the context-relative URL that corresponds to the specified * <code>ForwardConfig</code>. The URL is calculated based on the * properties of the {@link ForwardConfig} instance as follows:</p> * * <ul> * * * <li>If the <code>contextRelative</code> property is set, it is assumed * that the <code>path</code> property contains a path that is already * context-relative: * * <ul> * * <li>If the <code>path</code> property value starts with a slash, it is * returned unmodified.</li> <li>If the <code>path</code> property value * does not start with a slash, a slash is prepended.</li> * * </ul></li> * * <li>Acquire the <code>forwardPattern</code> property from the * <code>ControllerConfig</code> for the application module used to * process this request. If no pattern was configured, default to a * pattern of <code>$M$P</code>, which is compatible with the hard-coded * mapping behavior in Struts 1.0.</li> * * <li>Process the acquired <code>forwardPattern</code>, performing the * following substitutions: * * <ul> * * <li><strong>$M</strong> - Replaced by the module prefix for the * application module processing this request.</li> * * <li><strong>$P</strong> - Replaced by the <code>path</code> property of * the specified {@link ForwardConfig}, prepended with a slash if it does * not start with one.</li> * * <li><strong>$$</strong> - Replaced by a single dollar sign * character.</li> * * <li><strong>$x</strong> (where "x" is any charater not listed above) - * Silently omit these two characters from the result value. (This has * the side effect of causing all other $+letter combinations to be
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -