首页 > 代码库 > java:Servlet(Create,LifeCycle,交互式,Tomcat文件分析)

java:Servlet(Create,LifeCycle,交互式,Tomcat文件分析)

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。
 
2.MyEclipse创建Servlet:
  首先创建Web Project项目:
 
         技术分享
  
  然后一直点击Next,直到这个界面,将Generate web.xml deployment  descriptor选中(内部创建形成一个web.xml文档),点击Finish结束
 
          技术分享
 
创建Servlet类:
  
package cn.zzsxt.lee.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @description servlet也是一个普通的Java类 继承了HttpServlet就变的不普通 servlet是什么?-->Java类
 *              用于在http协议中,进行数据的传递 干什么用的? 处理客户端发送的请求
 * @author Seven Lee
 * @date 2017年7月17日下午4:20:30
 * 
 * servlet生命周期:(单例)(!!重要)
 *     1.加载并实例化(创建servlet对象)
 *  2.初始化(init)(只会被调用一次,第一次访问servlet的时候调用)
 *  3.处理客户端的请求并响应(service)
 *  4.自动销毁(destroy)(也只会被调用一次,在正常关闭以后会被调用)
 *
 */
public class FirstServlet extends HttpServlet {
    // 连接数据库,进行把用户的信息存储入数据,并返回用户是否存储成功

    @Override
    public void init() throws ServletException {
        // init方法只会被调用一次,第一此访问servlet的时候会被调用
        System.out.println("我是init方法,我被调用了");
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // service方法每发送一次请求就被调用一次
        // request-->请求:处理客户端发送到服务器的请求
        // response-->响应:处理完请求以后,向客户端进行响应(404, 500...),如果成功200 OK
        System.out.println("我是service方法,我被调用了");
        // 设置编码格式
        request.getRequestDispatcher("index.jsp").forward(request, response);
    }

    @Override
    public void destroy() {
        // destroy方法也只会被调用一次
        // 服务器关闭的时候,客户端关闭连接的时候,处理完所有客户端请求的时候(正常关闭),非正常关闭的情况下是不被调用的
        System.out.println("我是destroy方法,我被调用了");
    }

}

 

修改web.xml文档:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>first_servlet</display-name>
    <servlet>
        <servlet-name>servlet</servlet-name><!-- servlet-name是随意规定的,没有任何限制,命名规则同样遵循Java的驼峰命名规则 -->
        <servlet-class>cn.zzsxt.lee.servlet.FirstServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servlet</servlet-name><!-- servlet-mapping中servlet-name要和<servlet>中的一模一样 -->
        <!-- <url-pattern>/reg</url-pattern> --><!-- 就是访问servlet的路径,只有通过这个路径才能访问servlet -->
        <url-pattern>*.aaa</url-pattern><!-- 以aaa结尾的方式进行匹配servlet -->
        <!-- <url-pattern>/ccc/*</url-pattern> --><!-- 以ccc开头来匹配servlet -->
        <url-pattern>/*</url-pattern><!-- 所有的路径都要被servlet进行拦截 -->
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    
</web-app>

 

localhost:8080/项目名:查看index.jsp

localhost:8080/项目名/reg(各种访问方式) :通过访问网页对将数据传送到后端控制台

 

 

3.Servlet Life Cycle:

技术分享

 

 

  A:加载Servlet
      加载一般是在运行tomcat容器时来完成,将servlet类加载到tomcat中,或者是客户端发来请求时也可以。
    web容器负责加载Servlet,当web容器启动时或者是在第一次使用这个Servlet时,容器会负责创建Servlet实例,但是用户必须通过   部署描述符(web.xml)指定Servlet的位置,也就是Servlet所在的类名称,成功加载后,web容器会通过反射的方式对Servlet进行实例化。
  
  B:初始化
当一个Servlet初始化后,容器将调用init()方法初始化这个对象,初始化的目的是为了让Servlet在处理客户端请求前完成一些初始化的工作,如建立数据库连接,读取资源文件信息等,如果初始化失败,则次Servlet将被直接卸载。
 
  C:进入服务
当有请求提交时,Servlet将调用service()方法进行处理,常用的是service根据请求类型调用doGet()或者doPost()方法进行处理;在service()方法中,Servlet可以通过ServletRequest接受客户的请求,也可以利用ServletResponse设置响应信息。
  
  D:销毁
当web容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()方法,以便让该实例释放掉所占用的资源。
 
  E:卸载
当一个Servlet调用完destroy()方法后,次实例将等待被垃圾收集器所回收,如果需要再次使用此Servlet时,会重新调用init()方法初始化。
 
 
 
  注意:
  在正常情况下,Servlet只会初始化一次,而处理服务会调用多次,销毁也只会调用一次;但是如果一个Servlet长时间不使用的话,也会被容器自动销毁,而如果需要再次使用时会重新进行初始化的操作,即在特殊情况下初始化可能会进行多次,销毁也可能进行多次。
 
  对于service()方法,一般来说这个方法是不需要重写的,因为在HttpServlet中已经有了很好的实现,它会根据请求的方式,调用doGet(),doPost()方法,也就是说service()是用来转向的,所以我们一般写一个Servlet,只需要重写doGet()或者doPost()就可以了。如果重写了service()方法,那么Servlet容器就会把请求交给这个方法来处理,倘若你重写的service()方法没有调用doXXX(),即使你在Servlet中又重写了其它doGet(), doPost()等也是不会被调用的,因为Servlet的service()被自动调用(就像init()和destory()方法一样),所以如果你由于某种需要,需要重写service()方法,并且根据不同的method调用doPost(),doGet()方法时,就要在末尾加上一句super.service(),这样就可以解决问题了。
 
4.交互式:
技术分享
 
5.Tomcat文件分析:
技术分享

java:Servlet(Create,LifeCycle,交互式,Tomcat文件分析)