servlet概述
- servlet规范来自与javaEE规范中的一种
- 作用:
- 在servlet规范中,指定【动态资源文件】的开发步骤
- 在servlet规范中,指定http服务器调用动态资源文件规则
- 在servlet规范中,指定http服务器管理动态资源文件实例对象规则
servlet接口实现类
-
servlet接口来自于servlet规范下的一个接口,这个接口存在于http服务器所提供的jar包中。
-
tomcat服务器下 lib文件夹中有一个叫做servlet-api.jar 用于存放servlet接口(javax.servlet.servlet)
-
servlet规范中认为,http服务器能调用的【动态资源文件】必须是一个servlet接口实现类
-
例子:
class Student(){ //不是动态资源文件,tomcat无权调用 } class Teacher implements Servlet(){ //这是一个合法的动态资源文件,tomcat有权调动他 servlet obj = new TEacher(); obj.doget(); }
servlet接口实现类开发步骤
- 只有作为servlet接口的实现类,才有资格作为动态资源文件
- servlet接口由http服务器厂商负责提供
- tomcat/lib/servlet-api.jar servlet接口来自于这个包
第一步:
创建一个java类,继承HttpServlet父类(抽象类)。使之成为一个Servlet接口实现类。
Oneservlet extends HttpServlet implements Servlet
servlet接口中的init getservletconfig getservletinfo destroy这四个方法对于servlet接口实现类没用。
只有service()方法是有用的。
tomcat根据servlet规范调用servlet接口实现类规则:
- tomcat有权创建servlet接口实现类实例对象
servlet oneservlet = new oneservlet();
- tomcat根据实例对象调用service方法处理当前请求
oneservlet.service()
子父类的关系
oneservlet继承----->(abstract)httpservlet继承----->(abstract)Genericservlet 实现------->servlet接口
servlet接口中的init getservletconfig getservletinfo destroy这四个方法都在Genericservlet实现。service()方法在Genericservlet类中依旧是抽象方法
service()在oneservlet中实现
第二步:
重写httpservlet父类的两个方法,doGet或者doPost
根据浏览器发送的请求方式,重写父类中doget或者dopost方法来处理请求。
浏览器以get方式发送请求------------->onservlet.doget()
浏览器以post方式发送请求------------->oneservlet.dopost()
doget和dopost的调用,是通过httpservlet类中重写过的service()方法来调用的。httpservlet类中的this代表的是oneservlet类
通过父类决定在何种情况下调用子类中的方法,【设计模式】----模板设计模式
httpservlet类:
service(){
if(请求方式==post){
this.dopost();
}else if(请求方式==GET){
this.doGet();
}
}
onservlet类:
doGet doPost
补充:this的指向问题
this指向的是调用service方法的实例对象。
因为是oneservlet.service(),所以,service中的this.doGet中的this,指的是oneservlet,执行的方法是oneservlet中重写后的doGet方法。
如果oneservlet中没有重写doGet方法,则oneservlet.service()中的this.doGet执行的才是父类的doGet
第三步:
将servlet接口实现类信息【注册】(通知)到tomcat服务器
到网站的核心配置文件(web.xml)向tomcat注册动态资源文件
【网站文件】—【web】—【web-inf】—【web.xml】
将servlet接口实现类类路径地址交给tomcat
<servlet>
<servlet-name>name</servlet-name> <!-- 声明一个变量储存servlet接口实现类的路径-->
<servlet-class>com.test.controller.Oneservlet</servlet-class> <!-- 声明servlet接口实现类的路径-->
</servlet>
Tomcat:
String name = “com.test.controller.Oneservlet”;
为了降低用户访问访问servlet接口实现类的难度,需要设置简短请求别名
<servlet-mapping>
<servlet-name>name</servlet-name>
<url-pattern>/one</url-pattern><!--在此设置简短的请求别名。书写时以‘/’开头-->
</servlet-mapping>
如果现在浏览器向tomcat服务器索要oneservlet地址时,写成
http://localhost:8080/myweb/one