什么Servlet
servlet 是运行在 Web 服务器中的小型 Java 程序(即:服务器端的小应用程序)。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。
web.xml中配置servlet
<!-- 配置一个servlet -->
<!-- servlet的配置 -->
<servlet>
<!-- servlet的内部名称,自定义。尽量有意义 -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的类全名: 包名+简单类名 -->
<servlet-class>gz.itcast.a_servlet.FirstServlet</servlet-class>
</servlet>
<!-- servlet的映射配置 -->
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/first</url-pattern>
</servlet-mapping>
Servlet生命周期
Servlet生命周期的四个重要方法
构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象。只调用1次。证明servlet对象在tomcat是单实例的。
init方法: 创建完servlet对象的时候调用。只调用1次。
service方法: 每次发出请求时调用。调用n次。
destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。
用时序图来演示servlet的生命周期
Servlet的自动加载
默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问sevrlet的时候比较慢。
改变servlet创建对象的时机:提前到加载web应用的时候在servlet的配置信息中,加上一个即可
<servlet>
<servlet-name>LifeDemo</servlet-name>
<servlet-class>gz.itcast.c_life.LifeDemo</servlet-class>
<!-- 让servlet对象自动加载 -->
<load-on-startup>1</load-on-startup> 注意: 整数值越大,创建优先级越低!!
</servlet>
Servlet的三种创建方式
实现javax.servlet.Servlet接口(参见:编写一个servlet程序:)
继承javax.servet.GenericServlet类(适配器模式)
继承javax.servlet.http.HttpServlet类(模板方法设计模式)
ServletConfig对象
作用
ServletConfig对象: 主要是用于加载servlet的初始化参数。在一个web应用可以存在多个ServletConfig对象(一个Servlet对应一个ServletConfig对象)
Servlet初始化参数配置
<servlet>
<servlet-name>ConfigDemo</servlet-name>
<servlet-class>gz.itcast.f_config.ConfigDemo</servlet-class>
<!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</servlet>
获取servlet配置信息
方式一
方式二
方式三
ServletContext对象
作用
ServletContext对象 ,叫做Servlet的上下文对象。表示一个当前的web应用环境。一个web应用中只有一个ServletContext对象。
域对象:在一定范围内(当前应用),使多个Servlet共享数据。
常用方法:
void setAttribute(String name,object value);//向ServletContext对象的map中添加数据
Object getAttribute(String name);//从ServletContext对象的map中取数据
void rmoveAttribute(String name);//根据name去移除数据
获取全局配置信息:
修改web.xml文件:
String getInitParameter(String name)//根据配置文件中的key得到value
获取资源路径
String getRealPath(String path);//根据资源名称得到资源的绝对路径.
可以得到当前应用任何位置的任何资源。
private void test3() throws IOException{
ServletContext sc = this.getServletContext();
String path = sc.getRealPath("/WEB-INF/b.properties");//参数一定要以/开头
//创建一个properties
Properties prop = new Properties();
//创建输入流,读取文件内容
InputStream in = new FileInputStream(path);
prop.load(in);
System.out.println(prop.getProperty("key"));
}
实现Servlet的转发
RequestDispatcher getRequestDispatcher(java.lang.String path) ;//参数表示要跳转到哪去
1)转发
a)地址栏不会改变
b)转发只能转发到当前web应用内的资源
* c)可以在转发过程中,可以把数据保存到request域对象中*
2)重定向
a)地址栏会改变,变成重定向到地址。
b)重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站。
c)不能再重定向的过程,把数据保存到request中。
//实现请求转发,目标是跳转到ServletContextDemo3
ServletContext sc = this.getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/ServletContextDemo3");
rd.forward(request, response);