06.实现servlet的几种方式,以及接口或者类之间的关系

接口:Servlet、ServletConfig、ServletRequest、ServletResponse、HttpServletRequest、HttpServletResponse、ServletContext

类:HttpServlet(抽象类)、GenericServlet(抽象类)

来张关系图

ServletContext:

ServletContext的对象是application是在项目初始化时被创建的。故servletContext随着应用初始化而被创建,随着应用的结束而被销毁。

ServletConfig :

 在应用初始化的时候,Web容器在创建Servlet对象时会自动将web.xml中的servlet配置这些初始化参数封装到ServletConfig对象中,并在调用servlet
 的init方法时,将ServletConfig对象传递给servlet。所以我们可以通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

Servlet:

初始化有两种情况:

 一、随应用初始化时初始化,即在web.xml中设置<load-on-startup>参数</load-on-startup>,参数为整数值并且大于0,而且值越少,优先级越高。
 在springmvc项目中经常会用到这个配置
二、在应用运行中时,servlet被客户端请求时初始化。

servlet销毁:

servlet自身调用destroy()方法、servlet容器停止运行、项目停止运行都会销毁该servlet实例。

ServletRequest:

ServletRequest的对象是request,其生命周期为request域,一个请求结束,则request对象结束。

ServletResponse:

ServletResponse的对象是response,一次响应结束,则response对象结束。

HttpServlet和HttpServletRequest、HttpServletResponse

他们之间的关系就好像Servlet和ServletRequest、ServletResponse之间的关系一样,只不过做了少部分封装而已

(附加)请求的响应方式有四种:

request.getRequestDispatcher("*.jsp").forward(request, response) //转发
response.sendRedirect("*.jsp")//重定向
response.getOutputStream()//流
response.getWriter()//直接响应

看示意图:

1.继承GenericServlet

public class TestServlet extends GenericServlet {

    private static final long serialVersionUID = 1L;

    @Override
    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException {

    }
}
--------------------------------------------------------
GenericServlet--抽象类,实现了Servlet接口

public abstract class GenericServlet
    implements Servlet, ServletConfig, java.io.Serializable
{

    private transient ServletConfig config;
    .........
    .........
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

2.继承HttpServlet

好爽,request,response,config,都是现成的,service方法已经被重写,只需要根据需求调用 doGet() 或者doPost() 方法即可!!!

public class TestServlet2 extends HttpServlet {

    public TestServlet2() {
        super();
    }

    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
    }

    public void doDelete(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

    }
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    }

    public void doPut(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    }
    public void init() throws ServletException {
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

HttpServlet

这个类继承GenericServlet类,实现了Java.io.Serializable的接口,它是个抽象类,给其子类创建一个Http Servlet去适应一个网站。

而HttpServlet的子类必须重写至少一个方法,其中较为经常修改的方法有:

1、如果你希望servlet支持HTTP的Get请求,重写doGet方法

2、如果你希望servlet支持HTTP的Post请求,重写doPost方法

3、如果你希望servlet不但可以处理数据,还可以处理文件,重写doPut方法。Put的调用和Post相似,它允许客户端把真正的文件存放在服务器上,而不仅仅是传送数据

4、如果你希望servlet允许客户端删除服务器端的文件或者Web页面,重写doDelete方法,它与Put相似。

5、如果你希望控制servlet生命周期所产生的资源,可以重写init和destroy方法

6、如果你希望servlet提供关自身的相关信息,可以调用或重写javax.servlet.http.HttpServlet类继承javax.servlet.GenericServlet类的getServletInfo方法。

public abstract class HttpServlet extends GenericServlet
    implements java.io.Serializable {
    }
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

3.实现Servlet接口

public class TestServlet implements Servlet {

    private static final long serialVersionUID = 1L;

    public void destroy() {

    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public String getServletInfo() {
        return null;
    }

    public void init(ServletConfig config) throws ServletException {

    }

    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException {

    }

}

是不是很不爽,需要重写这么多方法!!!

首先明确,Servlet并不是专门用于处理Http请求的。然后再说三种方式的联系和区别。
1)原生Servlet接口

package javax.servlet;

import java.io.IOException;

public interface Servlet {

    public void init(ServletConfig config) throws ServletException;

    public ServletConfig getServletConfig();

    public void service(ServletRequest req, ServletResponse res)
	throws ServletException, IOException;

    public String getServletInfo();

    public void destroy();
}

可以看到Servlet接口是定义在javax.servlet包中,该接口定义了5个方法。
init() :在Servlet实例化之后,Servlet容器会调用init()方法,来初始化该对象,主要是为了让Servlet对象在处理客户请求之前可以完成一些初始化工作,比如:建立数据库的连接,获取配置信息。

service():容器调用service()方法来处理客户端的请求。

destroy():当容器检测到一个Servlet对象应该从服务器中被移除的时候,容器会调用该对象的destroy方法,以便让Servlet对象可以释放它所使用的资源,保存数据到持久化存储设备中,例如:将内存中的数据保存到数据库中,关闭数据库的连接。

2)GenericServlet

为什么会出现GenericServlet?如果我们直接通过实现Servlet接口来编写一个Servlet类,就需要实现Servlet接口中定义的5种方法,为了简化Servlet的编写,在javax.servlet包中,给我们提供了一个抽象的类GenericServlet,它提供了除service()方法外的其他4种方法的简单实现。GenericServlet类定义了一个通用的,不依赖具体协议的Servlet

package javax.servlet;

import java.io.IOException;
import java.util.Enumeration;
import java.util.ResourceBundle;

public abstract class GenericServlet
    implements Servlet, ServletConfig, java.io.Serializable
{
    private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
    private static ResourceBundle lStrings =
        ResourceBundle.getBundle(LSTRING_FILE);

    private transient ServletConfig config;

    public GenericServlet() { }

    public void destroy() {
    }

    public String getInitParameter(String name) {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(
                lStrings.getString("err.servlet_config_not_initialized"));
        }

        return sc.getInitParameter(name);
    }

    public Enumeration<String> getInitParameterNames() {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(
                lStrings.getString("err.servlet_config_not_initialized"));
        }

        return sc.getInitParameterNames();
    }   

    public ServletConfig getServletConfig() {
	return config;
    }

    public ServletContext getServletContext() {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(
                lStrings.getString("err.servlet_config_not_initialized"));
        }

        return sc.getServletContext();
    }

    public String getServletInfo() {
	return "";
    }

    public void init(ServletConfig config) throws ServletException {
	this.config = config;
	this.init();
    }

    public void init() throws ServletException {

    }

    public void log(String msg) {
	getServletContext().log(getServletName() + ": "+ msg);
    }

    public void log(String message, Throwable t) {
	getServletContext().log(getServletName() + ": " + message, t);
    }

    public abstract void service(ServletRequest req, ServletResponse res)
	throws ServletException, IOException;

    public String getServletName() {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(
                lStrings.getString("err.servlet_config_not_initialized"));
        }

        return sc.getServletName();
    }
}

3)HttpServlet

由于大多数网络应用中,都是浏览器通过HTTP协议去访问服务器资源,而我们编写的Servlet也主要是应用于HTTP协议的请求和响应,为了快速开发应用于HTTP协议的Servlet,Sun公司在javax.servlet.http包中给我们提供了一个抽象的类HttpServlet,他继承自GenericServlet类,用于创建适合Web站点的HTTP
Servlet。

比如,doPost doGet这些方法,从request解析请求信息开始,将根据http协议的格式进行解析,分发到不同的请求方法处理中,doPost doGet也肯定是被service方法调用的。

时间: 2024-09-29 17:13:32

06.实现servlet的几种方式,以及接口或者类之间的关系的相关文章

Struts2访问servlet的三种方式

第一种方式:使用ActionContext类实现 //获取对象 ActionContext context = ActionContext.getContext(); //获取页面提交数据 Map<String, Object> parameters = context.getParameters(); //操作域对象相关的方法 context.put(String,Object);//相当于HttpServletRequest的setAttribute方法 context.getApplic

实现servlet的三种方式

实现servlet的三种方式 01,实现servlet接口 02,继承GenericServlet 03,继承HttpServlet 常用的 注:Httpservlet=====extends====>GenericServlet=====implements====>Servlet接口

9.9-全栈Java笔记:遍历集合的N种方式总结&Collections工具类

遍历集合的N种方式总结 [示例1]遍历List方法1,使用普通for循环 for(int i=0;i<list.size();i++){         //list为集合的对象名 String temp = (String)list.get(i); System.out.println(temp); } [示例2]遍历List方法2,使用增强for循环(使用泛型定义类型!) for (String   temp : list) { System.out.println(temp); } [示例

创建servlet的三种方式

第一种方式,实现Servlet接口 1 package com.example.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.Servlet; 6 import javax.servlet.ServletConfig; 7 import javax.servlet.ServletException; 8 import javax.servlet.ServletRequest; 9 import javax.se

Servlet第七课:ServletContext HttpSession 以及HttpServletRequest之间的关系

课程目标: ① 在Servlet中懂得ServletContext HttpSession 以及HttpServletRequest之间的关系 ② 懂得怎样使用它们 概念介绍: 1. [共同点]不管对象的作用域怎样,共享变量和获得变量的 方法都是一致的 –setAttribute("varName",obj); –getAttribute("varName"). 2. 变量的作用域 ServletContext–范围最大.应用程序级别的,整个应用程序都能訪问 Htt

ThinkPHP教程_PHP框架之ThinkPHP(二)【URL路径访问与模块控制器、URL四种模式、PATHINFO的两种模式、模板与控制器之间的关系】

一.URL路径访问与模块控制器 URL 模块(控制器) 动作(方法) 即以上三者之间的关系URL:http://127.0.0.1/projectName/index.php/模块/动作 1.ThinkPHP规定,两点 ·第一.所有的主入口文件默认访问index控制器(模块) ·第二.所有的控制器默认执行index方法(动作) 特别强调一下,以上两点是独立的!也就是说"所有的主入口文件默认访问index控制器,并执行默认执行index方法"是不准确的 那么,http://127.0.0

struts2中Action访问servlet的两种方式

一.IoC方式 在struts2框架中,可以通过IoC方式将servlet对象注入到Action中,通常需要Action实现以下接口: a. ServletRequestAware: 实现该接口的Action可以直接访问Request对象,该接口中提供void setServletRequest(HttpServletRequest request) 方法,实现此接口的Action控制类通过setServletRequestHttpServlet(HttpServlet request)方法将r

开发Servlet的三种方式

我们开发servlet主要有三种方法: 1:用servlet的接口. 2:继承GenericServlet 3:继承Httpservlet 第一种是比较古老的方法,既然定义了接口,那么就要去显现其下面的的五个方法. 第二种是相当于把servle的接口方法封装好的.只要实现一个方法就可以. 第三种相比第二种也更为强大,也最常用 在部署好servlet的前提下,实例代码如下: 1: package com_1; import javax.servlet.*; import javax.servlet

tomcat部署java servlet的3种方式

1.将编译好的class文件按照与工程中的package的目录结构一致的文件夹底下 2.将你的servlet封装成 .war(web application archive格式的后缀名) 格式的文档直接拖到classes中即可(tomcat在部署时会自动将.war中的文件展开) 3.配置自定义的docBase文件夹,文件夹中包含一个WEB-INF文件夹,该文件夹与tomcat-root中的WEB-INF结构一致,然后部署时还是按照上面的1,或2来操作即可