关于smart获取参数映射的疑问

zmf 发布于 2013/11/27 16:46
阅读 444
收藏 0
// 从请求中获取所有参数(当参数名重复时,用后者覆盖前者)
    public static Map<String, String> getRequestParamMap(HttpServletRequest request) {
        Map<String, String> paramMap = new LinkedHashMap<String, String>();
        try {
            String method = request.getMethod();
            if (method.equalsIgnoreCase("put") || method.equalsIgnoreCase("delete")) {
                String queryString = CodecUtil.decodeUTF8(StreamUtil.toString(request.getInputStream()));
                if (StringUtil.isNotEmpty(queryString)) {
                    String[] qsArray = StringUtil.splitString(queryString, "&");
                    if (ArrayUtil.isNotEmpty(qsArray)) {
                        for (String qs : qsArray) {
                            String[] array = StringUtil.splitString(qs, "=");
                            if (ArrayUtil.isNotEmpty(array) && array.length == 2) {
                                String paramName = array[0];
                                String paramValue = array[1];
                                if (checkParamName(paramName)) {
                                    paramMap.put(paramName, paramValue);
                                }
                            }
                        }
                    }
                }
            } else {
                Enumeration<String> paramNames = request.getParameterNames();
                while (paramNames.hasMoreElements()) {
                    String paramName = paramNames.nextElement();
                    if (checkParamName(paramName)) {
                        String[] paramValues = request.getParameterValues(paramName);
                        if (ArrayUtil.isNotEmpty(paramValues)) {
                            if (paramValues.length == 1) {
                                paramMap.put(paramName, paramValues[0]);
                            } else {
                                StringBuilder paramValue = new StringBuilder("");
                                for (int i = 0; i < paramValues.length; i++) {
                                    paramValue.append(paramValues[i]);
                                    if (i != paramValues.length - 1) {
                                        paramValue.append(StringUtil.SEPARATOR);
                                    }
                                }
                                paramMap.put(paramName, paramValue.toString());
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            logger.error("获取请求参数出错!", e);
            throw new RuntimeException(e);
        }
        return paramMap;
    }



@黄勇 你好,想跟你请教个问题:勇哥,你好,这个是webutil中的获取请求参数映射的方法。获取参数都用第二种方式直接获取不行吗。还有我看网上说put delete请求方式可能有其他web容器不支持,为嘛不都用get post方式呢,或者说您这样做的优点在哪里呢,我真的很迷惑,希望勇哥尽快答疑哈

加载中
0
黄勇
黄勇

使用 get 与 post 是没问题的,但有了 put 与 delete 之后,有两个优点:

1. 语义更加清晰

这四个动词分别对应我们的 CRUD 操作,可以这样理解:

  • get -- Read
  • post -- Create
  • put -- Update
  • delete -- Delete

看到了 URL 就知道是什么类型的操作,这样不是更清晰了吗?

2. 简化 URL 表达方式

同一个 URL,使用不同的动词,可表达不同的语义,比如:

  • get:/product/1 -- 获取 id 为 1 的 Product
  • put:/product/1 -- 更新 id 为 1 的 Product(可在 Request Body 中放入具体更新的字段)
  • delete:/product/1 -- 删除 id 为 1 的 Product
这样的 URL 是否优雅呢?

0
zmf
zmf

嗯,是,put delete方式的请求后台获取参数就不能用getParamterValues()吗,为什么

黄勇
黄勇
很多问题没有为什么,Servlet 规范就是这样的,我们不妨先接受吧。:)
0
Phil-Wu
Phil-Wu

经过测试,get方式请求,可变参数大于1个的时候,参数获取不到。

另外,在tomcat8.0上,部署有问题。

Caused by: java.lang.ClassNotFoundException: org.apache.tools.ant.Task

我记得框架和这个类应该没关系的吧?

0
Phil-Wu
Phil-Wu
  • @Request.Get("/user/{age}/{name}"

age和name获取不到,为什么?

返回顶部
顶部