使用注释的Servlet初始化参数

时间:2015-01-18 08:36:45

标签: servlets annotations

我正在尝试学习Servlet注释并遇到了这个片段

@WebServlet(urlPatterns="/MyPattern", initParams={@WebInitParam(name="ccc", value="333")})

这对我有意义。但是,我不明白为什么它不像这样

@WebServlet(urlPatterns="/MyPattern", initParams={(name="ccc", value="333"), (name="abc", value="1")})

所以,问题是当我们已经将属性声明为@WebInitParam时,我们需要放置initParams注释。对我来说这似乎是多余的,或者我错过了什么?

2 个答案:

答案 0 :(得分:0)

你建议的替代方案甚至不会编译。

当您查看JLS时,它会说明:

  

如果声明的方法的返回类型,则是编译时错误   注释类型不是以下之一:基本类型,   String,Class,Class的任何参数化调用,枚举类型   (§8.9),注释类型或元素类型的数组类型(§10)   是以上类型之一。

因此,为了将namevalue组合在一起,它们代表初始化参数,唯一的选择是使用注释(在本例中为@WebInitParam),并将相应的值设置为其参数

答案 1 :(得分:0)

与大多数关于语言设计选择的问题一样,我们只能在这里推测。我认为有一些原因是:

  1. 保持语言简单 它有点冗余,但注释的语法可以重用,不需要新的语言结构。这使得解析和阅读更容易。当然,它更长,但编写注释的名称也更明确。

  2. 请勿限制可能的未来语言增强功能 如果注释支持继承,则建议的语法将不起作用。我不知道这是否是一个有计划的功能,但如果可以省略类型,就不可能直截了当地实现。

  3. 在许多情况下,无论如何,一系列注释似乎都是一种解决方法。在Java 8中可以避免这种情况,您可以在其中添加多个相同类型的注释:

    @WebServlet(urlPatterns="/MyPattern")
    @WebInitParam(name="ccc", value="333")
    @WebInitParam(name="abc", value="1")
    

    (我不知道servlet api是否真的支持这个)