项目中的路径问题:
-
在项目中有时候对路径需要进行判断,我们可以按照以下方式得到判断,但是几种有所区别:
System.out.println("getServletPath"+hreq.getServletPath());不包含项目名称 如:/login.jsp System.out.println("getRequestURL"+hreq.getRequestURL());完整的访问路径,也就是获得统一资源定位符,保含了协议 端口号 ip地址 项目名称 请求的资源的名称等信息 如:http://localhost:8090/JAVAWEB20191106/login.jsp System.out.println("getRequestURI"+hreq.getRequestURI());(资源名称,获得统一资源标识符)。不保含协议 ip地址端口号等信息 如:/JAVAWEB20191106/login.jsp Request.getContextPath():得到项目根目录
-
路径最前面的/写在不同的位置代表不同的含义
- 重定向的时候。路径最前面的/代表的不是web项目根目录,代表的是tomcat服务的跟目录:http://localhost:8090/
- 请求转发的时候:路径最前面的/代表的是项目的根目录
- 超链接的href属性中,表单的action中:路径最前面的/代表的是tomcat服务的根目录,不是所在的web项目的根目录
- Web.xml中配置servlet的时候:路径最前面的/代表的是web项目的根目录
-
请求转发的路径问题
建议在Jsp页面中使用绝对路径,有时候从a请求转发到b,在b中如果写相对路径去其它资源中,会以a的路径作为相对参照点,不会以b的路径作为相对参照点
当一个url与多个servlet的匹配规则可以匹配的时候,举例说明匹配的优先级
-
路径优先级的问题
1)servlet1 的url-pattern是 /test,servlet2的url-pattern是 /* ,访问的url为localhost:8080/test ,容器就会先进行完全路径匹配,发现/test正好被servlet1精确匹配,那么就去调用servlet1,不会去管servlet2
2)servlet1的url-pattern为/test/,servlet2的url-pattern为/test/a/,访问的url是localhost:8080/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servlet2
3)servlet1的url-pattern是*.action ,servlet2的url-pattern为 /* ,访问的url为localhost:8080/test.action,这个时候容器就会优先进行路径匹配,而不是去匹配扩展名,这样就去调用servlet2