简述servlet的生命周期(工作流程)

来源:互联网 发布:在线客服 java开源 编辑:程序博客网 时间:2024/05/01 05:51

WEB服务器首先会检查是否已经装载并创建了该servlet实例对象。如果是直接进行第④步,否则执行第②步。

装载并创建该Servlet的一个实例对象。

调用Servlet实例对象的init()方法。

创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用service()方法并将请求和响应作为参数传递进去。

WEB应用被停止或重启之前,Servlet引擎将卸载Servlet,在卸载之前调用Servletdestroy()方法


1. serlvet 第一次被调用的时候,会触发init函数,该函数会servlet实例装载到内存.init函数只会被调用一次

2. 然后去调用servlet   service函数

3. 当第二次后访问该servlet 就直接调用 service 函数.

4.  web应用reload 或者关闭 tomcat 或者关机 都会去调用destroy函数,该函数就会去销毁serlvet

5. Servlet的生命周期

当客户端第一次向web服务器发出一个servlet请求时,web服务器将会创建一个该servlet的实例,并且调用servletinit()方法;如果当服务器已经存在了一个servlet实例,那么,将直接使用此实例;然后再调用service()方法,service()方法将根据客户端的请求方式来决定调用对应的doXXX()方法;当web应用 reload 或者关闭 tomcat 或者关机web服务器将调用destroy()方法,将该servlet从服务器内存中删除。

生命全过程:

1.加载

2.实例化

 3.初始化

 4.处理请求

 5.退出服务


开发servlet有三种方法

(1) 实现 Servlet接口

(2) 通过继承 GenericServlet

(3) 通过继承 HttpServlet

①实现servlet接口的方式

需求如下: 请使用实现接口的方式,来开发一个Servlet,要求该Servlet可以显示Hello,world,同时显示当前时间.

步骤

1. webapps下建立一个web应用hspWeb1

2.在hspWeb1 下建立WEB-INF->web.xml [web.xml可以从ROOT/WEB-INF/web.xml

3. WEB-INF 下建立classes 目录(我们的Servlet就要在该目录开发.),建立 lib文件夹

4. 开发MyServlet.java

package com.hsp;

import javax.servlet.*;

import javax.servlet.http.*;  为了能将servlet-api.jar包引入,需要配置环境变量

import java.io.*;class MyFirstServlet implements Servlet{//该函数用于初始化servlet,就是把该servlet装载到内存中//该函数只会被调用一次public void init(ServletConfig config)          throws ServletException{}//得到ServletConfig对象public ServletConfig getServletConfig(){return null;}//该函数是服务函数,我们的业务逻辑代码就是写在这里//该函数每次都会被调用public void service(ServletRequest req,                    ServletResponse res)             throws ServletException,                    java.io.IOException{}//该函数时得到servlet配置信息public java.lang.String getServletInfo(){return null;}//销毁该servlet,从内存中清除,该函数被调用一次public void destroy(){}}

1. 根据Servlet规范,我们还需要部署Servlet

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<!--

 Licensed to the Apache Software Foundation (ASF) under one or more

  contributor license agreements.  See the NOTICE file distributed with

  this work for additional information regarding copyright ownership.

  The ASF licenses this file to You under the Apache License, Version 2.0

  (the "License"); you may not use this file except in compliance with

  the License.  You may obtain a copy of the License at

 

      http://www.apache.org/licenses/LICENSE-2.0

 

  Unless required by applicable law or agreed to in writing, software

  distributed under the License is distributed on an "AS IS" BASIS,

  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  See the License for the specific language governing permissions and

  limitations under the License.

-->

 

<web-app xmlns="http://java.sun.com/xml/ns/javaee"

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

   version="2.5">

 

<!--根据serlvet规范,需要将Servlet部署到web.xml文件,该部署配置可以从examples下拷贝-->

 <servlet>

<!--servlet-name 给该Servlet取名,该名字可以自己定义:默认就使用该Servlet的名字-->

      <servlet-name>MyFirstServlet</servlet-name>

  <!--servlet-class要指明该Servlet放在哪个包下 的,形式是 包//../-->

      <servlet-class>com.hsp.MyFirstServlet</servlet-class> 注意:后面不要带.java

    </servlet>

<!--Servlet的映射-->

 <servlet-mapping>

<!--这个Servlet-name要和上面的servlet-name名字一样-->

        <servlet-name>MyFirstServlet</servlet-name>

<!--url-pattern 这里就是将来访问该Servlet的资源名部分-->

        <url-pattern>/ABC</url-pattern>

    </servlet-mapping>

 

</web-app>

服务器调用流程http://localhost:8088/ABC--->--->--->--->

2. 在浏览器中测试

在浏览器中输入

http://localhost:8088/hspweb1/ABC

 

3. 分析一下自己写可能出现的错误

(1) <servlet-name>MyFirstServlet</servlet-name> 名字不一样 (启动tomcat错误)

(2) <servlet-class>com.hsp.MyFirstServlet</servlet-class>  写成MyFirstServlet.java,会报告500

(3) 资源名自己写错

 

http://localhost:8088/hspweb1/错误的资源url-pattern

404 错误


补充: 如果使用javac去编译一个java文件,则需要带命令参数

javac d . java文件

补充: 如何不重启tomcat,就指定去reload 一个web应用,方法:


 ②使用GenericServlet开发servlet

了解即可:

案例

package com.hsp;import javax.servlet.*;import javax.servlet.http.*;import java.io.*;public class MyGenericServlet extends GenericServlet{public  void service(ServletRequest req,                             ServletResponse res)                      throws ServletException,                             java.io.IOException{res.getWriter().println("hello,world,i am geneirc servlet");}}

 ③使用继承 HttpServlet 的方法来开发Serlvet

(1) 在软件公司 90%都是通过该方法开发.

(2) 举例说明; 还是显示hello,world 当前日期

package com.hsp;import javax.servlet.*;import javax.servlet.http.*;import java.io.*;public class MyHttpServlet extends HttpServlet{//在HttpServlet 中,设计者对post 提交和 get提交分别处理//回忆 <form action="提交给?" method="post|get"/>,默认是getprotected void doGet(HttpServletRequest req,                     HttpServletResponse resp)              throws ServletException,                     java.io.IOException{resp.getWriter().println("i am httpServet doGet()");}protected void doPost(HttpServletRequest req,                      HttpServletResponse resp)               throws ServletException,                      java.io.IOException{ resp.getWriter().println("i am httpServet doPost() post name="+req.getParameter("username"));}}


小结 get 提交 和 post的提交的区别

① 从安全看 get<post 因为get 会把提交的信息显示到地址栏

② 从提交内容看 get<post get 一般不要大于2k, post理论上无限制,但是在实际开发中,建议不要大于64k

③ 从速度看 get>post

④ Get可以保留uri中的参数,利于收藏

 


0 0
原创粉丝点击