1.表述
1.1什么是servlet
Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地(动态的)浏览和修改数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,
广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中(Tomcat,Servlet容器)。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
1.2servlet生命周期
Servlet接口:javax.servlet.Servlet,主要用来处理基于HTTP协议的请求和响应
常用的方法:
void init(ServletConfig config) :初始化当前Servlet
void service(ServletRequest req, ServletResponse res) :服务方法
void destroy() :销毁方法
ServletConfig getServletConfig() :获取Servlet的配置信息
String getServletInfo() :获取Servlet的相关的信息
Servlet的生命周期方法:
void init(ServletConfig config) :初始化当前Servlet
void service(ServletRequest req, ServletResponse res) :服务方法
void destroy() :销毁方法
生命周期方法的执行顺序:
执行构造器创建对象—>执行init方法执行初始化操作—>执行service方法—>执行destroy进行资源的销毁
注意:
1.在Servlet中必须要保留一个公共的无参数的构造器(Tomcat使用反射创建对象),Servlet在整个应用最多只有一个对象
2.初始化方法在第一次请求的时候执行
3.service方法每次访问都会执行
4.destroy方法在正常关闭服务器的时候执行,(通常不会将关闭资源的操作放在该方法中)
1.3servlet执行宏观描述
servlet不能单独存在,必须被部署到Servlet容器中,由容器进行实例化并调用其方法,Servlet容器是Web服务器或javaee服务器的一部分,负责在servlet的生命周期内管理servlet
servlet的生命周期定义了一个servlet如何被加载和初始化,怎样接受请求,响应请求和提供服务以及被卸载等。
可分为四个阶段:
1.加载与实例化:servlet容器负责加载与实例化servlet,在默认情况下,第一次请求访问某个servlet时,容器就会创建一个相应的Servlet实例(即进行实例化)
2.初始化:在servlet实例化之后,容器就会调用servlet的init()方法初始化该实例。
3.处理请求:servlet容器调用servlet实例的sevice()方法对请求进行处理。在service()方法中,servlet通过servletrequest对象得到客户端的相关信息与请求信息,在对请求进行处理后,再调用servletresponse对象的方法设置响应信息。
4.终止服务:当web应用被终止,或web应用重新启动,或servlet容器终止运行,或servlet容器重新装载servlet的新实例时,容器就会调用实例的destroy()方法释放该servlet的资源,完成卸载过程
1.4servlet请求流程
1.5servlet初始化参数
javax.servlet.ServletConfig接口:对Servlet的配置信息的封装对象
ServletConfig的常用方法:
java.lang.String getServletName() :获取web.xml文件中当前的Servlet的
ServletContext getServletContext() :获取Servlet的上下文对象
使用初始化参数的原因:在Servlet中如果有硬编码,就应该将其配置到web.xml文件,提高的代码的可维护性
获取初始化参数的方法
java.lang.String getInitParameter(java.lang.String name) :根据指定的名称获取初始化参数的值
java.util.Enumeration<java.lang.String> getInitParameterNames() :获取当前的Servlet的所有的初始化参数的名称
如果在多个Servlet有相同的初始化参数,那么是否需要进行多次相同的配置?
答案:不是
解决方案:使用全局的初始化参数
1.6servlet继承体系
问题1:在Servlet类中需要实现Servlet接口,此时Servlet接口中的所有的方法都需要覆盖,但是不是所有的方法都是必
须的
解决方案:抽取一个公共的类,实现Servlet接口,然后我们其他的Servlet直接继承自公共的Servlet,此时,需要覆盖哪一个方法就覆盖哪一个
2.Servlet中的服务方法的实现方式(推荐使用第一种)
1.7请求乱码
中文乱码的原因:Tomcat默认是使用ISO-8859-1的方式在处理请求参数,一个字节一个字节的编码,不适合中文的编码
解决的方案:
1.先按ISO-8859-1方式解码,再按UTF-8方式编码
2.方式一麻烦,可以通过修改配置的方式(在server.xml文件中修改端口的节点中)
只支持get方式是请求
3.在获取请求参数之前进行编码的设置(只支持post方式的请求)