博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet API
阅读量:5011 次
发布时间:2019-06-12

本文共 5798 字,大约阅读时间需要 19 分钟。

 Servlet API的查询网址:通过Tomcat的官网链接找到

可见,Servlet API有4个packages

javax.servlet  // 包含定义Servlet和Servlet容器之间契约的类和接口javax.servlet.http  // 包含定义Http Servlet和Servlet容器之间契约的类和接口javax.servlet.annotation  // 包含标注Servlet、Filter、Listener标注的标注。javax.servlet.description  // 包含提供程序化登录web应用程序的配置信息的类型。

Servlet接口

Servlet技术的核心是javax.servelt.Servlet接口,该接口是所有Servlet类必须直接或者间接实现的一个接口。

Servlet接口定义了Servlet与Servlet容器之间的契约,即Servlet容器将Servlet类载入内存,并在Servlet实例上调用具体的方法,在每个应用程序中,每种Servlet类型只能有一个实例。

 Servlet接口中定义了5个抽象方法

Servlet没有main()方法,所有的行为都由Servlet容器控制,调用Servlet方法时的参数也有Servlet容器传递。

ServletRequest接口

对于每一个HTTP请求,Servlet容器都会创建一个javax.servlet.ServletRequest实例,并将其传递给Servlet的service()方法。ServletRequest实例封装了这个HTTP请求的信息。

常用的方法有:

public int getContentlength()  // 获得请求主体的字节数public String getContentType()  // 获取请求主体的MIME类型public String getProtocol()  // 获得这个HTTP请求的协议名称和版本public String getParameter(String name)  // 获取指定参数的值,通常用于返回HTML表单域的值或者查询字符串的值public String getParameterNames()public String getParameterMap()public String getParameterValues()

ServletResponse接口

javax.servlet.ServletResponse接口表示一个Servlet响应。在调用Servlet的service()方法前,Servlet容器会首先创建一个ServletResponse实例,并将其作为第二个参数传递给service(),ServletResponse隐藏了向浏览器发送相应的复杂过程。

常用方法有:

public java.io.PrintWriter getWriter()  //  得到一个向客户端发送文本的PrintWriter实例。默认使用ISO-8895-1编码public ServletOutputStream getOutputStream()  // 用于发送二进制数据的pubic void setContentType(String type)  // 设置相应的内容类型,比如"text/html"表示内容类型为HTML

ServletConfig接口

ServletConfig实例对象可以封装通过注解(@WebServlet)或者部署描述符(web.xml文件)传递给Servlet的初始配置信息。

当Servlet容器初始化Servlet时,Servlet容器会向Servlet的init()方法传入一个ServletConfig实例对象。因此在Servlet内部可以通过调用ServletConfig的响应方法获得初始参数的值

通过注解或者部署描述符传入的每一条信息就叫做一个初始参数。每个初始参数由key和value两个元件组成。

该接口只有4个方法

使用ServletConfig在Servlet中获取初始参数的范例

package app01a;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebInitParam;import javax.servlet.annotation.WebServlet;@WebServlet(name = "ServletConfigDemoServlet", urlPatterns = { "/servletConfigDemo" },   //url映射            initParams = { @WebInitParam(name = "admin", value = "harry Taciak"),  // 向Servlet中传入初始参数                           @WebInitParam(name = "emial", value = "admin@example.com")  // 向Servlet中传入初始参数                         }           )public class ServletConfigDemoServlet implements Servlet {    private transient ServletConfig servletConfig;    @Override    public void destroy() {    }    @Override    public ServletConfig getServletConfig() {        return this.servletConfig;    }    @Override    public String getServletInfo() {        return "servletConfig demo";    }    @Override    public void init(ServletConfig servletConfig) throws ServletException {        this.servletConfig = servletConfig;    }    @Override    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {        ServletConfig servletConfig = getServletConfig();        String admin = servletConfig.getInitParameter("admin");        String email = servletConfig.getInitParameter("email");        response.setContentType("text/html");        PrintWriter writer = response.getWriter();        writer.print("" +                     "Admin: " + admin +                    "
Email: " + email + ""); }}
View Code

ServletContext接口

 ServletContext实例对象表示Servlet应用程序,每个Web应用程序只有一个上下文。

通过调用ServletConfig对象的getServletContext()方法,可以获得ServletContext实例对象。

ServletContext用于Web应用中的资源共享。有了ServletContext,就可以共享从应用程序中的所有资料出访问到的信息,并且可以动态注册Web对象。

ServletContext将Web对象保存在ServletContext中的一个内部Map中,保存在ServletContext中的对象称为属性。

GenericServlet抽象类

public abstract class GenericServletextends java.lang.Objectimplements Servlet, ServletConfig, java.io.Serializable

GenericServlet抽象类实现了Servlet接口和ServletConfig接口。并完成了以下工作:

-- 将init()方法中的ServletConfig对象赋给一个类的成员变量,来保存ServletConfig,从而可以通过调用getServletConfig()获得ServletConfig对象。其实现代码如下:

public void init (ServletConfig servletConfig) throws ServletException {    this.servletConfig = servletConfig;    this.init();  // 这是 GenericServlet 提供的一个没有参数的init()方法,可以通过覆盖init()来提供初始化代码}

-- 为Servlet接口中的除了service()方法外提供默认的实现

-- 提供方法,包围ServletConfig中的方法.

HttpServlet抽象类

public abstract class HttpServletextends GenericServlet

HttpServlet类覆写了GenericServlet类中的service()方法;同时还重载了另外一个service() 方法,二者的参数类型不同。

覆盖后的service()方法将Servlet容器的ServletRequest和ServletResponse对象分别转化成HttpServletRequest和HttpServletResponse对象,并调用新的service()方法。

public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {    HttpServletRequest request;    HttpServletResponse response;    try {        request = (HttpServletRequest) req;  // 类型转换        response = (HttpServletResponse) resp;  // 类型转换    } catch (ClasscastException e) {        throw new ServletException("non-Http request or response");    }    service(request, response);  // 调用新的service()方法}// 由于在调用Servlet的service()时,Servlet容器总会传入一个HttpServletRequest和一个HttpServletResponse,预备使用Http,因此这种转换总会成功。

然后,HttpServlet中的service()方法会检查用来发送请求的HTTP请求方法(通过调用HttpServletRequest的getMethod()方法获得),并根据HTTP方法调用相应的doGet()、doPost()、doHead()、doPut()、doTrace()、doOptions()、doDelete()中的一个。

因此不需要覆写service()方法了,只需要覆写相应的doXxx()即可,其中doGet()和doPost()最常用。

总之,HttpServlet有两个特性是GenericService()所不具备的

(1)不用覆写service()方法,而是覆写doGet()、doPost()、或者其他doXxx()方法

(2)使用HttpServletRequest和HttpServletResponse,而不是ServletRequest和ServletResponse。

HttpServletRequest接口

HttpServletRequest表示在HTTP环境中的ServletRequest。

public interface HttpServletRequestextends ServletRequest

HttpServletResponse接口

HttpServletResponse表示在HTTP环境中的ServletResponse。

public interface HttpServletResponseextends ServletResponse

 

转载于:https://www.cnblogs.com/0820LL/p/9803258.html

你可能感兴趣的文章
2015 8月24号 工作计划与实行
查看>>
MVC AJAX
查看>>
Google Map API V3开发(6) 代码
查看>>
Kafka初入门简单配置与使用
查看>>
第三章Git使用入门
查看>>
Amd,Cmd, Commonjs, ES6 import/export的异同点
查看>>
cocos2dx-Lua与Java通讯机制
查看>>
上下文管理器之__enter__和__exit__
查看>>
android3.2以上切屏禁止onCreate()
查看>>
winform文件迁移工具
查看>>
delphi DCC32命令行方式编译delphi工程源码
查看>>
paip.输入法编程----删除双字词简拼
查看>>
or1200下raw-os学习(任务篇)
查看>>
ZOJ - 3939 The Lucky Week(日期循环节+思维)
查看>>
小花梨的取石子游戏(思维)
查看>>
Ubuntu 18.04安装arm-linux-gcc交叉编译器
查看>>
.net core i上 K8S(一)集群搭建
查看>>
django drf 深入ModelSerializer
查看>>
Android---Menu菜单
查看>>
【资源导航】我所用到过的工具及下载地址
查看>>