JavaWeb学习笔记——Servlet编程

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>
    <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>
访问URL: http://localhost:8080/JavaWeb_Servlet_Study_20170720/ServletDemo01

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>

6.有参的init方法和无参的 init方法





















猜你喜欢

转载自blog.csdn.net/u013780676/article/details/75486264
今日推荐