JavaWeb2 Servlet

一,什么是Servlet
Servlet字面意思即服务端小程序
Servlet是一组接口、一组规范、一个协议;用于开发Web项目

一个工程的搭建通常由各模块组成;各个模块分工协作、相互配合可以高效率地构建大型项目。各个模块之间需要一组规范来连接,Servlet就是这样一组规范

B/S架构中涉及到的协议、标准、规范:

浏览器和Web服务器之间的请求和响应遵循HTTP协议
WEB服务器和web项目的开发者(我们)之间有一些规范,例如:Servlet、JSP规范
Web项目的开发者(我们)和数据库服务器之间有一个规范,叫做JDBC规范
二,Servlet
1,Servlet是如何起作用的
每一个url都对应着互联网中的一个资源,分为静态资源和动态资源,请求路径对应着一个动态资源、一段程序这段程序就是Servlet程序,当浏览器发送某个请求时,服务器找到该请求对应的servlet程序并执行servlet对象的service()方法。请求路径与servlet程序的对应信息配置在web.xml文件中。现在IDEA也有快速创建Servlet类的快捷方式如图:

 2,Servlet接口中的方法

 3,Servlet对象的生命周期

Servlet对象从最初的创建,方法的调用,到最后被销毁,都是由web容器来管理的,javaweb程序员无权干涉

具体过程:

Web容器启动,解析web.xml文件,将请求路径与对应的servlet类名放到一个map集合中,如图:


大多数web容器还会维护一个请求路径与对应的servlet对象的集合,如图:


默认情况 下,servlet对象在Web容器启动阶段不会被实例化,而是在接收到第一次请求之后实例化;若想要在web容器启动时实例化,可进行如下配置:

浏览器发送请求,web容器截取请求路径,通过请求路径在Map<String, Servlet>中查找对应的servlet对象;
如果没有找到对应的servlet对象,则:
1,通过请求路径在Map<String, String>找到对应的servlet全类名
2,通过反射机制加载该类并调用无参构造方法完成servlet对象实例化
3,调用servlet对象的init()方法完成初始化
4,调用servlet对象的service()方法提供服务
若找到了对应的servlet对象,则调用该对象的service()方法提供服务
servlet对象销毁:web容器关闭的时候、webApp重新部署的时候、该servlet对象长时间没有用户

访问的时候,web容器会将servlet对象销毁,在销毁servlet对象前,会调用对象的destroy()方法进行销毁前的准备
 

三,ServletConfig

1,什么是ServletConfig
ServletConfig指javax.servlet.ServletConfig接口
【了解】Apache Tomcat服务器实现了Servlet规范,Tomcat服务器写了一个ServletConfig接口的实现类,实现类的完整类名是org.apache.catalina.core.StandardWrapperFacade
ServletConfig对象封装了Servlet对象的配置信息,每个Servlet对象对应着一个ServletConfig对象;在web.xml中,ServletConfig对象对应着<servlet>标签中的所有内容,例如:

 ServletConfig对象由服务器创建并在servlet对象初始化时传入: void init(ServletConfig servletConfig) throws ServletException;
在service()方法体中,可以通过getServletConfig()方法获取ServletConfig对象

2,ServletConfig中的方法

 

三,ServletContext
1,什么是ServletContext
ServletContext指javax.servlet.ServletConfig接口

ServletContext对象由服务器创建,Tomcat服务器对ServletContext接口的实现类完整类名是:org.apache.catalina.core.ApplicationContextFacade

ServletContext意为servlet的上下文环境,servletContext对象对应着整个项目,该对象只有一个且被所有servlet共享,servletContext对象对应着web.xml文件,例如:

 web.xml文件服务器启动阶段被解析,servletContext对象在服务器启动阶段被创建,在服务器关闭时被销毁

 2 ,ServletContext中的常用方法

 3,ServletContext与ServletConfig的区别与联系

每一个servlet对象对应着一个servletConfig对象;所有的servlet对象共同对应着一个servletContext对象
servletConfig中包含了所对应的servlet的参数配置信息;servletContext中包含了整个项目的参数配置信息,所有的servlet共享该配置信息
servletConfig和servletContext对应的参数配置信息均在web.xml文件中,位置如下:

4,servletContext共享数据

由于所有的servlet共同对应着一个servletContext,不同的servlet、不同的用户可以通过一下两个方法共享数据

 

四,GenericServlet(适配器)
1,什么是GenericServlet
GenericServlet即通用Servlet,是一个抽象类,实现了Servlet接口

2,GenericServlet的设计目的
GenericServlet的设计采用了适配器设计模式
在GenericServlet没有出现之前,我们编写的Servlet类需要直接实现Servlet接口,但是这个接口中有些方法是目前不需要的,有些操作又是每个Servlet类必备的,例如在init()方法中给config成员赋值,我们大多数情况只需要编写不同的service()方法。直接实现Servlet接口的代码丑陋,有必要在中间添加一个适配器,以后所有的Servlet类不再直接实现Servlet接口,而而是去继承GenericServlet
GenericServlet中只含有一个抽象方法,即service(),子类必须实现,编写业务逻辑
GenericServlet中提供了一个重载的无参数的init()方法,若想在servlet初始化时执行一段特殊的代码,建议重写此无参数的init()方法
除了让代码变得优雅之外,GenericServlet中又提供了一些额外的方法,例如:public String getInitParameter(String name);、public ServletContext getServletContext();子类继承之后,可以在子类中直接使用,方便编程


五,HttpServlet

1,什么是HttpServlet
HttpServlet是一个模板类、抽象类,继承于GenericServlet

2,HttpServlet的设计目的
HttpServlet是针对于HTTP协议的,为了处理http请求和响应。不同类型的请求会由不同类型的Servlet处理,对于JavaWeb程序员,我们只需要关注HttpServlet即可
为了使前后端的请求方式相同,我们需要在后端获取请求方式,然后进行判断前端发送的请求是否为规定的请求方式,如果不是规定的请求方式,就会报错;
为了实现上述功能,需要在每一个GenericServlet的子类中编写实现此功能的代码,代码臃肿;为了解决这个问题,Sun公司提供了HttpServlet抽象类封装了实现上述功能的代码
3,HttpServlet执行流程
service(ServletRequest req, ServletResponse res)方法将两个参数转化为HttpServletRequest和HttpServletResponse类型的
service(HttpServletRequest request, HttpServletResponse response)方法获取请求方法;判断,如果是Get请求就执行doGet()方法,如果是Post请求就执行doPost()方法
doGet()/doPost()执行业务代码
注意:HttpServlet提供的doGet()方法和doPost()方法是用来报错的、是用来让我们重写的

所以,我们编写的的Servlet类继承HttpServlet后,后端需要的是什么请求,那么我们就重写对应的doPost()/doGet()方法,方法内是我们的业务代码,并不需要重写service()方法

4,HttpServlet使用总结
我们的Servlet继承HttpServlet后,后端需要的是什么请求,那么我们就重写对应的doPost()/doGet()方法
doPost()/doGet()方法内就是我们的业务代码,doXXX()可以看作main()方法
代码不在service()内编写了,不需要重写service()方法
HttpServlet中重载的两个service()方法并不需要也没有理由去重写这两个方法
当浏览器发送的请求方式和后台处理方式不同时,会出现一个错误,代号:405
5,模板方法设计模式
模版方法设计模式属于行为行设计模式
模版方法有一个特点:doXXX()
模板方法设计模式的主要作用:

核心算法得到保护
核心算法得到复用
在不改变算法的前提下,却可以重新定义算法步骤的具体实现
模板方法设计模式的例子:

Servlet规范中的HttpServlet
HttpServlet就是一个典型的模板方法设计模式
HttpServlet是一个模板类
其中的service(HttpServletRequest, HttpServletResponse)方法是典型的模板方法,该方法中定义了核心算法骨架,doGet()、doPost()…具体的实现细节延迟到子类中完成
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值