文档章节

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

Lunqi
 Lunqi
发布于 2015/08/17 21:30
字数 865
阅读 51
收藏 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

Lunqi

粉丝 39
博文 35
码字总数 29786
作品 1
杭州
程序员
Servlet3.0提供的异步处理

在以前的Servlet规范中,如果Servlet作为控制器调用了一个耗时的业务方法,那么Servlet必须等到业务方法完全返回之后才会生成响应,这将使得Servlet对业务方法的调用变成一种阻塞式的调用,因...

摆渡者
2014/03/03
0
0
如何成为一个优秀的JSP程序员

一个普通的错误是把JSP当作简化的Java,它不是,(事实上, JSP是简化的Servlet)程序员通常试着没有学习要求的支持技巧而直接学习JSP。JSP是一个衔接技术,并且成功地连接你需要理解的另外的...

五味格子
2011/05/11
0
0
如何现实servlet的单线程模式?

网上朋友的回答是加入<%@ page isThreadSafe=”false”%>这条命令。天啊,我晕!这是什么命令?是jsp的命令啊,怎么会加入到servlet中呢?当然了,jsp的运行实质是servlet机制,这条命令是j...

零度的魚
2014/01/01
0
0
用EJB3.0 简化EJB开发

引入 Enterprise JavaBeans ( EJB ) 是为了构建分布式组件。最初 , 该技术承诺可以解决 CORBA 的所有问题并降低其复杂性。作为J2EE的核心,EJB经历了几次较大的修订,并加入了许多特性,因...

晨曦之光
2012/03/09
0
0
Servlet的一些细节--学习笔记

Servlet细节 1)浏览器访问的url-pattern只是一个符合格式的任意字符串,以/开头 2)一个Servlet的url-pattern可以是1个或多个,有二种形式; a).xx b)/xx/ 注意:/不能一起直接使用 3)/和....

知止内明
04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
33分钟前
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
45分钟前
0
0
20180818 上课截图

小丑鱼00
今天
1
0
Springsecurity之SecurityContextHolderStrategy

注:下面分析的版本是spring-security-4.2.x,源码的github地址是: https://github.com/spring-projects/spring-security/tree/4.2.x 先上一张图: 图1 SecurityContextHolderStrategy的三个......

汉斯-冯-拉特
今天
0
0
LNMP架构(Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl)

Nginx负载均衡 网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时...

蛋黄_Yolks
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部