在Spring MVC中如何请求完整的查询字符串?

12

在Spring MVC中,我可以通过以下方式获取查询字符串上items的值:

    public void sendMessage(HttpServletResponse response,
                           @RequestParam("Session Id") String sessionId,

但是我如何将整个查询字符串作为一个长字符串获取呢?即我不想从中获取各个参数,我需要整个查询字符串。

非常感谢!

4个回答

14

HttpServletRequest作为方法的参数添加,并从请求中获取查询字符串:

public void sendMessage(HttpServletRequest request,
                        HttpServletResponse response {
    String queryString = request.getQueryString();
}

4

如果您不想在控制器中使用HttpServletRequest,可以创建HandlerMethodArgumentResolver来解析查询字符串。

例如:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface QueryString {
}


public class QueryStringResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        Annotation[] parameterAnnotations = parameter.getParameterAnnotations();
        for (Annotation parameterAnnotation : parameterAnnotations) {
            if (QueryString.class.isInstance(parameterAnnotation)) {
                return true;
            }
        }

        return false;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,                                 WebDataBinderFactory binderFactory) throws Exception {
        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
        return request.getQueryString();
    }
}


<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <bean class="mypackage.QueryStringResolver"/>
    </mvc:argument-resolvers>
</mvc:annotation-driven>


public class MyController {
    @RequestMapping(...)
    public String someMethod(@QueryString String queryString) {
        ...
    }
}


这是Spring风格的代码。 - msangel

3
你需要做的类似于这样:
    public void sendMessage(HttpServletResponse response,
                               @RequestParam("Session Id") String sessionId, HttpServletRequest request,..
    {
   String qString= request.getQueryString();

诅咒你比我快,但+1因为你做对了 :) - Paul
哈哈!刷新后的第一个,最近在其他项目中也做了同样的事情。所以,快速回答。 - kosa
很遗憾,你的答案没有被接受。我注意到那些声望高的人会迅速给出一个答案以获取早期时间戳,然后再回去填写细节。也许这就是获得大量声望的诀窍...虽然我不太在意这样的事情。至少你和我知道你先写下了代码 :) - Paul
也许你的诅咒成真了(眨眼),哈哈!?我也观察到了同样的模式。不知怎么的,我喜欢JB Nizet的回答和他对很多话题的深入了解。我在这里学到了很多,所以不用担心声望。 - kosa
我同意......通过回答问题,我学到了很多。我也曾经被回答问题的人拯救了很多次(并从中学到了更多)。 - Paul

0

控制器本身知道整个查询字符串的内容。

public ModelAndView handleRequest(HttpServletRequest request,
        HttpServletResponse response) throws Exception

然后,您可以从中获取完整的查询字符串:

request.getQueryString();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接