servlet

Posted 優syousetu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了servlet相关的知识,希望对你有一定的参考价值。

servlet学习大纲:

  1.servlet概念及相关接口简介

  2.servlet执行过程

  3.servlet路径映射

  4.缺省servlet  应用

  5.servlet生命周期(重点)

  6.servlet自动加载

  7.servlet线程安全

  8.servletConfig对象

  9.servlet相关接口详解

  10.servletContext对象  知识点


  1.如何开发一个servlet

   1.1步骤:

    1.编写一个java类,继承httpservlet

    2.重写doget/dopost方法

    3.servlet程序交给tomcat服务器运行

      1.servlet程序的class码拷贝到WEB-INF/classes目录

      2.在web.xml文件中进行配置

 1 <servlet>
 2     <!--配置一个servlet-->
 3     <description></description>
 4     <!--servlet内部名称,自定义,尽量有意义-->
 5     <display-name>response_location</display-name>
 6     <servlet-name>response_location</servlet-name>
 7     <!-- servlet的类全名,包名加简单类名 -->
 8     <servlet-class>com.http.response.response_location</servlet-class>
 9   </servlet>
10     <!-- servlet映射配置 -->
11   <servlet-mapping>
12     <!--servlet内部名称,要和上边保持一致-->
13     <servlet-name>response_location</servlet-name>
14     <!--servlet的映射路径(访问servlet的名称)-->
15     <url-pattern>/response_location</url-pattern>
16   </servlet-mapping>

问题:访问 url:http://localhost:8080/项目名/uri

tomcat启动时,首先加载webapp的每个web应用中的web.xml配置文件

  http://  :http协议

  localhost:到本地的hosts文件中查找是否存在该域名对应的IP地址

  8080:  找到tomcat服务器

  /项目名:  在tomcat的webapp目录下找项目名称的目录

  /uri:  资源名称

    1.在项目的web.xml中查找是否有匹配的url-pattern的内容(uri)

    2.如果找到了url-pattern,则使用当前servlet-name的名称到web.xml文件中查询是否有名称一样的servlet配置

    3.如果找到,则取出对应的servlet配置信息中的servlet-class内容

      通过反射:

        构造类的对象

        然后调用类里面的方法

2.servlet的映射路径

  精确匹配

    url-pattern:/first

    浏览器输入: http://localhost:8080/项目名/first

    url-pattern:/java/first

    浏览器输入:http://localhost:8080/项目名/java/first

  模糊匹配

      url-pattern        浏览器输入

      *.后缀名       http://localhost:8080/项目名/任意路径

      /java/*         http://localhost:8080/项目名/任意路径

      *.do         http://localhost:8080/项目名/任意路径.do

      /*          http://localhost:8080/项目名/任意路径

      *.action

      *.html(伪静态)

       1. 精确匹配与模糊匹配同时存在时,优先精确匹配  (长得最像)

       2.以后缀名结尾的模糊url-pattern优先级最低

    /*   servlet的缺省路径

      servlet的缺省路径是在tomcat服务器内置的一个路径。改路径对应的是一个defaultServlet(缺省的servlet)这个缺省的servlet的作用是解析web应用的静态资源文件

    问题:URL输入 http://localhost:8080/项目名/uri  如何读取文件

    1.到当前项目应用下的web.xml文件,查找是否有匹配的url-pattern

    2.如果没有匹配的url-pattern,则交给tomcat的内置servlet处理

    3.defaultServlet程序到项目应用的根目录下查找是否存在一个名为index.html静态文件

    4.如果找到该文件,则读取该文件的内容,然后返回给浏览器

    5.如果找不到文件,则返回404错误页面

      结论:先找动态资源,再找静态资源

servlet的生命周期(重点)

  4.1引入

    servlet的生命周期:servlet类的对象什么时候创建,调用什么方法,什么时候销毁。

    以前的对象,new Student()   调用方法   销毁,置其为空

    servlet程序的生命周期由tomcat服务器控制

  4.2servlet重要的生命周期:

    GenericServlet  没有任何协议(但是是HttpServlet的父类)及没有http协议,没有doget/dopost

    

 1 package com.java.servlet;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletConfig;
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 public class ServletLife extends HttpServlet{
12     /**
13      * 1.构造方法
14      */
15     public ServletLife(){
16         System.out.println("1.servlet对象被创建了");
17         
18     }
19     /**
20      * 2.init方法
21      */
22     @Override
23     public void init() throws ServletException {
24         // TODO Auto-generated method stub
25         super.init();
26     }
27     
28     @Override
29     public void init(ServletConfig config) throws ServletException {
30         System.out.println("2.init 方法被调用");
31         super.init(config);
32     }
33     
34     @Override
35     protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
36         System.out.println("3.service 方法被调用");
37     }
38     
39     @Override
40     public void destroy() {
41         System.out.println("4.destory销毁方法被调用,servlet对象已经被销毁");
42     }
43     
44 }

运行结果:

  第一次

1 1.servlet对象被创建了
2 2.init 方法被调用
3 3.service 方法被调用

  第二次

1 1.servlet对象被创建了
2 2.init 方法被调用
3 3.service 方法被调用
4 3.service 方法被调用

  对比显示:servlet对象被创建一次,init方法被调用一次  

        访问一次servlet,service方法被调用一次

 停掉服务器或者重新部署

  

1 4.destory销毁方法被调用,servlet对象已经被销毁

构造方法:创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建对象,只调    用一次,证明servlet对象在tomcat中是单实例的

init方法:创建完servlet对象的时候调用,只调用一次

service方法:每次发出请求时调用,调用多次

destory方法:销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象,调用多次

  4.3伪代码演示servlet的生命周期

    1.通过映射找到servlet-class的内容  字符串:com.java.servlet.ServletLife

    2.通过反射构造ServletLife对象

      2.1得到字节码对象

      Class clazz = clazz.forName("com.java.servlet.ServletLife");

      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应用重新部署,通过反射调用destory方法

        5.1得到方法到的对象

          Method m = clazz.getDeclaredMethod("destory",nulll);

          m.invoke(obj,null);      ---------------4.servlet的destory的方法被调用

   

 

以上是关于servlet的主要内容,如果未能解决你的问题,请参考以下文章

servlet和filter的区别

Java基础——JSP

java---servlet与filter的联系与区别

servlet,filter,listener,intercepter区别

Tomcat根据JSP生成Servlet机制解析

servlet,过滤器,监听器,拦截器的区别