Servlet详解-创新互联

为什么要学习Servlet

早期请求的jsp实际上就是一个java类,这个类到底是什么呢?

10年积累的网站建设、成都网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计制作后付款的网站建设流程,更有宁蒗免费网站建设让你可以放心的选择与我们合作。
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




<%
    out.println("helloworld");
%>

以上jsp生成的部分代码如下

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {}

发现HttpJspBese这个类的继承结构如下:

public abstract class org.apache.jasper.runtime.HttpJspBase extends javax.servlet.http.HttpServlet implements javax.servlet.jsp.HttpJspPage {}

总结:javax.servlet.http.HttpServlet就是Servlet的核心类,请求一个jsp页面实际上就是请求一个Servlet

什么是Servlet

Servlet 是一个 Java程序,是在服务器上运行以处理客户端请求并做出响应的程序,Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式

Servlet可完成如下功能

创建并返回基于客户请求的动态HTML页面。

创建可嵌入到现有 HTML 页面中的部分 HTML 页面(HTML 片段)

与其它服务器资源(如数据库或基于Java的应用程序)进行通信

ServletAPI详解

Servlet详解

Servlet接口

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();
}

ServletConfig接口

Servlet详解

该接口的源代码如下

package javax.servlet;
import java.util.Enumeration;
public interface ServletConfig {
    public String getServletName();
    public ServletContext getServletContext();
    public String getInitParameter(String name);
    public Enumeration getInitParameterNames();
}

注意:一个Servlet对象与一个ServletConfig对象一一对应

GenericServlet

Servlet详解

源代码如下:

package javax.servlet;
import java.io.IOException;
import java.util.Enumeration;
public abstract class GenericServlet 
    implements Servlet, ServletConfig, java.io.Serializable{
    private transient ServletConfig config;
    public GenericServlet() { }
    public void destroy() {}
    public String getInitParameter(String name) {
        return getServletConfig().getInitParameter(name);
    }
    public Enumeration getInitParameterNames() {
        return getServletConfig().getInitParameterNames();
    }   
    public ServletConfig getServletConfig() {
        return config;
    }
    public ServletContext getServletContext() {
        return getServletConfig().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() {
        return config.getServletName();
    }
}

注意:该类是一个抽象类,对Servlet和ServletConfig接口中的大部分方法做了默认的实现,并且增加了log等方法

HttpServlet

Servlet详解

部分源代码如下:

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

        HttpServletRequest  request;
        HttpServletResponse response;

        try {
            request = (HttpServletRequest) req;
            response = (HttpServletResponse) res;
        } catch (ClassCastException e) {
            throw new ServletException("non-HTTP request or response");
        }
        service(request, response);
}
protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

        String method = req.getMethod();

        if (method.equals(METHOD_GET)) {
          …
        }else if(method.equals(METHOD_POST)) {
        …
        }
}

如何编写一个Servlet程序

编写一个类继承HttpServlet

package cn.org.kingdom.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //如果在Servlet中用到response对象向客户端响应时,此时要在得到流之前设置contentType
        response.setContentType("text/html;charset=utf-8");
        PrintWriter ps = response.getWriter();
        ps.write("");
        ps.write("helloServlet");
        ps.write("你好 Servlet");
        ps.write("");
        ps.close();
    }
}

在web.xml中配置该servlet



  web04
  
    index.jsp
  
  
    MyServlet
    cn.org.kingdom.servlet.MyServlet
  
  
    MyServlet
    /MyServlet
  

访问该Servlet

Servlet详解

探究Servlet的生命周期

在前面讲解Servlet接口的api中就提到生命周期的概念

This interface defines methods to initialize a servlet, to service requests, and to remove a servlet from the server. These are known as life-cycle methods and are called in the following sequence: 
    The servlet is constructed, then initialized with the init method. 
    Any calls from clients to the service method are handled. 
    The servlet is taken out of service, then destroyed with the destroy method, then garbage collected and finalized. 
In addition to the life-cycle methods, this interface provides the getServletConfig method, which the servlet can use to get any startup information, and the getServletInfo method, which allows the servlet to return basic information about itself, such as author, version, and copyright.

图解:

Servlet详解

可以设置当服务器启动时,调用构造和init方法,在web.xml中设置以下代码


        LifeServlet
        cn.org.kingdom.servlet.LifeServlet
        1


        LifeServlet
        /LifeServlet

当访问多次的时候,发现Servlet的构造方法不会执行多次,所以Servlet是一个单例设计,要求不要再servlet中定义成员变量(这个成员变量会被多个线程共享),有可能会产生线程安全问题

Servlet中配置初始化参数

在web.xml中的servlet节点配置初始化参数


        LifeServlet
        cn.org.kingdom.servlet.LifeServlet
        
            name
            hello LifeServlet
        
        1

使用ServletConfig来进行获取初始化参数的值

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println(this.getServletConfig().getInitParameter("name"));
}

获得上下文参数

在web.xml中配置,该节点与Servlet节点处于同一级


    name
    context-value

使用ServletContext对象获取上下文参数的值

String name = this.getServletContext().getInitParameter("name");

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享文章:Servlet详解-创新互联
网站URL:http://scyanting.com/article/edcgg.html