【问题标题】:Retrieve a list of all GET params?检索所有 GET 参数的列表?
【发布时间】:2014-12-14 09:41:46
【问题描述】:

有没有一种简单的方法可以使用 CDI 注入快速获取 URL 中所有 GET 参数的列表?

我正在寻找的是这样的:

@Inject
Map<String, String> allGetParams;

【问题讨论】:

  • 我拥有的是一堆使用许多 GET 参数来显示正确数据的 facelets。现在,在每一页上,我都可以选择语言,这意味着每条信息都以多种语言提供。所以我想保留所有参数,但更改语言参数。因此,我需要所有 GET 参数的列表,循环遍历它们并更改语言参数。我不会说这是一个罕见的情况,因为每个具有多种语言的 CMS 都应该有一个功能可以恢复。最好的方法是什么?
  • 不,没有直接提供这个的bean。您需要创建自己的生产者方法。

标签: jsf jakarta-ee dependency-injection get cdi


【解决方案1】:

正如之前所说,您没有开箱即用,但您可以像在 CDI 1.1+ 中那样生成它

public class MyProducer {

    @Produces
    @RequestScoped
    Map<String,String[]> produceParamMap(HttpServletRequest request) {
        return request.getParameterMap();
    }

}

在 CDI 1.0 中,您必须使用 Apache Deltaspike servlet module 并编写几乎相同的内容

public class MyProducer {

    @Produces
    @RequestScoped
    Map<String,String[]> produceParamMap(@Deltaspike HttpServletRequest request) {
        return request.getParameterMap();
    }

}

编辑:更多细节

生产者(使用@Produces 注释声明)是一种在 CDI 中声明 bean 的方法。这样的 bean 可以像其他任何 bean 一样被注入。就是这样:

@Inject
Map<String,String[]> params;

所以你不调用生产者方法,它是使用它来实例化 bean 的 CDI 容器。

当你声明一个带参数的生产者方法时,容器会寻找匹配这些参数的bean,以便调用该方法。在启动时检查这些 bean 的存在,如果它们不存在则抛出异常(就像任何带有不满意 bean 的注入点一样)。

在这两种情况下,HttpServletRequest 类型的 bean 都是由 CDI 实现 (CDI 1.1+) 或 Deltaspike 框架 (CDI 1.0) 为您提供的。

【讨论】:

  • 哇!完整的例子!非常感谢!问:我怎么称呼它?我从哪里可以得到HttpServletRequest
  • @Socrates 我添加了关于生产者及其用途的说明。我认为您应该花点时间阅读 CDI 规范:docs.jboss.org/cdi/spec/1.2/cdi-spec.html,或者如果不想这样做,请阅读 Weld 文档:docs.jboss.org/weld/reference/latest-2.2/en-US/html
  • 会的!无论如何,非常感谢你!你已经帮了我很多了!并感谢您的链接!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多