【问题标题】:Replace a context-param element with a Servlet 3.0 annotation用 Servlet 3.0 注释替换 context-param 元素
【发布时间】:2011-12-19 16:21:08
【问题描述】:

给定:一个 Java EE 5 Web 应用程序,其 web.xml 具有类似 sn-p 的属性

<context-param>
    <description>c</description>
    <param-name>a</param-name>
    <param-value>b</param-value>
</context-param>

我需要做些什么才能将该上下文参数规范移动到基于注释的策略中。

【问题讨论】:

  • 我不确定您是否可以使用注释来做到这一点。 Servlet 上下文参数是容器范围的。因此我什至不知道你应该把它们放在哪里(把它们放在任何特定的 Servlet 旁边没有多大意义)。 ServletContextInitializer 似乎是最合适的,但我认为这是不可能的。

标签: jakarta-ee servlets annotations


【解决方案1】:

您可以在javax.servlet.annotation 包摘要中找到所有javax.servlet 注释:

  • @HandlesTypes 这个注解用来声明ServletContainerInitializer 可以处理的类类型。
  • @HttpConstraint 此注解在ServletSecurity 注解中使用,表示将应用于所有HTTP 协议方法的安全约束,在ServletSecurity 注解中没有出现相应的HttpMethodConstraint 元素。
  • @HttpMethodConstraint 此注解在ServletSecurity 注解中使用,表示特定 HTTP 协议消息的安全约束。
  • @MultipartConfig 可以在 Servlet 类上指定的注解,指示 Servlet 的实例期望符合 multipart/form-data MIME 类型的请求。
  • @ServletSecurity 此注解用于 Servlet 实现类,以指定 Servlet 容器对 HTTP 协议消息实施的安全约束。
  • @WebFilter 用于声明 servlet 的注解 Filter
  • @WebInitParam 此注解用于ServletFilter 实现类以指定初始化参数。
  • @WebListener这个注解用来声明一个WebListener。
  • @WebServlet 用于声明 servlet 的注解。

你看,没有什么能比得上@WebContextParam。这也或多或少有意义;你会/可以设置什么样的课程?

一些依赖于上下文参数的基于 Servlet 的框架,例如 JSF,也允许通过 JNDI 设置其中的一些参数。你可能想调查一下。或者,如果它涉及本地代码,那么我会看看 @WebInitParam 是否对您来说不是一个更可行的选择。

【讨论】:

  • 我认为像 @WebContextParam 这样的东西在 servlet 上会很有用,作为将上下文参数注入多个工件的一种方式(与单个 servlet/过滤器的 @WebInitParam 形成对比)。
  • 我会接受这个答案。这是我所问的答案……但不是我真正想问的。我将打开一个新问题来问“我想问什么”......
【解决方案2】:

如果您使用的是 Tomcat,则可以使用 context.xml 中的 Parameter 标签,它与 web.xml 中的上下文参数相同。 所以你可以使用@WebInitParam 来捕获上下文变量。

http://tomcat.apache.org/tomcat-5.5-doc/config/context.html#Context_Parameters

【讨论】:

  • 不完全确定这是否能回答问题。我认为问题可能是关于如何在注释策略中定义参数,而不一定要访问它。 (但我可能是错的,所以不要投反对票)
【解决方案3】:

我认为我们不能使用 "Annotation"context-param 进行硬编码,因为这背后有一个合乎逻辑的原因:我相信你们知道注释是总是硬编码在 Servlet 中,并且 Servlet 永远不会被 container 加载到内存中以服务客户端请求,直到客户端发出 第一个请求(请阅读 Servlet 生命周期)

那么,如果我们想从 "context-param" 中获取值,会发生什么情况呢?并且带有 context-param 注释的 Servlet wrapped 仍未加载到内存中,因此我们无法获取 object for context :)

我想现在你们很容易猜到为什么我们不能在 context-param 的情况下使用 Annotation,因为我们需要使用任何特定的 servlet 对该 Annotation 进行硬编码,而我们不能这样做。 ......

【讨论】:

    【解决方案4】:

    可以使用@WebServletContextListener 指定servlet 内容侦听器遇到的数据。例如,

     @WebServletContextListener 
    
    public class TestServletContextListener implements javax.servlet.ServletContextListener { 
        public void contextInitialized(ServletContextEvent sce) { 
    
        } 
    
        public void contextDestroyed(ServletContextEvent sce) { 
            .... 
        } 
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-02
      • 2014-09-08
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      相关资源
      最近更新 更多