您的位置:首页 > 编程语言 > Java开发

JavaEE细节问题04——Servlet细节问题

2015-08-17 21:30 537 查看

1.<url-patten>的优先级问题

大家都知道,在web.xml中可以通过配置<servlet>和<servlet-mapping>来让一个servlet真正跑起来,而让服务器通过URL定位到

具体serlvet的标签就是通过<url-patten> ---> <servlet-name> ---> <servlet-class>

这样的定位方式,那么,用户在访问url的时候,到底调用的是哪个serlvet呢?

这里就涉及到了<url-patten>的优先级问题:

在配置<url-patten>的时候,遵循如下原则:

精确匹配的优先级最高 /* 的优先级比 *.扩展名高

2.缺省Servlet和访问静态web资源的本质

如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。

凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,

也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。

在<tomcat的安装目录>\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,

并将这个Servlet设置为了缺省Servlet。

当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet。



3.改写Servlet生命周期,设置为自启动

Servlet一般情况下是在用户第一次请求时创建和初始化

但是通过配置web.xml中的<servlet>中的<load-on-startup>标签,就能够实现Servlet的自启动

其中的值最好比1大,因为1是缺省Servlet

web.xml

<servlet>
<!--代表加载顺序,数字越小越有限加载,取值只能是(1,2,3,...) -->
<load-on-startup>2</load-on-startup>
</servlet>


4.创建一个Servlet对象不止一种方式

1.继承HttpServlet

2.继承GenericServlet

3.实现Servlet接口

5.ServletConfig对象的细节

其实这个对象的功能很简单,就是获取Servlet的初始化参数,也就是获取配置在<init-param>标签里的键值对。



ServletConfig对象的方法:

如API所示,里面提供了4中方法。



分别是:

getInitParameter(String name) 获取一个初始化参数,传入<param-name>中的值,返回<param-value>中的值。

getInitParameterNames() 获取一个包含所有<param-name>中值的枚举

getServletContext() 返回一个ServletContext对象

getServletName() 获取当前的Servlet名称,即<servlet-name>中的值

在HttpServlet的子类中获取其对象可以有两种方式:

1.ServletConfig sc = this.getServletConfig();

2.重写init(ServletConfig config)方法,将作为参数的ServletConfig对象返回给一个成员变量

private ServletConfig config;
public void init(ServletConfig config) throws ServletException {
this.config = config;
}



那么问题来了,这个子类是如何获取到ServletConfig对象的呢?

首先这个类继承了HttpServlet,那么我们看一下HttpServlet的源码:



这样就可以看出,我们的HttpServlet中也没有提供相应的方法,那我们就去他们的父类GenericServlet看看



在GenericServlet中有getServletConfig()和init(ServletConfig config)方法,底层实现其实很简单:



这时候有一个疑惑,那么实际上这个config对象又是如何产生的呢?是怎么被传进来的呢?

这时候就要看API的解释了



API解释说,ServletConfig对象实际上是Servlet容器产生的,也就是说是Tomcat实例化了他的对象!

实际上不仅仅是ServletConfig,包括ServletContext,ServletRequest,ServletResponse,这些对象都是Tomcat实例化的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: