1.如何开发一个Servlet
1.1 步骤
1)编写java类,继承HttpServlet类 2)重写doGet和doPost方法 3)Servlet程序交给tomcat程序服务器运行 3.1 Servlet程序的class字节码文件拷贝到WEB-INF/classes目录 3.2 在web.xml文件中进行配置<servlet>访问URL: http://localhost:8080/JavaWeb_Servlet_Study_20170720/ServletDemo01
<servlet-name>ServletDemo01</servlet-name>
<servlet-class>yorisk.servlet.study.ServletDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo01</servlet-name>
<url-pattern>/ServletDemo01</url-pattern>
</servlet-mapping>
Tomcat服务器启动时,首先加载webapps中的每个web应用的web.xml配置文件。 http://:http协议 localhost:到本地的hosts文件中查找是否存在该域名对应的IP地址
8080:找到tomcat服务器,tomcat默认端口为8080 /JavaWeb_Servlet_Study_20170720:在tomcat的webapps目录下找到对应项目 /ServletDemo01:资源名称 1)在JavaWeb_Servlet_Study_20170720的web.xml中查找是否有匹配的url-pattern的内容(/ServletDemo01) 2)如果找到匹配的url-pattern,则使用当前servlet-name的名称到web.xml文件中查询是否有同名称的servlet配置 3)如果找到,则取出对应的servlet配置信息中的servlet-class内容: 字符串:yorisk.servlet.study.ServletDemo01 通过反射: a)构造ServletDemo01的对象 b)然后调用ServletDemo01中的方法
2.Servlet的映射路径
<servlet-mapping>
<servlet-name>ServletDemo01</servlet-name>
<url-pattern>/ServletDemo01</url-pattern>
</servlet-mapping>
精确匹配/ServletDemo01
模糊匹配/**.后缀名注意:1)url-pattern要么以/开头,要么以*开头。例如,ServletDemo01是非法路径2)不能同时使用两种模糊匹配,例如/*.do是非法路径3)当有输入的URL有多个sevlet同时被匹配的情况下:3.1 精确匹配优先。(长得最像优先被匹配)3.2 以后缀名结尾的模糊匹配 url-pattern优先级最低!!
3.sevlet缺省路径
servlet缺省路径(<url-pattern></url-pattern>)是在tomcat服务器内置的一个路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web应用的静态资源文件。 问题:URL输入http://localhost:8080/JavaWeb_Servlet_Study_20170720/index.html 如何读取文件? 1)到当前JavaWeb_Servlet_Study_20170720应用下的web.xml文件查找是否有匹配的url-pattern。 2)如果没有匹配的url-pattern,则交给tomcat的内置的DefaultServlet处理 3)DefaultServlet程序到JavaWeb_Servlet_Study_20170720应用的根目录下查找是否存在一个名称为index.html的静态文件。 4)如果找到该文件,则读取文件内容,返回给浏览器。 5)如果找不到该文件,则返回404错误页面。结论:先找动态资源,再找静态资源。
4.Servlet的生命周期(重点)
4.1 引入
Servlet的生命周期:servlet类对象什么时候创建,什么时候调用什么方法,什么时候销毁。 以前的对象:new Student(); stu.study(); stu = null; Servlet程序的生命周期由tomcat服务器控制。4.2 Servlet重要的四个生命周期方法
构造方法:创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象只调用1次。证明servlet对象在tomcat是单实例的。 init方法:创建完servlet对象的时候调用。只调用1次。 service方法:每次发出请求时调用。调用n次。 destroy方法:销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。4.3 伪代码演示servlet的生命周期
tomcat内部代码运行: 1)通过映射找到servlet-class的内容:字符串:yorisk.servlet.study.ServletDemo01 2)通过反射构造ServletDemo01对象 2.1 字节码对象 Class clazz = class.forName("yorisk.servlet.study.ServletDemo01"); 2.2 调用无参数的构造方法来构造对象 Object obj = clazz.newInstance();——1.servlet的构造方法被调用 3)创建ServletConfig对象,通过反射调用init方法 3.1 得到方法对象 Method m = clazz.getDeclareMethod("init",ServletConfig.class); 3.2 调用方法 m.invoke(obj,config);——2.servlet的init方法被调用 4)创建request,response对象,通过反射调用service方法 4.1 得到方法对象 Method m = clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class); 4.2 调用方法 m.invoke(obj,request,response);——3.servlet的service方法被调用 5)当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法 5.1 得到方法对象 Method m = clazz.getDeclareMethod("destroy",null); 5.2 调用方法 m.invoke(obj,null);——4.servlet的destroy方法被调用4.4 用时序图来演示servlet的生命周期
5.servlet的自动加载
默认情况下,第一次访问sevlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问servlet的时候比较慢。 改变servlet创建对象的时机:提取到加载web应用的时候! 在servlet的配置信息中,加上一个<load-on-startup>即可!<servlet>
<servlet-name>ServletDemo01</servlet-name>
<servlet-class>yorisk.servlet.study.ServletDemo01</servlet-class>
<!-- 让servlet对象自动加载 -->
<load-on-startup>1</load-on-startup> 注意: 整数值越大,创建优先级越低!!
</servlet>