Servlet接口实现类
* Servlet接口: Servlet接口是来自于Servlet规范下的一个接口,存在于HTTP服务器(Tomcat)所提供的jar包中。Servlet-api.jar。
* Servlet-api.jar 该jar包在 Tomcat服务器目录下的lib文件夹下的一个jar包。该jar包中存放了Servlet接口。(javax.servlet.Servlet).
* 在Servlet规范中,规定了Http服务器能调用的【动态资源文件】,必须是一个Servlet接口的实现类。(实现了Servlet接口的类就是一个动态资源文件)
- 例如:
class Student{
//不是一个动态资源文件,没有实现Servlet接口,所以 Servlet无权到调用该类。
}
class Student implements Servlet{
//实现了Servlet接口,属于合法的动态资源文件, Servlet有权调用
Servlet object= new Student();
object.doGet();
}
* Servlet接口实现类开发步骤
- 第一步:创建一个类继承HttpServlet父类,使之成为一个Servlet接口实现类。 oneServlet(HttpServlet实现类)---继承--->HttpServlet(abstract)---继承--->GenericServlet(abstract)---实现---> Servlet接口
- 第二步:重写HttpServlet父类中的两个方法 doGet() 和 doPost()。
- 如果浏览器以---get--> 发送请求给Servlet,那面Servlet就会调用doGet()方法来处理
- 如果浏览器以---post--> 发送请求给Servlet,那面Servlet就会调用doPost()方法来处理
- 第三步:将Servlet接口实现类的信息【注册】到Tomcat服务器中。
-【网站项目】---> web文件夹---> WEB-INF文件夹 ---> web.xml文件 将当前Servlet接口实现类的信息写到该文件中,就相当于完成了【注册】
- 需要在 web.xml 文件中写的内容:
<servlet>
<servlet-name>pathName</servlet-name> <!-- 创建一个变量来存储Servlet类路径 (变量命随意但是要和 <servlet-mapping> 中的<servlet-name> 保持一致)-->
<servlet-class>com.shige.controller.oneServlet</servlet-class> <!-- 声明Servlet接口实现类的类路径:包名+类名 --> Tomcat会声明一个变量 String pathName="com.shige.controller.oneServlet ";
</servlet>
<servlet-mapping> <!-- 由于Servlet接口实现类的路径都比较长(包名+类名),为了更方便访问Servlet接口实现类,所以要给该实现类起一个简单的别名,从而更方便访问-->
<servlet-name>pathName</servlet-name> <!--给Tomcat服务器中虚拟路径名为pathName的路径起别名 -->
<url-pattern>/simple</url-pattern> <!--设置别名,别名必须以 / 开头-->
</servlet-mapping>
- 如果浏览器向Tomcat服务器请求oneServlet实现类时,地址是: http://local:8080/网站名/simple
- 第四步: 将WEB项目部署到Tomcat服务器上,run---->Edit Configurations----->选择Tomcat服务器---->Deplyment 选择要部署的WEB项目----->Application context 定义浏览器访问时的项目名----->ok
* 抽象类的作用:简化接口实现类对接口实现过程中的难度。将接口中不需要实现的抽象方法,交给该抽象父类去完成,这样最后一层继承抽象父类的实现类只需要去实现所需要的方法就可以了。
* 在 Servlet 接口中有五个方法 : init(), getServletConfig(), service(), getServletInfo(), destroy(). 在这五个方法中,目前只需要servic()方法。所以如果直接实现Servlet接口,那么就必须同时重写这五个方法。
* Servlet接口中各方法的使用?
1.无参数构造方法 实例化Servlet实现类对象,创建实例对象。
2.init方法
- 1,2方法执行时间几乎相同,执行次数都是一次,构造方法执行的时候Servlet对象之正在创建,而init方法执行时Servlet方法已经创建,若系统要求在对象创建时刻执行一段特殊程序,这段程序尽量写在init方法中。
- 为什么不建议将代码写在构造方法中呢?
> 因为存在风险,当程序员编写构造方法的时候,可能会导致无参构造方法失效。(因为当一个类中不编写任何构造函数的时候,默认有一个无参数构造方法,但一旦编写一个有参数构造方法的时候,系统则不再提供无参数构造).
> init方法是sun公司为程序员提供的一个初始化时刻,若希望程序在初始化时刻执行一段特殊的程序,该程序可以编写到init方法中,将来会被自动调用。
3.service方法
- service方法是必然要重写的,因为这个方法需要完成业务逻辑处理,请求的处理以及响应。
4.destroy方法
- 这个方法也是为SUN公司为java程序提供的一个特殊时刻,这个特殊时刻被称为对象销毁时刻,若希望在销毁时刻执行一段特殊的代码,需要将该段代码写在destory方法中,自动被程序调用。
5.回顾
1.类加载时刻执行代码写到静态代码块中。
* Service()方法为什么有用:
- service()用来获取浏览器的请求方式,判断浏览器发过来的请求方式的类型。从而决定用哪种方法去处理浏览器的请求。
- Tomcat 根据Servlet规范调用Servlet接口实现类规则:
1. Tomcat有权创建Servlet接口实现类对象 Servlet oneServlet = new oneServlet();
2. Tomcat通过实例对象调用HttpServlet 抽象类中的service方法处理当前请求 oneServlet.service()
3. 因为在HttpServlet父类中已经重写了service方法,在该方法中决定了什么时候调用doGet()方法,什么时候调用doPost()方法。(而这种通过父类决定在何种情况下调用子类方法的作法,在设计模式中称为 模板设计模式)
例如:HttpServlet 中的 service()方法
public void service(){ // HttpServlet service()方法, 在service方法中出现的this,指的是调用service方法的实例对象,哪个实例对象调用service方法,this就指哪个子类
if(浏览器请求方式==Get){
this.doGet(); //oneServlet.service() 此时 this---> oneServlet, 因为子类中重写了doGet()方法,所以son.doGet()调用的是子类中重写的doGet()方法,而不是HttpServlet中的doGet()。
}else if(浏览器请求方式==Post){
this.doPost();
}
}
oneServlet doGet() do Post()
Servlet oneServlet = new oneServlet()
oneServlet.service();