认识Servlet(一)接口

Servlet接口

一、Servlet的生命周期
所谓xxx的生命周期,就是说xxx的出生、服务,以及死亡。Servlet生命周期也是如此!与Servlet的生命周期相关的方法有:

  • void init(ServletConfig);
  • void service(ServletRequest,ServletResponse);
  • void destroy();

    1.1 Servlet的出生
    服务器会在servlet第一次访问的时候创建Servlet,或者在服务器启动的时候创建Servlet。如果服务器启动时就创建Servlet,那么还需要在web.xml文件中配置。也就是说默认情况下,Servlet是在第一次被访问时由服务器创建的。
    而且一个Servlet类型,服务器只创建一个实例对象,例如在我们首次访问http://localhost:8080/helloservlet/helloword时,服务器通过“/helloword”找到了绑定的Servlet名称为cn.itcast.servlet.HelloServlet,然后服务器查看这个类型的Servlet的是否已经创建过,如果没有创建过,那么服务器才会通过反射来创建HelloServlet的实例。当我们再次访问http://localhost:8080/helloservlet/helloword时,服务器就不会再次创建HelloServlet实例了,而是直接使用上次创建的实例。
    在Servlet被创建后,服务器会马上调用Servlet的void init(ServletConfig)方法。请记住,Servlet出生后马上就会调用init()方法,而且一个Servlet的一生。这个方法只会被调用一次。这好比小孩子出生后马上就要被剪去脐带一样,而且剪脐带一生只有一次。
    我们可以把一些对Servlet的初始化工作放在init方法中!

1.2 Servlet服务
当服务器每次接收到请求时,都会调用Servlet的service()方法来处理请求。服务器接收一次请求,就会调用一次service()方法,所以service()方法是会被调用多次的。正因为如此,所以我们才需要把处理请求的代买写到service()方法中!

1.3 Servlet的离去
Servlet是不会轻易离去的,通常都是在服务器关闭时Servlet才会离去!在服务器关闭时,服务器会去销毁Servlet,在销毁Servlet之前服务器会调用Servlet的destroy()方法,我们可以把Servlet的临终遗言放到destroy()方法中,例如对某些资源的释放代码放到destroy()方法中。

1.4测试生命周期方法

public class HelloServlet implements Servlet{
    public void init(ServletConfig config)throws ServletException{
    System.out.println("Servlet被创建了!");
    }
    public ServletConfig getServletConfig() {return null;}
    public void destroy(){
    System.out.println("Servlet要离去了!");
    }
    public String getServletInfo(){return null}
    public void service(ServletRequest req,ServlectResponse res)throws ServletException,IOException{
    System.out.println("hello servlet!");
    }
}

在首次访问HelloServlet时,init方法会被执行,而且也会执行service方法。再次访问时,只会执行service方法,不再执行init方法。在关闭Tomcat时会调用destroy方法。

二、Servlet接口相关类型
在Servlet接口中还存在三个我们不熟悉的类型:
- ServletRequset: service()方法的参数,它表示请求对象,它封装了所有请求相关的数据,它是由服务器创建的;
- ServletResponse:service()方法的参数,它表示响应对象,在service()方法中完成对客户端的响应需要使用这个对象;
- ServletConfig:init()方法的参数,它表示Servlet配置信息,那对应web.xml文件中的《servlet》元素。

2.1 ServletRequest和ServletReponse
ServletRequset和ServletResponse是Servlet#service()方法的俩个参数,一个是请求对象,一个是响应对象,可以从ServletRequest对象中获取请求数据,可以使用ServletReponse对象完成响应。
ServletRequest和ServletResponse的实例由服务器创建,然后传递给service()方法。如果在service()方法中希望使用HTTP相关功能,那么可以把ServletRequest和ServletResponse强转成HttpServletRequest和HttpServletResponse.这也说明我们经常需要在service()方法中对ServletRequest和ServletResponse进行转化。这是很烦心的事。不过后面有一个类会帮我们解决这一类的问题。
HttpServletRequest方法:

  • String getParameter(String paramName):获取指定请求参数的值;
  • String getMethod();获取请求方法,例如GET或POST;
  • String getHeader(String name);获取请求头的值;
  • void setCharacteEncoding(String encoding);设置请求体的编码!因为GET请求没有请求体,所以这个方法只对POST其作用。当调用request.setCharacterEncoding(“UTF-8”)之后,再通过getParameter()方法获取参数时,那么参数值都已经通过了转码,既转换成了UTF-8编码。所以,这个方法必须在调用getParameter()方法之前调用!

HttpServletResponse方法:

  • PrintWriter getWriter():获取字符响应流,使用该流可以向客户端输出响应信息。例如response。getWriter().print(“《h1》Hellojava web《/h1》”);
  • ServletOutputStream getOutputStream();获取字节响应流,当需要向客户端响应字节数据时,需要使用这个流,例如要向客户端响应图片时;
  • voidsetCharacterEncoding(String encoding):用来设置字符响应流的编码,例如在调用setCharacterEncoding(“UTF-8”);之后,再response.getWriter()输出的中文都会转换成utf-8编码后发给客户端;
  • void setHeader(String name,String value):向客户端添加响应头信息,例如setHeader(“Refresh”,”3;url=http://www.itcast.cn“),表示3秒后自动刷新到http://www.itcast.cn;
  • void setContentType(String contentTtype):该方法是setHeader(“content-Type”,”xxx”)的简便方法,即用来添加名为content-type响应的方法。content-type响应头用来设置响应数据的MIME类型,例如要向客户端响应jpg的图片,那么可以setContentType(“image/jepg”),如果响应数据为文本类型,那么还要同时设置编码,例如setContentType(“text/html;chartset=utf-8”)表示响应数据类型为文本类型中的html类型,并且该方法会调用setCharacterEncoding(“utf-8”)方法;
  • void sendError(int code,String errorMsg):向客户端发送状态码,以及错误消息。例如给客户端发送404:response(404,”您要找的资源不存在!”).

2.1 ServletConfig
ServletConfig对象对应web.xml文件中的《servlet》元素。例如你想要获取当前Servlet在web.xml文件中的配置名,那么可以使用servletConfig.getServletName()方法获取!

扫描二维码关注公众号,回复: 1757328 查看本文章
<servlet>
<servlet-name>ONE</servlet-name>
<servlet-class>
cn.itcast.servlet.OneServlet
</servlet-class>
</servlet>

servletConfig对象是由服务器创建的,然后传递给Servletd的init()方法,你可以在init()方法中使用它!

  • String getServletName():获取Servlet在文件中的配置名称,即《servlet-name》指定的名称;
  • ServletContext getServletContext():用来获取ServletContext对象;
  • String getinitParameter(String name):用来获取在web.xml中配置的初始化参数,通过参数名来获取参数值;
  • Enumeration getinintParameterNames():用来获取web.xml中配置的所有初始化参数名称;
    在《servlet》元素还可以配置初始化参数:
<servlet>
<servlet-name>One</servlet-name>
//配置两个初始化参数
    <init-param>
        <param-name>paramName1</param-name>
        <param-value>paramValue1</param-value>
    </init-param>
    <init-param>
        <param-name>paramName2</param-name>
        <param-value>paramValue2</param-value>
    <init-param>
</servlet>

在OneServlet中,可以使用ServletConfig对象的getInitParameter()方法来获取初始化参数,例如:

String value1=servletConfig.getInitParameter(“paramName1”);//获取paramValue1

猜你喜欢

转载自blog.csdn.net/qq_36213352/article/details/80778818