JavaEE细节问题04——Servlet细节问题
博客专区 > Lunqi 的博客 > 博客详情
JavaEE细节问题04——Servlet细节问题
Lunqi 发表于3年前
JavaEE细节问题04——Servlet细节问题
  • 发表于 3年前
  • 阅读 47
  • 收藏 0
  • 点赞 0
  • 评论 0

移动开发云端新模式探索实践 >>>   

摘要: 很多东西虽然“会了”,但是再次学习总会有不一样的收获!

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实例化的!




  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
Lunqi
粉丝 39
博文 31
码字总数 29786
作品 1
×
Lunqi
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: