google developers 上的一篇文章,原文见:https://developers.google.com/appengine/docs/java/config/webxml#Servlets_and_URL_Paths
*不是百分之百的原文翻译,这里翻译的比较口语化,并且有我自己的理解。
web.xml中定义了访问路径和servlet之间的映射,也就是定义了当用户访问某个路径的时候,调用哪个servlet进行处理。web server会根据这里的配置决定调用某个类某个方法。比如说对于HTTP GET访问会调用相应的doGet方法。
想要定义一个url到servlet的映射,要先定义<servlet>,然后在<servlet-mapping>中定义url到servlet的映射。
<servlet>标签用来声明servlet,包括servlet的名称(在web.xml中可以被其他元素引用),servlet对应的类,还有初始化的参数<init-param>。可以基于一个类声明多个servlet,但是初始化参数不一样。servlet的名称必须唯一。
类相同,初始化参数不同的例子:
<servlet>
<servlet-name>redteam</servlet-name>
<servlet-class>mysite.server.TeamServlet</servlet-class>
<init-param>
<param-name>teamColor</param-name>
<param-value>red</param-value>
</init-param>
<init-param>
<param-name>bgColor</param-name>
<param-value>#CC0000</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>blueteam</servlet-name>
<servlet-class>mysite.server.TeamServlet</servlet-class>
<init-param>
<param-name>teamColor</param-name>
<param-value>blue</param-value>
</init-param>
<init-param>
<param-name>bgColor</param-name>
<param-value>#0000CC</param-value>
</init-param>
</servlet>
<servlet-mapping>标签定义了url到servlet之间的映射,这里的url定义的是一种url模式,匹配这个模式的url都会转给servlet处理。url模式可以用星号:* 做模糊匹配,但是不支持字符串中间使用通配符,也不支持一次使用多个*。
在url模式中使用通配符的例子:
<servlet-mapping>
<servlet-name>redteam</servlet-name>
<url-pattern>/red/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>blueteam</servlet-name>
<url-pattern>/blue/*</url-pattern>
</servlet-mapping>
在上面的例子中,请求 http://www.example.com/blue/teamProfile 请求会被TeamServlet处理,servlet使用getPathInfo方法截取请求路径判断是否匹配url模式。
servlet可以用本身的getServletConfig方法来取得初始化参数,再通过getInitParameter方法,将参数名称传入,取得参数的值。
String teamColor = getServletConfig().getInitParameter("teamColor");