servlet的认识和了解(3)

ServletContext
ServletContext指javax.servlet.ServletConfig接口

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

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

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

ServletContext中的常用方法

/**
根据参数的名称获取value,均为字符串
<context-param>
        <param-name>driver</param-name>
        <param-value>com.mysql.jdbc.driver</param-value>
</context-param>
*/
String getInitParameter(String paraname);
//与ServletConfig中的方法作用相同
Enumeration<String> getInitParameterNames();
//向ServletContext对象中添加数据
void setAttribute(String name, Object obj);
//根据name从ServletContext对象中获取数据
Object getAttribute(String name);
//从ServletContext对象中移除数据
void removeAttribute(String name);
//获取文件绝对路径
String getRealPath(String path);

ServletContext与ServletConfig的区别与联系 

(此部分引用原文链接:https://blog.csdn.net/zxc412728/article/details/121325368 )

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

GenericServle(适配器)

GenericServlet即通用Servlet,是一个抽象类,实现了Servlet接口 

GenericServlet的设计目的

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

HttpServlet

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

HttpServlet设计目的

1.HttpServlet是针对于HTTP协议的,为了处理http请求和响应。不同类型的请求会由不同类型的Servlet处理,对于JavaWeb程序员,我们只需要关注HttpServlet即可。
2.为了使前后端的请求方式相同,我们需要在后端获取请求方式,然后进行判断前端发送的请求是否为规定的请求方式,如果不是规定的请求方式,就会报错;
3.为了实现上述功能,需要在每一个GenericServlet的子类中编写实现此功能的代码,代码臃肿;为了解决这个问题,Sun公司提供了HttpServlet抽象类封装了实现上述功能的代码。
 

 HttpServlet执行流程

1.service(ServletRequest req, ServletResponse res)方法将两个参数转化为HttpServletRequest和HttpServletResponse类型的。
2.service(HttpServletRequest request, HttpServletResponse response)方法获取请求方法;判断,如果是Get请求就执行doGet()方法,如果是Post请求就执行doPost()方法doGet()/doPost()执行业务代码。
注意:HttpServlet提供的doGet()方法和doPost()方法是用来报错的、是用来让我们重写的

模板方法设计模式

模版方法设计模式属于行为行设计模式
模版方法有一个特点:doXXX()
模板方法设计模式的主要作用:

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

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

对HttpServlet的总结:

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

(此部分引用原文链接:https://blog.csdn.net/zxc412728/article/details/121325368 )

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值