Servlet深入、匹配规则、ServletContext
一个Servlet程序。
Servlet的三种创建方式
1、实现javax.servlet.Servlet接口
2、继承javax.servet.GenericServlet类(适配器模式)
3、继承javax.servlet.http.HttpServlet类(模板方法设计模式)==>主要使用
Servlet(接口) --> GenericServlet(抽象类) --> HttpServlet(抽象类) (继承GenericServlet)
一、servlet映射细节
1.1、可以配置多个映射路径
1.2、servlet的url-pattern匹配规则、匹配顺序
1)精确匹配(配置的项必须与url完全精确匹配):如 url-pattern: /user/users.html 、 /user/loginServlet
2)路径匹配((以“/”字符开头,并以“/*”结尾的字符串用于路径匹配)先最长路径匹配,再最短路径匹配):如 /user/* 优先于 /*
3)扩展名匹配(以“*.xx”开头的字符串被用于扩展名匹配):url-pattern: *.do 以.do结尾的请求都可以访问。注意:不要加/
4)缺省匹配:以上都找不到servlet,就用默认的servlet,配置为<url-pattern>/</url-pattern>。
四种匹配规则:
优先级:从高到低
精确匹配--> 路径匹配 --> 扩展名匹配-->缺省匹配
如果url-pattern的值是/,表示执行默认映射。所有资源都是servlet。
1.3、需要注意的问题:
1、路径匹配和扩展名匹配无法同时设置
匹配的方法,要么是精确匹配,要么是路径匹配,要么是扩展名匹配。三种方法不能进行组合。不要想当然使用通配符或正则规则。
如<url-pattern>/user/*.action</url-pattern>是非法的。
另外注意:<url-pattern>/aa/*/bb</url-pattern>是精确匹配,合法,这里的*不是通配的含义
2、" /* "和" / "的区别
“ /* ”属于路径匹配。并且能够匹配所以偶的request。由于路径匹配优先级仅次于精确匹配,所以“ /* ”会覆盖所有的扩展名匹配。是一种特别恶劣的匹配模式,一般只用于filter的url-pattern。
“ / ”是Servlet中的特殊匹配模式,且该模式有且仅有一个实例,优先级最低,不会覆盖其他任何的url-pattern。,只会替代servlet容器的内建default servlet。该模式同样会匹配所有request。
3、配置“ / ”后,一种可能的现象是myServlet会拦截诸如http://localhost:8080/appDemo/user/addUser.action、http://localhost:8080/appDemo/user/updateUser的格式的请求,但是并不会拦截http://localhost:8080/appDemo/user/users.jsp、http://localhost:8080/appDemo/index.jsp,这是应为servlet容器有内置的“*.jsp”匹配器,而扩展名匹配的优先级高于缺省匹配,所以才会有上述现象。
注意:
url:"${pageContext.request.contextPath }/testRequestJson.action",可以访问到 @RequestMapping("/testRequestJson")
存在后缀依然可以访问到。
Tomcat在%CATALINA_HOME%\conf\web.xml文件中配置了默认的Servlet,配置代码如下:
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>fork</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>xpoweredBy</param-name> <param-value>false</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- The mappings for the JSP servlet --> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspx</url-pattern> </servlet-mapping>
“/*”和“/”均会拦截静态资源的加载,需要特别注意
举例:
映射的URL 对应的Servlet
/hello servlet1
/bbs/admin/* servlet2
/bbs/* servlet3
*.jsp servlet4
/ servlet5
去掉上下文路径的剩余路径 处理请求的Servlet
/hello servlet1
/bbs/admin/login servlet2
/bbs/admin/index.jsp servlet2
/bbs/display servlet3
/bbs/index.jsp servlet3
/bbs servlet3
/index.jsp servler4
/hello/index.jsp servlet4
/hello/index.html servlet5
/news servlet5
1.4、Servlet获取配置信息
ServletConfig的使用
作用1:获取servlet配置信息
也就是web.xml的配置信息

作用2:获取ServletContext对象。
二、ServletContext(重要)
ServletContext: 代表的是整个应用。一个应用只有一个ServletContext对象。单实例。===》如何实现???
作用:
域对象:在一定范围内(当前应用),使多个Servlet共享数据。
常用方法:
void setAttribute(String name,object value);//向ServletContext对象的map中添加数据
数据:
Object getAttribute(String name);//从ServletContext对象的map中取数据
void rmoveAttribute(String name);//根据name去移除数据。
2.1、获取全局布置信息==>即web.xml中的内容
<servlet> <servlet-name>ServletDemo1</servlet-name> <servlet-class>com.payn.servlet.ServletDemo1</servlet-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </servlet>
String getInitParameter(String name) //根据配置文件中的key得到value
2.2、获取资源路径
String getRealPath(String path);//根据资源名称得到资源的绝对路径.
可以得到当前应用任何位置ide资源。

浙公网安备 33010602011771号