Day15_什么是Servlet;Servlet的入门使用-xml配置方式;Servlet执行流程;生命周期(笔记)
文章目录
1.Servlet的认识
1.1 什么是servlet?
Servlet(Server Applet)是Java
Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
最早支持Servlet标准的是JavaSoft的Java Web
Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。
1.2 Servlet的本质是什么?
一个servlet就是Java编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序。
Servlet的本质:就是一个普通java类型,继承HttpServlet,重写这个类中doGet()/或者doPost()方法(这两个方法常用的)
2.Servlet的入门使用----前期使用xml配置方式(重点掌握)
//第一步:新建一个包,在包上右键new,找到create new servlet 起一个类名,取消最下边的对钩,点击ok
//这个类会继承HttpServlet类,里边重写doget和dopost方法
public class MyFirstServlet extends HttpServlet {
//以后执行前端的get提交(接收前端的请求:get请求)
@Override //请求对象 request 响应对象 response
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//控制台输出
System.out.println("进入servlet了....");
//解决服务器响应给浏览器中文乱码
response.setContentType("text/html;charset=utf-8");
//服务器响应给浏览器
response.getWriter().write("Hello,这是我第一个Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//将doget复用一下 :因为get提交和post提交---这两个方法都可以获取前端的参数
doGet(req,resp);
}
}
<!--在web下边的WEB-INF下边的web.xml里边写如下代码-->
<!--在web-app标签中书写-->
<!--servelt的基本配置-->
<servlet>
<!--一般情况:servlet名称就是当前类名-->
<servlet-name>MyFirstServlet</servlet-name>
<!--当前类的全限定名称-->
<servlet-class>com.qf.firstservlet_01.MyFirstServlet</servlet-class>
</servlet>
<!--servlet的映射配置-->
<servlet-mapping>
<!--这个servlet名称和上面的名称必须一致-->
<servlet-name>MyFirstServlet</servlet-name>
<!--请求servlet的访问路径:必须以"/开头",而且不能以"/"结束,自己给你的servlet访问路径起一个名字
精确匹配 "/映射路径名称",必须唯一
-->
<url-pattern>/myFirst</url-pattern>
</servlet-mapping>
<!--servlet创建对象以及初始化时机 :在tomcat容器启动的时候创建并初始化
数字越大,优先级越小-->
<load-on-startup>1</load-on-startup>
3.Servlet的执行流程(识记----理解)
Servlet容器的工作流程:
为了解耦,HTTP服务器不直接调用Servlet,而是把请求交给Servlet容器来处理,那Servlet容器又是怎么工作的呢?
当客户请求某个资源时,HTTP服务器会用一个ServletREquest对象把客户的请求信息封装起来,
然后调用servlet容器的serbice方法,Servlet容器拿到请求后,
根据请求的URL和Servlet的映射关系,找到相应的Servlet,
如果Servlet还没有被加载,就用反射机创建这个Servlet,
并调用Servlet的init方法来完成初始化,
接着调用Servlet的service方法来处理请求,
把ServletResponse对象返回给HTTP服务器,HTTP服务器会把响应发送给客户端.
1.浏览器向服务器发送请求
2.这个都是tomcat容器完成的事情,解析web.xml
2.1 通过/myFirst--->web.xml里面的url-pattern的配置
2.2 通过<url-pattern>--->获取到对应的servlet-name的名称--->MyFirstServlet
2.3 ---获取Servlet里面的基本配置名称:MyFirstServlet
2.4 通过servlet基本配置中的servlet-name获取它对应的
servlet-class--->com.bing.firstservlet_01.MyFirst 当前类的全限定名称
2.5 web容器----通过全限定名称 伪代码:
Class clazz = Class.forName("om.bing.firstservlet_01.MyFirst");
2.6 创建当前类对象
Object obj = clazz.newInstance();
2.7 发射的方式获取当前类中的成员方法Method类对象
Method m = clazz.getDeclareMethod("doGet",HttpServletRequest.class,HttpServletResponse.class);
受保护的/私有方法,不能直接访问,通过下边的方法
m.setAccessible(true);//取消Java语言访问检查
2.8 调用doGet方法
m.invoke(obj,request,response);
3.解析doGet方法---通过响应对象 给浏览器"Hello,这是我的第一个Servlet"
4.Servlet里面的一些生命周期
Servlet是一个单例的:
servlet默认创建的时机:
在访问servlet的时候才会创建当前类对象----无参构造方法执行一次,以及init(ServletConfig config):执行一次
service():方法 称为,servlet入口(业务服务方法),可以调用多次
detroy():当前tomcat正常关闭,servlet对象被销毁---->交给jvm的垃圾回收线程来回收没有更多引用的对象!
//什么时机创建Servlet对象,什么时候销毁
/**
* Servlet的生命周期: (面试题)
*
* Servlet本质就单例:
*
* 只要访问servlet----内存中始终只有一个对象
* 无参构造方法被调用一次----------->tomcat容器通过反射的方式,创建一次对象
* init(ServletConfig config)----->被初始化一次 :初始化时机---->默认在访问servlet的路径的时候,创建并初始化
* service方法:-------->不断的被调用----->程序的入口--一般开发中覆盖都是具体的业务方法doGet()/doPost()
* destroy方法:销毁方法---->当前tomcat服务器正常关闭----destroy方法执行,要将这个对象内存中释放掉--交给垃圾回收器
*
*/
public class LifeServlet extends HttpServlet {
//无参构造方法
public LifeServlet(){
System.out.println("LifeServlet的对象被创建了....");
}
//重写void init(ServletConfig var1) :servlet的初始化
@Override
public void init(ServletConfig config) throws ServletException {
//ServletConfig ---接口----称为"Servlet配置对象",每一个Servlet都有自己的 配置对象
//方法: String getServletName(); 可以获取当前Servlet名称
System.out.println(config.getServletName()+"被初始化了,init方法被调用!");
}
//程序的入口:业务服务方法
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service方法被调用了");
}
//销毁
@Override
public void destroy() {
System.out.println("servlet被销毁了....");
}
}
//<!--servlet创建对象以及初始化时机 :在tomcat容器启动的时候创建并初始化
// 数字越大,优先级越小-->
// <load-on-startup>1</load-on-startup>