• SSH框架之Struts(4)——Struts查漏补缺BeanUtils在Struts1中


      在上篇博客SSH框架之Struts(3)——Struts的执行流程之核心方法,我们提到RequestProcessor中的processPopulate()是用来为为ActionForm 填充数据。它是怎么实现将表单数据放入到一个ActionForm中的呢?——第三方工具。BeanUtils,相对来说,这是一个很重要的用来操作javaBean的服务


        public static void populate(
                Object bean,
                String prefix,
                String suffix,
                HttpServletRequest request)
                throws ServletException {
    
            // Build a list of relevant request parameters from this request
            HashMap properties = new HashMap();
            // Iterator of parameter names
            Enumeration names = null;
            // Map for multipart parameters
            Map multipartParameters = null;
    
            String contentType = request.getContentType();
            String method = request.getMethod();
            boolean isMultipart = false;
    
            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);
                } 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);
                }
            }
    
        }
    


      这段实现的前半部分是关于上传的代码,假设用到上传功能的能够细致阅读下面前边部分的代码。我们这里不做解释,能够往下看。


        if (!isMultipart) {
                names = request.getParameterNames();
    
            }


      这是用来获取到表单全部的名称。进而为属性值的Copy和转换做准备


            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);
                } 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);
                }
    


      遍历表单全部的名称,并通过parameterValue = request.getParameterValues(name);获得名称相应的value值。之后就是通过properties.put(stripped, parameterValue);将名称作为key。名称相应的值作为value放入到map中。

                
            // 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);
                }
            }
    
        }
    


      在这里,主要是调用第三方服务BeanUtils来实现属性值的转换和赋值。这种方法会遍历ActionForm的值的类型。而且讲Map中的值的类型改为和ActionForm相应的类型。

    到这里processPopulate的方法就实现完成。BeanUtils的populate方法是将从form表单取到的名称和值映射到相应的ActionForm中,源代码例如以下


        public static void populate(Object bean, Map properties)
            throws IllegalAccessException, InvocationTargetException {
    
            // Do nothing unless both arguments have been specified
            if ((bean == null) || (properties == null)) {
                return;
            }
            if (log.isDebugEnabled()) {
                log.debug("BeanUtils.populate(" + bean + ", " +
                        properties + ")");
            }
    
            // Loop through the property name/value pairs to be set
            Iterator names = properties.keySet().iterator();
            while (names.hasNext()) {
    
                // Identify the property name and value(s) to be assigned
                String name = (String) names.next();
                if (name == null) {
                    continue;
                }
                Object value = properties.get(name);
    
                // Perform the assignment for this property
                setProperty(bean, name, value);
    
            }
        }
    


      BeanUtils.populate(bean, properties);运行完,至此,完毕了form表单数据到ActionForm的映射。

        BeanUtils作为一个操作javaBean的第三方服务,这里引出BeanUtils,下篇通过实例来了解和学习BeanUtils。




  • 相关阅读:
    myeclipse/eclipse安装反编译插件jadclipse
    【java报错】Unknown character set index for field '224' received from server.
    myeclipse安装插件phpeclipse后进行PHP代码编写
    MyEclipse/Eclipse安装插件的几种方式
    利用eclipse调试ofbiz之debug使用
    SAE如何使用Git
    Git入门及上传项目到github中
    Smarty模板快速入门
    访问WEB-INF目录中的文件
    httprunner系列06——参数化&csv文件
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6789103.html
Copyright © 2020-2023  润新知