Servlet
一个servlet就是Java编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序。虽然servlet可以对任何类型的请求产生响应,但通常只用来扩展Web服务器的应用程序。Java Servlet技术为这些应用程序定义了一个特定于HTTP的 servlet类。
服务器端小应用程序
它运行在Servlet容器中,它是由服务器直接解析运行。
Servlet生命周期
1. 创建Servlet对象 调用init方法
2. 通过Service方法处理请求(提交方式是get就调用doget 是post就调用dopost 一般都是get 只有表单才能设置post)
3. 通过destroy方法来销毁Servlet.
我们创建Servlet时 第一次访问 会创建Servlet对象 然后调用init方法. init方法只调用一次
开启一个线程调用Service方法 当下次访问又开启一个线程调用Service方法 Servelt对象一般情况下我们只创建一次 他常驻内存中
当服务器停止.或者Servlet对象销毁时会调用destroy方法
如果Servlet中创建了成员变量,就可能出现线程安全问题 在开发中尽量避免在Servlet中创建成员变量 如果创建了就需要同步
关于Url-pattern配置
一个Servlet允许被多个不同的路径映射
Ur-patternl配置写法
1.完全匹配
要求必须/开始
2.目录配置
/开始*结束 例如:/目录名/*
3.扩展名匹配
*开始.xxx 例如 *.txt
三种配置优先级 完全匹配>目录匹配>扩展名匹配
关于ServletContext功能描述
ServletContext代表整个Web应用
通过 ServeltConfig.getServletContext() 获取ServletContext对象
ServeltContext作用
1. ServeltContext可以获取全局初始化参数
String getInitParameter(String name) 获取指定名称的Context-param 的值
Enumeration getInitParameterNames() 获取所有Context-param名称
在web.xml文件中配置全局初始化参数
<context-param>
<param-name>name</param-name>
<param-value>tom</param-value>
<context-param>
它配置是针对于整个web应用
2 它可以让Servlet实现信息共享
setAttribute(String name,Object value);
getAttribute(String name);
removeAttribute(String name);
3.可以获取路径(资源)
在web开发中 如果想要获取资源 必须使用绝对磁盘路径
通过
1. String getRealPath(String s )
ServletContext.getRealPath("/" ); 得到当前工程磁盘上的绝对路径
2. Url get Resource(String s );
得到一个Url路径,他也是指向web工程下的资源
3. inputStream getResourceAsStream(String s )
得到一个指向资源的输入流
对于classes目录下的文件,它有其它的方式可以获取到.
通过反射获取class文件 class.getResource("/").getPath(); 获取的就是class文件所在的目录绝对路径
关于web路径问题
访问Servlet路径问题
1. 绝对路径
带协议<a href="http://localhost:8080/day-05Servlet/demo> Demo1</a>
这种方式在开发不常用,如果使用这种方式,一般是用于访问站外资源。
2.不带协议
在浏览器端写一个"/"相当于是服务器的根路径.
<a href="/day-05Servlet/demo">demo1Servlet</a>
对于"/"它相当于是 http://localhost:8080也就是说,我们直接在"/"后面加上我们的工程名,在加上我们的资源名称就可以。
这种方式在开发中应用比较多,因为它一般用于访问站内资源。
2.相对路径
http://localhost:8080/day7_2/demo1 servlet路径
http://localhost:8080/day7_2/admin.html html路径
通过它们的路径,我们发现它们是一个级别,那么我们在访问时,就可以写成以下效果.
<a href="./demo1">demo1Servlet</a>
这个路径可以简化成
<a href="demo1">demo1Servlet</a>
关于servlet自动加载.
我们可以通过设置让servlet跟随服务器启动而创建.
只需要在servlet配置中<servlet>这个标签中加上 <load-on-startup>2</load-on-startup>
问题1:servlet跟随tomcat启动有什么作用?
就是用来加载资源。
问题2:load-on-startup它的值可以取什么?
优先级有10个,是从1-10,1已经被占用了,我们在使用时,一般情况下是从2开始。
数值越小优先级越高。
优先级相同情况下根据配置的顺序加载。
关于Servlet接口中的init方法
问题1:在Servlet接口中定义的init方法是有参数的,它的参数类型是ServletConfig,而我们重写的init方法没有参数,为什么?
原因:父类中已经将init(ServletConfig config)这个方法进行了重写,而我们在自己的Servlet中就不需要在重写了,
我们重写的init()它不是接口中定义的,而是在父类中定义的。
细节:在GenericServlet中对Servlet接口中的init(ServletConfig config)进行了重写,并且调用了自己定义的一个
init()方法。那么我们在自己的Servlet类中重写了init()方法,根据多态就会调用我们自己的init()方法。
问题2:ServletConfig是什么?它有什么作用?
在GenricServlet中将ServletConfig对象保存到了GenericServlet中。
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
ServletConfig对象,代表的是Servlet的配置对象。
当去访问一个servlet时,就会实例化这个servlet对象,并且会创建一个servletConfig对象,将这个对象通过init方法传递到servlet中。
那么我们就可以在自己的servlet中获取Servlet的配置信息.
获取ServletConfig对象: this.getServletConfig();
----------------------------------------------------------------
ServletConfig对象
功能:
1.可以获取Servlet的name。
2.可以获取初始化参数
是我们可以在Servlet的配置中通过<init-param>来进行配置,
对于这些配置,我们可以通过ServletConfig来获取.
通过初始化参数,我们可以进行预定义信息的加载,这种操作一般情况是在框架中应用。
3.可以获取ServletContext对象
常用API总结:
public String getServletName();
用于获取Servlet名称
public String getInitParameter(String name);
用于获取init-param中指定名称的value值.
public Enumeration getInitParameterNames();
用于获取所有的init-param中的name名称.
public ServletContext getServletContext();
用于获取一个ServletContext对象。
ServletConfig要求掌握内容:
1.它是由服务器创建,通过init方法传递到我们的Servlet中。
我们在Servlet中通过 this.getServletConfig()获取ServletConfig对象.
2.ServletConfig对象是用于获取当前Servlet的配置信息.
1.Servlet的名称
2.Servlet的初始化参数。
每一个Servlet都具有自己的ServletConfig对象。它们之间是不能共享的。
关于默认的servlet
如果某个Servlet的映射路径它是 "/" 那么它就是默认Servlet.
默认的Servlet是用于处理不能处理的请求。
在tomcat中conf/web.xml文件,我们自己工程的所有的web.xml相当于继承了这个xml.
当我们去访问web工程下内容时,都是通过web.xml文件中的<url-pattern>去查找到资源。
而我们在访问 a.txt a.html时在xml文件中没有与其对应的资源,这时,是默认的servlet进行处理。