这里我们看看常用的几种指定 URL 的方式，这些设置都在 url-pattern 节点设置；

假设我们想访问 helloworld 包的 hello 类，这个 servlet 程序：

1、不做任何设置，tomcat 会有一个默认的设置。我们可以使用：

http ://localhost:8080/servlet/helloworld.hello；

2、自己定义一个网址映射，告诉 tomcat 怎样处理提交过来的网址，在 web.xml 中增加以下内容：

<servlet>

<servlet-name>hello</servlet-name>

<servlet-class>helloworld.hello</servlet-class>

</servlet>

<!-- ... -->

<servlet-mapping>

<servlet-name>hello</servlet-name>

<url-pattern>/hello</url-pattern>

</servlet-mapping>

这样，我们就可以通过以下方式访问这个 servlet 了，与访问网页一样：

http ://localhost:8080/hello

3、其他还有几种特殊的设置方式，这些设置都是出于开发者调用 servlet 的需要，不是必须的：

精确路径匹配。例子：比如servletA 的url-pattern为 /test，servletB的url-pattern为 /* ，这个时候，如果我访问的url为http://localhost/test ，这个时候容器就会先进行精确路径匹配，发现/test正好被servletA精确匹配，那么就去调用servletA，也不会去理会其他的servlet了。

最长路径匹配。例子：servletA的url-pattern为/test/*，而servletB的url-pattern为/test/a/*，此时访问http://localhost/test/a时，容器会选择路径最长的servlet来匹配，也就是这里的servletB。

扩展匹配，如果url最后一段包含扩展，容器将会根据扩展选择合适的servlet。例子：servletA的url-pattern：*.action

如果前面三条规则都没有找到一个servlet，容器会根据url选择对应的请求资源。如果应用定义了一个default servlet，则容器会将请求丢给default servlet（“/” 是用来定义default servlet映射的。）。

在 url-pattern 元素内指定的 URL 必须以/开始。若 URL 以/*开始，那么它会匹配所有相同前缀的请求。为获取真实的请求，你可以检查由当前页面的 getRequestPath 方法返回的值。

public void service(Page page) {

if ("/some/more/hi".equals(page.getRequestPath()) {

...

}

}

假设有如下请求的路径：

http://192.168.1.191:8083/CitizenWeb/TestServlet?ywdm=01&czmd=02&dd=00030

1. /CitizenWeb

request.getContextPath();

2. TestServlet

request.getRequestURI().substring(request.getRequestURI().lastIndexOf("/") + 1);

3. /CitizenWeb/TestServlet

request.getRequestURI();

4. http://192.168.1.191:8083/CitizenWeb/TestServlet

request.getRequestURL()

5. dd=00030&ywdm=01&czmd=02

getUrl(request)

private String getUrl(HttpServletRequest request)

{

String url = "";

Enumeration param = request.getParameterNames();

while (param.hasMoreElements()) {

String pname = param.nextElement().toString();

if (!pname.equalsIgnoreCase("pagenum") && !pname.equalsIgnoreCase("submit"))

url += pname + "=" + request.getParameter(pname) + "&";

}

if (url.endsWith("&")) {

url = url.substring(0, url.lastIndexOf("&"));

}

return url;

}

6. http://192.168.1.191:8083/CitizenWeb/TestServlet?ywdm=01&czmd=02&dd=00030

request.getRequestURL()+"?"+getUrl(request)；