1.容器如何处理请求资源路径?
比如,在浏览器地址栏输入http://ip:port/appname/abc.html,浏览器会将"/appname/abc.html"作为请求资源路径,放到请求数据包里面,发送给容器。
step1.容器默认认为访问的是一个servlet,也就是说,容器会查找有没有匹配的servlet。
容器会将"/appname/abc.html"中的应用名除掉,得到"/abc.html",然后看web.xml中<url-pattern>有没有匹配的。
<url-pattern>有三种写法:
(1)精确匹配:
要求请求资源路径截取应用名之后剩余部分
必须等于url-pattern的值。
(2)通配符匹配:
使用"*"匹配任意的零个或者多个字符。
比如:
<url-pattern>/*</url-pattern>
<url-pattern>/demo/*</url-pattern>
(3)后缀匹配:
使用"*."开头,后接多个字符。
比如:
<url-pattern>*.do</url-pattern>
上述配置会配置所有以".do"结尾的请求。
step2.如果没有找到匹配的servlet,则容器查找对应位置的文件。
2.如何让一个Servlet处理多种请求?
step1.使用后缀匹配:
<servlet-mapping>
<servlet-name>ActionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
step2.分析请求资源路径,进行相应的处理
//获得请求资源路径
String uri = request.getRequestURI();
System.out.println("uri:" + uri);
//截取请求资源路径的一部分,方便比较
String path =
uri.substring(
uri.lastIndexOf("/"),
uri.lastIndexOf("."));
System.out.println("path:" + path);
//依据请求路径,做相应的处理
if("/list".equals(path)){
System.out.println(
"处理用户列表的请求...");
}else if("/add".equals(path)){
System.out.println(
"处理添加用户的请求...");
}