Jakarta ee 用Servlet 3.0注释替换上下文参数元素

Jakarta ee 用Servlet 3.0注释替换上下文参数元素,jakarta-ee,servlets,annotations,Jakarta Ee,Servlets,Annotations,给定:一个Java EE 5 web应用程序,其web.xml具有类似 <context-param> <description>c</description> <param-name>a</param-name> <param-value>b</param-value> </context-param> C A. B 我需要做什么才能将该上下文参数规范转变为基于注释的策

给定:一个Java EE 5 web应用程序,其web.xml具有类似

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

C
A.
B

我需要做什么才能将该上下文参数规范转变为基于注释的策略。

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

  • 此注释用于声明
    ServletContainerInitializer
    可以处理的类类型
  • 此注释在
    ServletSecurity
    注释中使用,以表示应用于所有HTTP协议方法的安全约束,对于这些方法,
    ServletSecurity
    注释中未出现相应的
    HttpMethodConstraint
    元素
  • 此注释在
    ServletSecurity
    注释中用于表示特定HTTP协议消息的安全约束
  • 可以在
    Servlet
    类上指定的注释,指示
    Servlet
    的实例期望符合多部分/表单数据MIME类型的请求
  • 此注释用于
    Servlet
    实现类,以指定Servlet容器在HTTP协议消息上实施的安全约束
  • 用于声明servlet
    过滤器的注释
  • 此注释用于
    Servlet
    Filter
    实现类,以指定初始化参数
  • 此注释用于声明WebListener
  • 用于声明servlet的注释
你看,没有什么比得上
@WebContextParam
。这也或多或少有意义;你会/能安排什么样的课程


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

如果您使用的是Tomcat,您可以在
context.xml
中使用参数标记,它的工作原理与
web.xml
中的上下文参数相同。 因此,您可以使用
@WebInitParam
捕获上下文变量


我认为我们不能使用“注释”硬编码上下文参数,因为这背后有一个逻辑原因:我相信你们知道注释总是硬编码在Servlet中,Servlet永远不会由内存中的容器加载,以服务于客户端请求,直到客户端发出第一个请求(阅读Servlet生命周期)

那么,如果我们想从“context param”中获取值,该值是使用其他Servlet中的注释硬编码的,而使用context param注释包装的Servlet仍然没有加载到内存中,因此我们无法获取context的对象:)


我想现在你们可以很容易地猜到为什么我们不能在上下文参数的情况下使用注释,因为我们需要用任何特定的servlet对注释进行硬编码,而我们不能这样做……

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

 @WebServletContextListener 

public class TestServletContextListener implements javax.servlet.ServletContextListener { 
    public void contextInitialized(ServletContextEvent sce) { 

    } 

    public void contextDestroyed(ServletContextEvent sce) { 
        .... 
    } 
}

我不确定是否可以使用注释来完成。Servlet上下文参数是容器范围的。因此,我甚至不知道应该将它们放在哪里(将它们放在任何特定Servlet旁边没有多大意义)。
ServletContextInitializer
似乎是最合适的,但我认为这是不可能的。我认为类似于
@WebContextParam
的东西在servlet上非常有用,可以将上下文参数注入到多个工件中(与单个servlet/过滤器的
@WebInitParam
相比).我将接受这个答案。这是对我所问问题的回答。。。但不是我真正想问的。我将开始一个新的问题,问‘我想问什么’……不完全确定这是否回答了这个问题。我认为问题可能在于如何在注释策略中定义paramater,而不一定要访问它。(但我可能是错的,所以不要否决投票)