关于servlet的常用api

Servlet接口

   Servlet的运行是需要Servlet容器的支持的,在Servlet的开发中,任何一个Servlet对象都要直接或者间接的实现javax.servlet.Servlet接口,该接口是Servlet的核心接口,此接口包含5个方法:

   1: public void init(ServletConfig config);(实例化一个Servlet后,Servlet容器调用此方法来完成初始化工作)

   2: public void destroy();(当servlet对象应该从servlet容器中移除时,容器调用此方法来释放资源)

   3: public void service(ServletRequest request, ServletResponse response);(此方法用来处理客户端的请求)

   4: public ServletConfig getServletConfig();(此方法用来获取Servlet对象的配置信息,返回ServletConfig对象)

   5: public String getServletInfo();(此方法返回Servlet的有关信息,它是一个纯文本格式的字符串,如版本信息)

GenericServlet抽象类

     为了简化编写Servlet对象时实现上面5个方法的繁琐操作,GenericServlet抽象类实现了Servlet接口,此抽象类对除service()外的其他方法进行了实现;

HttpServlet抽象类

   HttpServlet类是GenericServlet类的子类,由于在实际开发中,Servlet大多数是用来处理HTTP协议的请求,并且对请求做出回应,所以通过继承GenericServlet类还是稍显繁琐,因此HttpServlet对GenericServlet进行了扩展,为HTTP请求处理提供了灵活的方法:

   public abstract class HttpServlet extends javax.servlet.GenericServlet{}

   HttpServlet类依然是一个抽象类,它对service()进行了实现,并且针对HTTP1.1中定义的7种请求类型提供了相应的方法,分别为doGet(),doPost(),doPut(),doDelete(),doHead(),doTrace(),doOptions(),在这7个方法中,除了对doTrace()和doOptions()进行了简单的实现外,HttpServlet类没有对其他方法进行实现,需要开发人员根据实际需求进行重写;

HttpServletRequest接口

   HttpServletRequest接口位于javax.servlet.http包中,此接口继承了javax.servlet.ServletRequest接口,是servlet中的重要接口,此接口包含以下方法:

   1: public String getContextPath();(返回请求的上下文路径,此路径以/开头)

   2: public Cookie[] getCookies();(返回请求发送的所有的Cookie对象,返回值为Cookie数组)

   3: public String getMethod();(返回请求所使用的HTTP类型,如GET,POST等)

   4: public String getQueryString();(返回请求中参数的字符串形式,如请求DemoServlet?accout=001,则返回account=001);

   5: public String getRequestURI();(返回主机名到请求参数之间部分的字符串形式如请求地址是http://localhost:8080/servletApi/Myservlet,则返回/servletApi/Myservlet);

   6: public StringBuffer getRequsetURL();(返回请求的URL,此URL中不包含请求的参数,此方法返回的数据类型为StringBuffer,如                 http://localhost:8080/servletApi/Myservlet);

   7: public String getServletPath();(返回请求URI中的Servlet路径的字符串,不包含请求中的参数信息);

   8: public HttpSession getSession(),(返回与请求关联的HttpSession对象)

   下面是获取请求URI中的Servlet路径的字符串实例:

response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>Servlet</title></head>");
out.println("<body>"+request.getServletPath()+"</body>");
out.println("</html>");
out.flush();
out.close();

HttpServletResponse接口

    HttpServletResponse接口位于javax.servlet.http包中,它是继承自javax.servlet.ServletResponse接口,此接口是servlet重要接口,其常用方法包含以下4个:

   1: public void addCookie(Cookie cookie);(向客户端写入cookie信息);

   2: public voud sendError(int sc);(发送一个错误状态码到客户端,如404、500)

   3: public void sendError(int sc,String msg);(发送一个错误状态码及错误信息到客户端)

   4: public void sendRedirect(String location);(使用客户端重定向到新的URL);

   下面是像客户端响应一个错误状态码以及错误信息:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try{
            throw new Exception("数据库连接失败");
        }catch (Exception e){
            response.sendError(500,e.getMessage());
        }
    }
ServletConfig接口

    ServlertConfig接口位于javax.servlet包中,该接口用于封装Servlet的初始化信息,在Servlet初始化期间传递,一个Servlet只有一个ServletConfig对象,该接口定义了4个方法:

     1: public String getInitParameter(String name);(此方法返回String类型名称为name的初始化参数值);

     2: public Enumeration getInitParameterNames();(获取所有初始化参数名的枚举集合);

     3: public ServletContext getServletContext();(用于获取Servlet上下文);

     4: public String getSerletName();(返回Servlet对象的实例名);

Servlet的生命周期

    Servlet的生命周期是由Servlet容器控制的,Servlet的生命周期分为三个阶段:初始化阶段,运行阶段,销毁阶段;

    1:初始化阶段

     Servlet初始化阶段包含4个步骤:

     1>当web客户端请求Servlet服务或当Web服务启动时,容器环境加载一个Servlet类;

     2>Servlet容器创建一个ServletConfig对象,用来配置Servlet的初始化信息;

     3>Servlet容器创建一个Servlet对象;

     4>Servlet容器调用Servlet的init()进行初始化,并且需要给init()方法传一个ServletConfig对象,ServletConfig包含了初始化参数和容器环境信息,并负责向Servlet传递数据,如果传递失败,则抛出

ServletException异常,Servlet停止工作;

     通过上面的4个步骤,完成了创建Servlet对象和ServletConfig对象,并通过init()方法使Servlet对象与ServletConfig对象关联;

    2:运行时阶段:

    在运行阶段,Servlet可以随时响应客户端请求,多个客户端同时请求,则会同时创建多个线程进行处理,所以Servlet是一个天生的多线程机制,当容器环境接收到要求访问特定的Servlet的客户请求,容器

会建立针对这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet对象的service()方法,service()接收ServletRequest对象和ServletResponse对象来处理请求和响应

    当Servlet容器已经把Servlet生成的响应结果发送给客户端,容器就会销毁这个请求建立的ServletRequest对象和ServletResponse对象

    3:销毁阶段

    当web应用被终止时,Servlet容器会调用Web应用中所有Servlet对象的destroy()方法,然后再销毁这些Servlet对象,通过destroy()可以释放Servlet所占用的资源(如内存、文件处理、线程)

Servlet过滤器

     Servlet过滤器是客户端与服务端资源间的中间层组件,用于拦截客户端的请求与响应消息,当web容器接收一个客户端请求时,web容器判断这个请求是否经过过滤器,如果经过,容器将这个请求

交给过滤器进行处理,在处理过程中,过滤器可以对请求进行操作,如更改请求中的数据,在过滤器处理完成后,再将这一请求交给其他业务进行处理,当所有的处理完成后,需要对客户端进行响应,容器

又将响应交给过滤器进行处理,过滤器处理响应完成将响应发送到客户端;

     在web程序中可以放置多个过滤器,如字符编码过滤器,身份验证过滤器,多个过滤器按照在web.xml中的配置先后顺序,形成过滤器链,当第一个过滤器处理完了,将request和response传递给下一个过滤器

进行处理,直到所有的过滤器处理完成,然后交给其他业务处理数据,当处理完成,又以相反的顺序将响应数据一层一层往回传递,直到第一个过滤器处理完成,响应给客户端

     过滤器与Servlet非常相似,它通过3个核心接口进行操作,分别为Filter接口、FilterChain接口与FilterConfig接口;

     1:Filter接口

           Filter接口位于javax.Servlet包中,与Servlet接口相似,定义一个过滤器对象需要实现此接口,在Filter接口中包含3个方法:

           1: public void init(FilterConfig config);(过滤器的初始化方法,容器调用此方法完成过滤器的初始化,对于每一个Filter实例,此方法只被调用一次);

           2: public void doFilter(ServletRequest request, ServletResponse, FilterChian chian);(此方法与Servlet的service()相似,当请求及响应交给过滤器时,过滤器调用此方法进行过滤处理);

           3: public void destroy();(当过滤器生命周期结束时调用此方法,此方法可用于释放过滤器所占用的资源);

      2:FilterChain接口

           FilterChain接口位于javax.servlet包中,此接口由容器实现,在FilterChain接口中只有一个方法:

           1: public void doFilter(ServletRequest request, ServletResponse response);(此方法用于将过滤器处理的请求或响应传递给下一个过滤器对象,在多个过滤器的Web应用中,可以通过此方法进行传递);

     3:FilterConfig接口

           FilterConfig接口位于javax.servlet包中,此接口由容器实现,用于获取过滤器初始化期间的参数信息,包含如下4个方法:

           1: public String getFilterName();(返回过滤器的名称);

           2: public String getInitParameter(String name);(返回初始化名称为name的参数值);

           3: public Enumeration getInitParameterNames();(返回所有初始化参数名的枚举集合);

           4: public ServletContext getServletContext();(返回Servlet的上下文对象);

    有了上面三个接口,就可以通过Filter接口来创建一个过滤器对象(实现过滤字符集编码):

    

public class MyFilter implements Filter {
    private String encoding = null;
    private FilterConfig config = null;

    public void destroy() {
        //释放资源
        this.config = null;
        this.encoding = null;
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        if (encoding != null || !"".equalsIgnoreCase(encoding)) {
            //设置request字符编码
            req.setCharacterEncoding(encoding);
            //设置response字符编码
            resp.setContentType("text/html; charset=" + encoding);

        }
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {
        this.config = config;
        this.encoding = config.getInitParameter("encoding");
    }

}
在web.xml中配置过滤器对象

 <!--声明一个过滤器对象-->
    <filter>
        <!--过滤器名称-->
        <filter-name>MyFilter</filter-name>
        <!--过滤器完整路径-->
        <filter-class>com.idea.servlet.MyFilter</filter-class>
        <!--初始化参数-->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>GBK</param-value>
        </init-param>
    </filter>
    <!--映射过滤器对象-->
    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <!--用于指定过滤器关联的URL样式,设置为/*为关联所有URL-->
        <url-pattern>/*</url-pattern>
        <!--用于指定过滤器对应的请求方式-->
        <!--REQUEST当客户端直接请求时,则通过过滤器进行处理-->
        <!--INCLUDE当客户端通过RequestDispatcher对象的include()方法请求时,通过过滤器进行处理-->
        <!--FORWARD当客户端通过RequestDispatcher对象的forward()方法请求时,通过过滤器进行处理-->
        <!--ERROR当声明异常产生时,通过过滤器处理-->
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>











    



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值