最重要的是javax.servlet.Servlet接口
Servlet就是一种实现了Servlet接口的类
Servlet中定义了五个抽象方法
1.void init(ServletConfig config);负责Servlet的初始化
2.ServerConfig getServletConfig();返回容器调用init()方法时传递给Servlet的ServletConfig对象
3.String getServletInfo()返回一个字符串其中包含Servlet信息
4.void Service(ServletRequest request,ServletResponse response)
5.void destory();
servlet一个用java编写的web程序,此程序在服务器上运行以处理客户端请求
servlet技术特点
特点 | 描述 |
---|---|
1.可移植性 | :支持不同操作系统 |
2.功能强大 | :支持javaAPI,jdbc,多线程,图像处理 |
3.简洁 | :面向对象 |
4.安全性 | :java编写 |
5.模块化 | :多个servlet并行 |
6.集成 | :紧密集成共同完成任务 |
7.拓展性和灵活性 | |
8.高效耐久 |
servlet的生命周期
1.初始化阶段
当客户端向Servlet容器发送HTTP请求要求访问Servlet时Servlet容器首先会解析请求,检查是否存在该Servlet对象如果有直接使用该Servlet对象,没有就创建Servlet实例对象,然后通过调用init()方法实现Servlet 的初始化工作 init()只调用一次
2.运行阶段
最重要的阶段Servlet容器会为这个请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象然后将他们作为参数传递给Servlet的service()方法,对于Servlet的每一次请求Servlet容器都会调用一次Servlet的service()方法并且创建新的ServletRequest和ServletResponse对象,会被调用很多次
3.销毁阶段
当服务器关闭或web应用被移除出容器时Servlet随着web的销毁而销毁会调用destroy()方法
servlet 的创建方式
三种创建方式 |
---|
implements Servlet 实现Servlet然后重写service方法即可 |
extends GenericServlet 然后重写service方法即可 |
extends HttpServlet 实际开发中一般使用此种方法 |
若想要servlet生效就必须配置,servlet在web.xml中的配置如下

自动加载Servlet:只需要将web.xml中的<load-on-startup>随着wed启动即可
<servlet>
<servlet-name>pp</servlet-name>
<servlet-class>com.hw.controller.twoServlet</servlet-class>
<load-on-startup>1</load-on-startup>//值越小越优先加载
</servlet>
<servlet-mapping>
<servlet-name>pp</servlet-name>
<url-pattern>/twoServlet</url-pattern>
</servlet-mapping>
Servlet的多重映射
一个Servlet可以被映射成多个虚拟路径
<servlet>
<servlet-name>pp</servlet-name>
<servlet-class>com.hw.controller.twoServlet</servlet-class>
<load-on-startup>1</load-on-startup>//值越小越优先加载
</servlet>
<servlet-mapping>
<servlet-name>pp</servlet-name>
<url-pattern>/twoServlet</url-pattern>
<url-pattern>/two</url-pattern> //多重映射那种路径都可访问
<url-pattern>/servletTwo</url-pattern>
</servlet-mapping>
Servlet映射路径中的通配符 " * "
- 格式为"*.扩展名"
- 格式为" /*"
默认Servlet
虚拟映射路径仅仅是一个正斜线(/)
HttpServlet
大多数的web都是通过HTTP和客户端进行交互因此在Servlet接口中提供了一个抽象类javax.servlet.httpHTTPServlet它是GenericServlet的子类专门用于创建应用于HTTP的Servlet
类的关系
Servlet<--------继承----------GenericServlet<--------继承------Httpservlet
HttpServle类在重写的service()方法中为每一种HTTP请求方式都定义了对应的doXxx()方法,因此继承HttpServlet后只需根据请求方式重写对应的doXxx()方法即可,而不需重写service()方法
HTTPServlet:主要有两大功能
1.根据用户请求方式的不同定义相应的doXXX()方法处理用户请求;
2.通用Servlet()的方法将HTTP请求和响应分别转为HttpServletRequest和HTTPServletResponse类型的对象
ServletConfig和ServletContext
当Tomcat初始化一个Servlet时,会将Servlet的配置信息封装到一个ServletConfig对象中,通过调用init()方法将将ServletConfig对象传递给Servlet。
在web.xml中使用一个或多个<init-param>
<servlet>
<servlet-name>ServletDemo5</servlet-name>
<servlet-class>com.itheima.servlet.ServletDemo5</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>XXX</param-name>
<param-value>YYY</param-value>
</init-param>
</servlet>
-------------------------------------------------------------------------------------------
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//使用config了
ServletConfig config = getServletConfig();//写它就不用重写init()方法
String param = config.getInitParameter("encoding");
}
ServletConfig定义了一系列的配置信息方法
String getInitParameter(String name);根据参数名返回参数值
Enumeration getInitParameterNames();返回一个Enumeration
ServletContext getServletContext();
String getServletName();返回Servlet的名字
//得到当前Servlet所有的配置参数
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletConfig config = getServletConfig();
Enumeration e = config.getInitParameterNames();//参数的名字
while(e.hasMoreElements()){
String paramName = (String)e.nextElement();
System.out.println(paramName+"="+config.getInitParameter(paramName));
}
ServletContext接口
Servlet启动时会为每个web应用创建一个唯一的ServletContext对象代表当前web应用该对象不仅封装了web应用的所有信息,而且实现了对个Servlet之间的数据共享
1、ServletContext 代表着当前应用每个应用只有用一个ServletContext对象实例,有容器提供
2、获得ServletContext的实例:ServletConfig.getServletContext();
3、ServletContext的生命周期
诞生:应用被加载时就有容器创建好
活着:应用不挂就一直活着
死亡:应用挂了,就挂了
4、域(存活范围)对象:
ServletContext成为应用范围域对象。
servletContext 是四大域对象中最大的域对象
数据共享
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext sc = getServletContext();
sc.setAttribute("p", "ppp");
}
应用级参数的设置获取
应用级参数的设置
<context-param>
<param-name>xxx</param-name>
<param-value>yyy</param-value>
</context-param>
<context-param>
<param-name>iii</param-name>
<param-value>jjj</param-value>
</context-param>
------------------------------------------------------------------------------
应用级参数的获取
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext sc = getServletContext();
//得一个参数
// String value = sc.getInitParameter("encoding");
// System.out.println(value);
//得所有的参数
Enumeration<String> names = sc.getInitParameterNames();
while(names.hasMoreElements()){
String paramName = names.nextElement();
System.out.println(paramName+"="+sc.getInitParameter(paramName));
}
}
请求转发
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/servlet/ServletContextDemo5");//转发的地址。ServletContext得到的,地址必须以"/"开头,该"/"就代表着当前应用的访问路径/day07_01_servlet
rd.forward(request, response);//转发
}
实现中文文件的下载
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext sc = getServletContext();
String realPath = sc.getRealPath("/WEB-INF/classes/222.jpg");// 文件存放的真实绝对路径
//System.out.println(realPath);
//构建文件的输入流
InputStream in = new FileInputStream(realPath);
//告知客户端以下载的方式打开:Content-Disposition=attachment;filename=222.jpg
//获取要下载的文件名
String filename = realPath.substring(realPath.lastIndexOf(File.separator)+1);
response.setHeader("Content-Type", "application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));//中文属于不安全的字符,需要进行URL编码
//用response的字节流进行输出
OutputStream out = response.getOutputStream();
int len = -1;
byte b[] = new byte[1024];
while((len=in.read(b))!=-1){
out.write(b, 0, len);
}
in.close();
out.close();
}
读取属性文件
第一种方式
分别将三个属性文件放到不同的文件夹下,并得到路径
// String path = getServletContext().getRealPath("/a.properties");
// String path = getServletContext().getRealPath("/WEB-INF/classes/b.properties");
String path = getServletContext().getRealPath("/WEB-INF/classes/com/hhh/resources/c.properties");
InputStream in = new FileInputStream(path);
Properties props = new Properties();
props.load(in);
System.out.println(props.getProperty("hello"));
------------------------------------------------------------------------------------
第二种方式
//利用ResourceBundle读取:b c ,不能读a,只能读取properties的文件
//ResourceBundle rb = ResourceBundle.getBundle("b");
ResourceBundle rb = ResourceBundle.getBundle("com.itheima.resources.c");
System.out.println(rb.getString("hello"));
-----------------------------------------------------------------------------------
第三种方式
//类加载器读取:只能读取classes或者类路径中的任意资源。但是不适合读取特别大的资源。b c
ClassLoader cl = ServletContextDemo7.class.getClassLoader();//得到类加载器
URL url = cl.getResource("com/itheima/resources/c.properties");
String path = url.getPath();
InputStream in = new FileInputStream(path);
Properties props = new Properties();
props.load(in);
System.out.println(props.getProperty("hello"));
-------------------------------------------------------------------------------------
第四种方式
ClassLoader cl = ServletContextDemo7.class.getClassLoader();//得到类加载器
//InputStream in = cl.getResourceAsStream("b.properties");
InputStream in = cl.getResourceAsStream("com/itheima/resources/c.properties");
Properties props = new Properties();
props.load(in);
System.out.println(props.getProperty("hello"));
servlet事件监听器
servletAPI中提供三个接口ServletContextListener,httpSessionListener,
ServletRequestListener,他们分别用于监听各自的对象的生命周期
监听域对象中的属性变更的接口
ServletContexAttributeListener
httpSessionAttributeListener
ServletRequestAttributeListener
网友评论