Servlet概述
*什么是Servlet
*Servlet是JavaWeb的三大组件之一,他输入动态资源。Servlet的作用是处理请求,服务器会把收到的请求交给Servlet来处理,在Servlet中通常需要:
*接受请求数据
*处理请求
*完成响应
*实现Servlet的三种方式
*实现javax.servlet.Servlet接口
*继承javax.servlet.GenericServlet类,与所有协议相关
*继承javax.servlet.http.HttpServlet类,与HTTP协议相关
通常我们会去继承HttpServlet类来完成我的们Servlet,但学习Servlet还要从javax.servlet.Servlet接口开始学习
Servlet.java
public interface Servlet{
public void init(ServletConfig config) throws ServletException;
//获取Servlet的配置信息
public ServletConfig getServletConfig();
public void service(ServletRequest req,ServletResponse res)
thorws ServletException,IOException;
//获取Servlet的信息,一般没用
public String getServletInfo();
public void destory();
}//五个方法
浏览器访问Servlet路径
要使浏览器与Servlet联系起来,需要配置web.xml文件
文章图片
生命周期方法
void init(ServletConfig):出生之后(1次),第一次在浏览器被访问
void service(ServletRequest request,ServletResponse response):每次处理请求时会被调用
void destory():临死之前(1次),释放非内存资源,尽可能不在这里释放资源。关闭服务器。
特性
单例,一个类只有一个对象;当然可能会存在多个Servlet
线程是不安全的。
Servlet类由我们来写,但对象由服务器来创建,由服务器来调用相应方法
ServletConfig接口介绍
一个ServletConfig对象,对应一段web.xml中Servlet的配置信息servlet
文章图片
API:
Sting getServletName(),获取的是servlet-name中的内容;
ServletContext getServletContext():获取Servlet上下文对象
String getInitParameter(Sting name):通过名称获取指定初始化参数的值,getInitParameter(“p1”);
Enumeration getInitParameterNames():获取所有初始化参数的名称,Enumeration是一个集合
GenericServlet
自己编写一个AServlet模拟GenericServlet
public class AServlet implements Servlet {
/*
*模拟GenericServlet
*/
private ServletConfig servletConfig;
//需要就写,不需要就不写
@Override
public void destroy() {
System.out.println("我要死额");
}
/*
* 请放心,这个方法一定会在init()方法之后被调用
*/
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
//没有用的东西,实现与否都可以
@Override
public String getServletInfo() {
return "我是一个servlet";
}
//生命周期方法,由tomcat调用一次。
//是这些方法中第一个被调用的,他会在构造器创建后第一个被调用。
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//把tomcat传递的ServeltConfig赋值给本类的一个成员
this.servletConfig=servletConfig;
init();
//调用用户可能初始化的函数 init
}
/*
* 这个方法是本类自己定义的,不是Servlet本身的方法
*/
public void init() {
//这里写用户自己想做的初始化
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("每次处理请求都会被调用");
}
public ServletContext getServletContext() {
return servletConfig.getServletContext();
}
public String getServletName() {
return servletConfig.getServletName();
}
public String getInitParameter(String name) {
return servletConfig.getInitParameter(name);
}
}
编写一个AServlet的子类BServlet
public class BServlet extends AServlet{ @Override
//public void init(ServletConfig servletConfig) throws ServletException {
public void init() {
// TODO Auto-generated method stub
System.out.println("初始化");
/*
* 这个会覆盖AServlet里的init方法,导致下面方法空指针异常
* 解决方法:在AServlet中重新定义一个init()方法
* 这里重写无参init方法,服务器调用有参init。不由tomcat调用,不是生命周期方法
*/
} @Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
throws ServletException, IOException {
String value = https://www.it610.com/article/getInitParameter("p1");
}
}
GenericServlet子类CServelt
public class CServlet extends GenericServlet {
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
System.out.println("哈哈哈 初始化");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("Hello World");
}
private void destory() {
// TODO Auto-generated method stub
System.out.println("destory()");
}
}
HttpServlet
文章图片
文章图片
Servlet细节
**Servlet与线程安全**
因为同一个类型的Servlet只有一个实例对象,那么就有可能会出现一个Servlet同时处理多个请求。所以线程是不安全的,但也说明Servlet的工作效率很高
所以
轻易不要再Servlet中创建成员,创建局部变量即可
可以创建无状态成员。没有成员只有一些方法的类
可以创建有状态的成员,但状态必须为只读的。有只有get方法的成员的类**让服务器启动时就创建Servlet**
文章图片
url-pattern
充当过滤器的作用,现在已经有过滤器了,所以这个不常用了
文章图片
web.xml文件的"继承"
文章图片
jsp是由Tomcat的JspServlet处理的,详见tomcat里的web.xml
web中的servlet-class内容通过反射得到类
ServletContext
**ServletContext概述**
文章图片
获取ServletContext
文章图片
域对象的功能
文章图片
获取应用初始化参数
文章图片
获取资源相关方法
文章图片
文章图片
文章图片
网站访问量统计案例
文章图片
获取类路径资源
文章图片
【JavaWeb学习笔记--day09--Servlet】
文章图片
推荐阅读
- 轮播图动态生成小圆点
- JavaWeb学习笔记--day05--day06--XML
- JavaWeb学习笔记--day14--注册案例
- JavaWeb学习笔记--day02+day03+day04--JavaScript
- JavaWeb学习笔记--day13--EL表达式、JSTL、MVC
- JavaWeb学习笔记--day11--自定义标签JSTL标签库,JavaWeb设计模式
- JavaWeb学习笔记--day08