Java Servlet 概述

目录

1、Servlet 和 Servlet API 概述

2、Servlet 接口

3、ServletRequest 接口 

4、ServletResponse 接口

5、ServletConfig 接口

6、ServletContext 接口

7、Filter 接口

8、RequestDispatcher 接口

9、EventListener 监听器接口(JDK中的接口,非Servlet定义)


1、Servlet 和 Servlet API 概述

        Servlet 是 Java Web 应用程序的核心组件,主要用于处理 HTTP 请求和响应。Servlet API 中有 4 个 Java 包,包括:

  • javax.servlet。包含定义 Servlet 与 Servlet 容器之间契约的类和接口。
  • javax.servlet.http。包含定义 HTTP Servlet 与 Servlet 容器之间契约的类和接口。
  • javax.servlet.annotation。包含对 Servlet、Filter 和 Listener 进行标注的注解。它还为标注元件指定元数据。
  • javax.servlet.descriptor。包含为 Web 应用程序的配置信息提供编程式访问的类型。

        javax.servlet 包中的主要类型:

        Servlet 技术的核心是 Servlet 接口,这是所有 Servlet 类都必须直接或者间接实现的一个接口。当编写实现 Servlet 接口的 Servlet 类时,直接实现它,当扩展一个实现这个接口的类时,则间接实现它。

        Servlet 接口定义了 Servlet 与 Servlet 容器之间的一个契约。这个契约归结起来是说,Servlet 容器会把 Servlet类加载到内存中,并在 Servlet 实例中调用特定的方法

        Servlet 容器还为每个应用程序创建一个 ServletContext 实例。这个对象封装了应用程序的环境细节。每个 Servlet 实例还有一个封装 Servlet 配置信息的 ServletConfig,从 ServletConfig 中可以获取 ServletContext 信息。//ServletConfig.getServletContext()

2、Servlet 接口

        Servlet 接口定义了以下 5 个方法

public interface Servlet {

    //1-Servlet初始化方法
    public void init(ServletConfig config) throws ServletException;
    
    //2-获取Servlet配置
    public ServletConfig getServletConfig();
    
    //3-处理请求和响应
    public void service(ServletRequest req, ServletResponse res)
	throws ServletException, IOException;
	
    //4-获取Servlet信息
    public String getServletInfo();
    
    //5-Servlet销毁方法
    public void destroy();
}

        init 方法:由 servlet 容器调用,初始化 Servlet 实例。Servlet 容器在实例化 Servlet 之后只调用一次 init方法。init 方法必须成功完成,Servlet才能接收任何请求

        getServletConfig 方法:返回一个 ServletConfig 对象,配置中包含此 Servlet 的初始化和启动参数。返回的 ServletConfig 对象就是初始化 Servlet 时传递给 init 方法的对象

        service 方法:由 Servlet 容器调用,以允许 Servlet 响应请求

        此方法仅在 Servlet 的 init() 方法成功完成后才能调用。

        响应的状态码始终通过抛出或发送错误的 Servlet 进行设置。//Response响应状态码

        Servlet 通常运行在多线程 Servlet 容器中,可以并发处理多个请求。所以,开发人员必须注意,应该对任何共享资源都需要进行同步访问,如文件、网络连接以及 Servlet 的类和实例变量。

        getServletInfo 方法:返回 Servlet 的有关信息,如作者、版本和版权。此方法返回的字符串应该是纯文本,而不是任何类型的标记文本,比如 HTML、XML 等。

3、ServletRequest 接口 

        对于每一个 HTTP 请求,Servlet 容器都会创建一个 ServletRequest 实例,并将它传给 Servlet 的 service 方法,ServletRequest 封装有关请求的信息

        ServletRequest 对象提供的数据包括:请求参数的名称和值、Servlet的属性和请求输入流等。扩展的 ServletRequest 的接口还可以提供一些特定协议的额外的数据(例如,HTTP 数据由HttpServletRequest 提供)。//比如提供 session 和 cookie 等信息

        下面是 ServletRequest 接口中的方法展示:

//ServletRequest 封装请求体的所有内容
public interface ServletRequest {

    //1-请求属性:返回指定属性的值,如果没有返回null,设置和移除
    public Object getAttribute(String name);
    public Enumeration<String> getAttributeNames();
    public void setAttribute(String name, Object o);
    public void removeAttribute(String name);
    
    //2-字符编码:获取和设置字符编码,如果没有指定,返回null
    public String getCharacterEncoding();
    public void setCharacterEncoding(String env) throws UnsupportedEncodingException;

    //3-请求体内容长度:返回请求体内容的长度,以字节为单位,如果长度不知或者长度大于Integer.MAX_VALUE,返回-1
    public int getContentLength();
    public long getContentLengthLong();
    
    //4-请求MIME类型:返回请求体的MIME类型
    public String getContentType();
    
    //5-请求内容:获取ServletRequest二进制输入流
    public ServletInputStream getInputStream() throws IOException; 
     
    //6-请求入参:获取请求入参
    public String getParameter(String name);
    public Enumeration<String> getParameterNames();
    public String[] getParameterValues(String name);
    public Map<String, String[]> getParameterMap();
    
    //7-请求协议:获取请求协议,如 HTTP/1.1
    public String getProtocol();
    public String getScheme(); //请求方案,如http,https,ftp
    public boolean isSecure(); //是否使用加密传输
    public int getRemotePort();
    
    //8-请求服务器信息:返回请求得服务器的主机名
    public String getServerName();
    public int getServerPort(); //端口号
    public BufferedReader getReader() throws IOException; //返回请求体中的 BufferedReader
    public String getRemoteAddr();
    public String getRemoteHost();
    public String getLocalAddr();
    public int getLocalPort();
    
    //9-语言环境:根据accept-language报文头返回客户端接受内容的首选语言环境。
    public Locale getLocale();
    public Enumeration<Locale> getLocales();
    public String getLocalName();
    
    //10-RequestDispatcher对象:转发请求和包装响应
    public RequestDispatcher getRequestDispatcher(String path);
    public DispatcherType getDispatcherType(); //dispatcher类型
    
    //11-请求路径:
    public String getRealPath(String path);
    
    //12-Servlet上下文信息:
    public ServletContext getServletContext();

    //13-请求异步模式信息:
    public AsyncContext startAsync() throws IllegalStateException;
    public AsyncContext startAsync(ServletRequest servletRequest,
                                   ServletResponse servletResponse) throws IllegalStateException;
    public boolean isAsyncStarted();
    public boolean isAsyncSupported();
    public AsyncContext getAsyncContext();

}

4、ServletResponse 接口

        ServletResponse 接口表示一个Servlet 响应。在调用一个 Servlet 的 service 方法之前,Servlet 容器会先创建一个 ServletResponse,并将它作为第二个参数传给 service 方法。ServletResponse 隐藏了将响应发给浏览器的复杂性。

        ServletResponse 中定义的其中一个方法是 getWriter 方法,它返回的 java.io.PrintWriter 可以将文本内容传给客户端。在默认情况下,PrintWriter 对象采用 ISO-8859-1 编码。在将响应发送给客户端时,通常将它作为 HTML 发送。//使用打印流将内容输出到浏览器

        还有一个方法可以用来将输出传给浏览器:getOutputStream。但是,这个方法是用来传输二进制数据的,因此,在大多数时候,需要使用 getWriter,而不是 getOutputStream。

        在发送任何 HTML标签之前,应该先通过调用 setContentType 方法来设置响应的内容类型,比如,将 text/html 作为参数传递,这是在告诉浏览器内容类型为 HTML。如果没有设置内容类型,那么大多数浏览器将会默认以 HTML 的形式显示响应的内容。

        下面是 ServletResponse 接口中的方法://每个基础性接口都值得我们仔细去了解

//ServletResponse接口
public interface ServletResponse {
    
    //1-字符集:返回和设置reponse中的字符集
    public String getCharacterEncoding();
    public void setCharacterEncoding(String charset);
    
    //2-响应体MIME类型:
    public String getContentType();
    public void setContentType(String type);
    
    //3-响应体内容:二进制流、字符流、长度
    public ServletOutputStream getOutputStream() throws IOException;
    public PrintWriter getWriter() throws IOException;
    public void setContentLength(int len); //响应体内容长度
    public void setContentLengthLong(long len);

    //4-响应缓冲区:设置和获取缓冲区大小
    public void setBufferSize(int size);
    public int getBufferSize();
    public void flushBuffer() throws IOException; //强制刷新缓冲区
    public void resetBuffer();    //清除缓冲区
    public boolean isCommitted(); //判断缓冲区内容是否提交
    public void reset();          //清除缓冲区所有内容
    
    //5-语言环境:设置和获取首选的语言环境
    public void setLocale(Locale loc);
    public Locale getLocale();

}

5、ServletConfig 接口

        ServletConfig 是一个 servlet 的配置对象,由 servlet 容器使用,用于在初始化期间向 servlet 传递信息//用来定义一些初始化参数

        ServletConfig 接口中定义了四个方法://Servlet+初始化参数信息

//Servlet配置接口
public interface ServletConfig {

    //1-Servlet名称:返回此servlet实例的名称。
    //该名称可以通过服务器管理提供,在web应用程序部署描述符中分配,或者对于未注册(因此未命名)的servlet实例,它将是servlet的类名。
    String getServletName();

    //2-Servlet上下文:返回ServletContext。
    ServletContext getServletContext();

    //3-初始化参数:获取指定初始化参数名称的值
    String getInitParameter(String var1);
    //获取所有的初始化参数的名称,如果servlet没有初始化参数,则返回空枚举。
    Enumeration<String> getInitParameterNames();
}

6、ServletContext 接口

        ServletContext 定义了 Servlet 实例用于与其 Servlet 容器通信的一组方法,例如,获取文件的 MIME 类型、调度请求或记录日志。

        每个 Java 虚拟机的“web应用程序”都有一个上下文(全局配置),但是,在分布式的 web 应用程序情况下,ServletContext 不能用来进行全局信息共享(因为信息不是真正的全局信息)。

        ServletContext 对象包含在 ServletConfig 对象中,Servlet 容器在初始化 Servlet 时创建 ServletConfig 对象//所有的Servlet基础对象都是由Servlet容器进行创建的

        ServletContext 接口定义的方法有很多,主要有以下内容:

//ServletContext有很多有用的工具方法
public interface ServletContext {
    //私有临时目录
    public static final String TEMPDIR = "javax.servlet.context.tempdir";
    //WEB-INF/lib中JAR文件排序的名称列表
    public static final String ORDERED_LIBS = "javax.servlet.context.orderedLibs";

    //1-应用程序上下文:应用程序的上下文路径
    public String getContextPath();

    //2-Servlet上下文和版本信息:
    public ServletContext getContext(String uripath);
    public String getServletContextName();

    //3-MIME类型:获取指定文件的MIME类型
    public String getMimeType(String file);
    
    //4-资源信息(各种路径信息):    
    public Set<String> getResourcePaths(String path);
    public URL getResource(String path) throws MalformedURLException;
    public InputStream getResourceAsStream(String path);
    public String getRealPath(String path);
    
    //5-RequestDispatcher对象:请求转发和响应包装
    public RequestDispatcher getRequestDispatcher(String path);
    public RequestDispatcher getNamedDispatcher(String name);
    
    //6-Servlet信息:增删改查
    public Servlet getServlet(String name) throws ServletException;
    public Enumeration<Servlet> getServlets();
    public Enumeration<String> getServletNames();
    public String getServerInfo();
    public ServletRegistration.Dynamic addServlet(String servletName, String className);
    public ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet);
    public ServletRegistration.Dynamic addServlet(String servletName, Class <? extends Servlet> servletClass);
    public <T extends Servlet> T createServlet(Class<T> clazz) throws ServletException;
    public ServletRegistration getServletRegistration(String servletName);
    public Map<String, ? extends ServletRegistration> getServletRegistrations();

    //7-日志记录:
    public void log(String msg);
    public void log(Exception exception, String msg);
    public void log(String message, Throwable throwable);

    //8-初始化参数:
    public String getInitParameter(String name);
    public Enumeration<String> getInitParameterNames();
    public boolean setInitParameter(String name, String value);

    //9-Servlet容器属性:
    public Object getAttribute(String name);
    public Enumeration<String> getAttributeNames();
    public void setAttribute(String name, Object object);
    public void removeAttribute(String name);

    //10-Servlet版本信息:
    public int getMajorVersion();  //Servlet API 主要版本
    public int getMinorVersion();  //Servlet API 次要版本
    public int getEffectiveMajorVersion(); //Servlet规范的主要版本
    public int getEffectiveMinorVersion(); //Servlet规范的次要版本

    //11-过滤器:创建、添加和查找
    public FilterRegistration.Dynamic addFilter(String filterName, String className);
    public FilterRegistration.Dynamic addFilter(String filterName, Filter filter);
    public FilterRegistration.Dynamic addFilter(String filterName, Class <? extends Filter> filterClass);
    public <T extends Filter> T createFilter(Class<T> clazz) throws ServletException;
    public FilterRegistration getFilterRegistration(String filterName);
    public Map<String, ? extends FilterRegistration> getFilterRegistrations();

    //12-会话跟踪配置SessionCookieConfig:
    public SessionCookieConfig getSessionCookieConfig();
    public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes);
    public Set<SessionTrackingMode> getDefaultSessionTrackingModes();
    public Set<SessionTrackingMode> getEffectiveSessionTrackingModes();

    //13-监听器:创建和添加
    public void addListener(String className);
    public <T extends EventListener> void addListener(T t);
    public void addListener(Class <? extends EventListener> listenerClass);
    public <T extends EventListener> T createListener(Class<T> clazz) throws ServletException; 

    //14-JSP配置描述符:
    public JspConfigDescriptor getJspConfigDescriptor();

    //15-类加载器:获取web应用程序的类加载器
    public ClassLoader getClassLoader();

    //16-隐式声明的角色信息:
    public void declareRoles(String... roleNames);

    //17-逻辑主机:返回逻辑主机的名称
    public String getVirtualServerName();
}

7、Filter 接口

        过滤器是一个对象,它用于对资源的请求或对来自资源的响应执行过滤任务。

        过滤器在 doFilter 方法中执行过滤。每个 Filter 都可以访问 FilterConfig 对象,从中获取初始化参数,以及对 ServletContext 的引用,例如,它可以使用 ServletContext 来加载过滤任务所需的资源。

//通用过滤器接口
public interface Filter {
    //1-初始化方法
    public void init(FilterConfig filterConfig) throws ServletException;
    //2-过滤方法
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException;
    //3-销毁方法
    public void destroy();
}

        初始化方法 init:

        init() 方法由 Servlet 容器调用,对过滤器实例进行初始化,将过滤器添加到 Web 程序中。

        Servlet 容器在实例化过滤器之后只会调用一次 init 方法。在要求过滤器执行任何过滤工作之前,init 方法必须成功完成

        过滤方法 doFilter:

        客户端每次请求资源时,容器都会在请求链中(Request/Response)调用过滤器的这个方法,FilterChain 对象允许 Filter 把请求和响应消息传递给过滤器链中的下一个 Filter。

        销毁方法 destory:

        destory 方法由 Servlet 容器调用,对过滤器进行销毁。

        只有当过滤器 doFilter 方法中的所有线程都退出或超时时间过后才会被调用这个方法。在 Servlet 容器调用这个方法之后,它不会在这个过滤器的实例上再次调用 doFilter 方法。

        此方法为过滤器提供了一个机会来清理所有被占用的资源(例如内存、文件句柄、线程等),并确保任何持久状态都与过滤器在内存中的状态保持同步。

8、RequestDispatcher 接口

        该对象接收来自客户机的请求,并将其请求发送到服务器中的任何资源上(如 Servlet、HTML 文件或 JSP 文件)。Servlet 容器创建 RequestDispatcher 对象,该对象用作特定路径或特定服务器资源的包装器。//对请求进行转发,对返回内容进行包装

        该接口旨在包装 Servlet,但是 Servlet 容器可以创建 RequestDispatcher 对象来包装任何类型的资源

public interface RequestDispatcher {
    String FORWARD_REQUEST_URI = "javax.servlet.forward.request_uri";
    String FORWARD_CONTEXT_PATH = "javax.servlet.forward.context_path";
    String FORWARD_PATH_INFO = "javax.servlet.forward.path_info";
    String FORWARD_SERVLET_PATH = "javax.servlet.forward.servlet_path";
    String FORWARD_QUERY_STRING = "javax.servlet.forward.query_string";
    String INCLUDE_REQUEST_URI = "javax.servlet.include.request_uri";
    String INCLUDE_CONTEXT_PATH = "javax.servlet.include.context_path";
    String INCLUDE_PATH_INFO = "javax.servlet.include.path_info";
    String INCLUDE_SERVLET_PATH = "javax.servlet.include.servlet_path";
    String INCLUDE_QUERY_STRING = "javax.servlet.include.query_string";
    String ERROR_EXCEPTION = "javax.servlet.error.exception";
    String ERROR_EXCEPTION_TYPE = "javax.servlet.error.exception_type";
    String ERROR_MESSAGE = "javax.servlet.error.message";
    String ERROR_REQUEST_URI = "javax.servlet.error.request_uri";
    String ERROR_SERVLET_NAME = "javax.servlet.error.servlet_name";
    String ERROR_STATUS_CODE = "javax.servlet.error.status_code";

    //1-请求转发:将请求从servlet转发到服务器上的另一个资源(servlet、JSP文件或HTML文件)
    void forward(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    
    //2-内容包装:包装Response中返回资源的内容(servlet、JSP页面、HTML文件)
    void include(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
}

        请求转发 forward 方法:

        forward 方法将请求从 Servlet 转发到服务器上的另一个资源(Servlet、JSP 文件或 HTML 文件)。此方法允许一个 Servlet 对请求进行初步处理,并允许另一个资源生成响应。

        对于通过 getRequestDispatcher() 获得的 RequestDispatcher,ServletRequest 对象会调整其路径元素和参数用来匹配目标资源的路径。

        forward 方法在响应提交给客户端之前被调用。如果响应已经提交,该方法将抛出一个 IllegalStateException,响应缓冲区中未提交的数据会在转发之前自动清除

        调用该方法,会将请求的分派器类型设置为 DispatcherType.FORWARD

        include 包装方法:

        包装 Response 中返回资源的内容。

        调用 include 方法,不能改变 ServletResponse 对象的路径元素、参数和调用者等信息。也不能更改响应状态码或设置报头,include 方法对这些信息的任何更改都会被忽略。

        调用该方法,会将请求的分派器类型设置为 DispatcherType.INCLUDE

9、EventListener 监听器接口(JDK中的接口,非Servlet定义)

        EventListener 监听器接口是在 JDK 中定义的接口,该接口是所有事件侦听器接口都必须扩展的标记接口//该接口只是一个标记接口,接口中没有定义任何方法

public interface EventListener {
}

        // Servlet 主要包括 Servlet(请求/响应处理)、过滤器、监听器等内容,而基于 Http 协议的Servlet Http 部分又增加了 session、cookie 等会话管理内容。

        Servlet API 文档和地址,请点击《Servlet API文档

        Servlet API 官方文档下载地址,请点击《Servlet API 文档

        至此,全文结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swadian2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值