Hi,

I have read the servlet 3.0 spec and play around with some simple examples.

I setup a very simple annotated servlet:

==
package annotation;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(value = "/param", name= "param", initParams = {
        @WebInitParam(name = "foo", value = "Hello "),
        @WebInitParam(name = "bar", value = " World!") })
public class ParamServlet extends HttpServlet {

        public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws IOException, ServletException
          {
            PrintWriter out = res.getWriter();
            out.println(getInitParameter("foo"));
            out.println(getInitParameter("bar"));
          }
}
===

Next the with parameter overwriting don't work with current trunk!

=== web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee";
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd ">
    <servlet>
        <servlet-name>param</servlet-name>
        <servlet-class>annotation.ParamServlet</servlet-class>
        <init-param>
            <param-name>foo</param-name>
            <param-value>hello</param-value>
        </init-param>
        <init-param>
            <param-name>bar</param-name>
            <param-value>peter</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>param</servlet-name>
        <url-pattern>/param1</url-pattern>
    </servlet-mapping>
</web-app>
====

I read the servlet 3.0 (November 2009 final version) chapter "8.2.3 Assembling the descriptor from web.xml, web- fragment.xml and annotations". At page 81 8.2.3.3.n) are describe following override rule:

n. Any metadata specified via an annotation that isn’t already present in the
descriptor will be used to augment the effective descriptor.
i. Configuration specified in the main web.xml or a web fragment takes
precedence over the configuration specified via annotations.
ii. For a servlet defined via the @WebServlet annotation, to override values via the descriptor, the name of the servlet in the descriptor MUST match the name of the servlet specified via the annotation (explicitly specified or the
default name, if one is not specified via the annotation).
iii. Init params for servlets and filters defined via annotations, will be overridden in the descriptor if the name of the init param exactly matches the name specified via the annotation. Init params are additive between the
annotations and descriptors.
iv. url-patterns, when specified in a descriptor for a given servlet name
overrides the url patterns specified via the annotation.
v. For a filter defined via the @WebFilter annotation, to override values via the descriptor, the name of the filter in the descriptor MUST match the name of the filter specified via the annotation (explicitly specified or the default
name, if one is not specified via the annotation).
vi. url-patterns to which a filter is applied, when specified in a descriptor
for a given filter name overrides the url patterns specified via the
annotation.
vii. DispatcherTypes to which a filter applies, when specified in a descriptor for
a given filter name overrides the DispatcherTypes specified via the
annotation.
viii. The following examples demonstrates some of the above rules -

I think this define that web.xml or a fragment definition can overwrite annotation defaults.
Also we must merge web.xml definition with annotation parameters.

OK!

But Tomcat 7 currently don't support this:

--- java/org/apache/catalina/startup/ContextConfig.java (revision 937984)
@@ -1890,17 +1890,34 @@

     protected void processAnnotationWebServlet(String className,
             AnnotationEntry ae, WebXml fragment) {
      if (fragment.getServlets().containsKey(className)) {
            // Skip this annotation. Entry in web.xml takes priority
            return;
      }

I am now start to correct the implementation.
Why the TCK don't show errors?

Peter


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to