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>