【问题标题】:How to access `ServletContext` from within a Vaadin 14 app?如何从 Vaadin 14 应用程序中访问“ServletContext”?
【发布时间】:2020-01-01 04:48:13
【问题描述】:

我问的问题与How to access ServletContext from within a Vaadin 7 app? 相同,但针对的是 Vaadin 14。

在 Vaadin 7 中,Vaadin 提供了简单方便的调用:

ServletContext servletContext = VaadinServlet.getCurrent().getServletContext();

在 Vaadin 14 中,VaadinServlet 上不再存在该特定呼叫。

➥ 在 Vaadin API 的其他地方是否有等价物?

我的最终目标是使用键值“属性”集合来保留对我的应用程序范围对象的引用。

【问题讨论】:

    标签: servlets vaadin vaadin-flow


    【解决方案1】:

    方法仍然存在,但没有记录

    两种方法:

    ……在 Vaadin 14 中还有吗?

    似乎第二种方法 VaadinServlet::getServletContext() 没有在 Javadocs 中列出,因为它是从 javax.servlet.GenericServlet 继承的,并且 Javadoc 生成是以无权访问该类的方式运行的。

    【讨论】:

      【解决方案2】:

      VaadinContext

      对于从ServletContext 访问属性的特殊情况,Vaadin 14 中引入了一个新的VaadinContext 抽象。添加它是为了使框架内部可以访问上下文属性而无需绑定到 Servlet API。可以使用VaadinService.getCurrent().getContext()访问。

      VaadinContext 可以按类跟踪属性:

      【讨论】:

        【解决方案3】:

        更新:Answers by Leif Åstrand 之一解释说这两种方法实际上都存在于 Vaadin 14 中,但一种没有记录。

        我确认我们确实可以调用:

        ServletContext servletContext = VaadinServlet.getCurrent().getServletContext();
        

        所以我的答案的其余部分已经过时了。我将把我的答案留作好奇,而不是删除它。


        这可能不是最好的方法,但它似乎对我有用。

        VaadinServletService 类扩展了com.vaadin.flow.server.VaadinService,提供了getCurrentServletRequest()。该方法返回一个javax.servlet.http.HttpServletRequest 对象。为此,我们可以调用javax.servlet.ServletRequest.getServletContext 来返回您想要的javax.servlet.ServletContext

        ServletContext servletContext = 
                VaadinServletService            // com.vaadin.flow.server.VaadinServletService
                .getCurrentServletRequest()     // Returns a javax.servlet.http.HttpServletRequest
                .getServletContext()            // Returns a `javax.servlet.ServletContext`. 
        ;
        

        从那里您可以使用您提到的键值“属性”集合。查看setAttributegetAttributeremoveAttribute 方法,其中String 对象作为键,Object 作为值。

        正在保存。

        DataSource dataSource = … ; 
        VaadinServletService.getCurrentServletRequest().getServletContext().setAttribute( "javax.sql.DataSource" , dataSource ) ;
        

        检索。 “属性”的键值集合将值保持为Object,因此我们必须转换回预期的类/接口。

        DataSource dataSource = (DataSource) VaadinServletService.getCurrentServletRequest().getServletContext().getAttribute( "javax.sql.DataSource" ) ;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-22
          • 1970-01-01
          • 2015-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多