一、Servlet的简介
- Servlet的概述
servlet是运行在服务端的java程序 servlet是一套规范(接口) 外界都可以访问到 - servlet的快速入门
步骤:
(1) 创建一个类 实现servlet
(2)覆盖servlet接口中的全部方法(尤其是service方法)
(3)需要进行虚拟路径的配置
web.xml配置部分:
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><display-name></display-name><servlet><!--servlet-name 这里的名字可以任意取,不过需要和 servlet-mapping中的servlet-name匹配每一个Servlet标签中只能配置一组属性--><servlet-name>Demo1</servlet-name><!-- 这里需要填写正确的完整包名来指向java源文件 --><servlet-class>com.heima.servlet.Demo1</servlet-class></servlet><servlet-mapping><!-- 这里的name需要和servlet标签中的名字匹配 每一个Servlet-mapping 标签中只能配置一组--><servlet-name>Demo1</servlet-name><!-- 对外访问的路径 --><url-pattern>/demo1</url-pattern></servlet-mapping><welcome-file-list><!-- 这里代表的是欢迎页面,可以自己去寻找 --><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>
Demo1.java工程内容:
package com.heima.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class Demo1 implements Servlet{@Overridepublic void service(ServletRequest req, ServletResponse res)throws ServletException, IOException{// 主要业务处理的地方,每次访问都会执行PrintWriter writer = res.getWriter();writer.print("<h1>Hello World</h1>");writer.print("<h1>Hello World</h1>");System.out.println(getServletInfo());}@Overridepublic void destroy(){// 服务器正常关闭的时候调用}@Overridepublic void init(ServletConfig arg0) throws ServletException{// 在服务器servlet对象创建的时候执行}@Overridepublic ServletConfig getServletConfig(){// 这个方法用于返回ServletConfig对象,内部封装的是Servlet配置信息return null;}@Overridepublic String getServletInfo(){// 用来返回Servlet的一些信息return "";}}
由于servlet页面回写的时候使用的PrintWrite流,写出中文由于编码问题会出现乱码,可以通过这个方法解决res.setContentType("text/html;charset=utf-8");
二、Servlet的生命周期
- java中的生命周期:对象什么时候创建 什么时候销毁 这个过程中必然要实行的方法
- servlet对象的生命周期:
创建:默认第一次访问servlet时创建 创建之后对象驻留在内存中 等待为后面的访问服务,所以说,servlet对象只有一个。
销毁:服务器关闭 web应用从服务器中移除
与生命周期想过的方法说明
public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException{// 主要业务处理的地方每次访问都会执行}@Overridepublic void destroy(){// 服务器正常关闭的时候调用}@Overridepublic void init(ServletConfig arg0) throws ServletException{// 在服务器servlet对象创建的时候执行}
三、Servlet的相关配置文件
- 基本配置
基本格式:
配置servlet的实体:
<servlet><sevlet-name>随意书写</servlet-name><servlet-class>servlet类的一个全包名</servlet-class></servlet>
配置servlet的对外访问的虚拟路径例子:
<servlet-mapping><sevlet-name>和那么上面的name一致</servlet-name><url-pattern>/虚拟路径</url-pattern></servlet-mapping>
<servlet><!--servlet-name 这里的名字可以任意取,不过需要和 servlet-mapping中的servlet-name匹配 --><servlet-name>Demo1</servlet-name><!-- 这里需要填写正确的完整包名来指向java源文件 --><servlet-class>com.heima.servlet.Demo1</servlet-class></servlet><servlet-mapping><!-- 这里的name需要和servlet标签中的名字匹配 --><servlet-name>Demo1</servlet-name><!-- 对外访问的路径 --><url-pattern>/demo1</url-pattern></servlet-mapping>
虚拟路径的写法:
完全匹配: 就是客户端的访问地址与配置完全一致才可以访问到
<url-pattern>/demo1</url-pattern>
目录匹配:以/开始以*结束 /aaa/bbb/*
<url-pattern>/demo1/*</url-pattern>
扩展名匹配:以*开始 以扩展名结束 *.abc ,如果直接写*.abc那么前面就不需要加/
<url-pattern>/demo1/*.jpg </url-pattern>
注意:目录匹配和扩展名匹配不能混用 /aaa/bbb/*.abc(错误的!!!)
- 服务器一启动就实例化servlet
格式:写在Servlet标签内,<load-on-startup>数字</load-on-startup>
数字代表实例化的顺序 数字越小越早创建
<servlet><servlet-name>Demo2</servlet-name><servlet-class>com.heima.servlet.Servlet</servlet-class><load-on-startup>2</load-on-startup></servlet>
- 缺省的servlet
格式:缺省的servlet就是所有的servlet都不匹配 缺省的servlet去负责执行
就是将url-pattern配置成/
<servlet-mapping><servlet-name>Demo2</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
- 欢迎页面:相当于IIS里面的的默认打开页面
<welcome-file-list><!-- 这里代表的是欢迎页面,可以自己去寻找 --><welcome-file>index.jsp</welcome-file></welcome-file-list>
- tomcat默认的全局web.xml
四、Servlet的继承体系
- 使用IDE工具创建Servlet类和web.xml配置的对应关系

- 我们自己创建servlet的继承关系
关系:自定义servlet----->HttpServlet------>GenericServlet------>Servlet - service方法的演化过程
servlet接口中service方法
GenericServlet中的service方法
HttpServlet中service方法
这里service调用的是本类中的另外一个重载service方法。
在service(HttpServletRequest,HttpServletResponse)方法中可以进行提交方式的判断。通过HttpServlet类中的常量来实现。
HttpServlet类中的常量属性
判断实现的方式:

- init(ServletConfig config)演变过程
在servlet接口中的init方法
在GenericServlet中的init方法
这个有参方法用来接收Servlet的配置信息,进行赋值
这个无参重载方法主要用于覆写,切不影响GenericServlet中的一些get方法
问题:有参数的init和无参数的init的关系?
首先他们是重载关系。
有参发放主要用来赋值和调用无参方法。所以在子类中覆盖覆写无参方法不影响最有效果。 - destroy()的演变过程
servlet接口中的destroy方法
GenericServlet中的destroy方法
五、ServletConfig对象
- 概述:是Servlet的配置对象 内部封装的是servlet的配置信息 在web容器调用init方法时 将ServletConfig作为参数进行传递
- 怎样获取?
通过getServletConfig()
查看GenericServlet的源码发现。
可以直接返回GenericServlet类中的config变量,该变量在此类中的有参inti方法中进行了赋值。可以直接调用的原因是应为inti的在服务器开启的时候就自动调用了此方法,所以可以正常服务,而不会去除null值。前提是子类不覆盖有参inti方法。 - ServletConfig的作用
- 获取servlet的名称
ServletConfig sc=getServletConfig();System.out.println(sc.getServletName());
- 获取初始化参数(多个参数的获取方式)
设置参数方式:通过init-param来设置参数
ServletConfig sc=getServletConfig();Enumeration <String> names = sc.getInitParameterNames();while(names.hasMoreElements()){String name=names.nextElement();System.out.println(name+" "+sc.getInitParameter(name));}
- 可以获取web应用的上下文对象 ServletContext

六、ServletContext对象
- 概述
HttpServletservletContext是servlet上下文对象 实质代表web应用上下文对象 对象只有一个 而且所有的servlet共享一个ServletContext
servletContext什么时候创建?
服务器启动的时候 就会创建ServletContext对象 将这个对象放置在内存中中 供所有的setvlet访问(有点想静态变量)
servletContext什么时候销毁?
关闭服务器时销毁 web应用新哦那个服务器中移除 - 怎么获得ServletContext对象
通过servletConfig对象获得
ServletContext context = getServletConfig().getServletContext();
- ServletContext的作用
- 获取初始化参数
XML文件设置:
实现代码:
ServletContext context = getServletConfig().getServletContext();Enumeration <String> enums =context.getInitParameterNames();while(enums.hasMoreElements()){String name=enums.nextElement();System.out.println(name+" "+context.getInitParameter(name));}
- 可以获取web资源的绝对路径:context.getRealPath()
重点:getRealPath()相对的位置:相对web应用
ReadFile方法:
public void readFile(String path){BufferedReader bufr;try{bufr = new BufferedReader(new FileReader(path));System.out.println(bufr.readLine());}catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace();}}
- 可以作为域对象:域对象:代表存储数据的区域的对象
- context.setAttribute(键,值):设置对象的键和值
- context.getAttribute(键):通过键获取值
ServletContext context =getServletContext();//设置属性键值context.setAttribute("name", "zhansan");//通过键获取值String attribute=(String) context.getAttribute("name");










