Servlet是运行在Web服务器端的Java应用程序,它使用Java语言编写,具有Java语言的优点
Servlet对象主要封装了对HTTP请求的处理,并且它运行需要Servlet容器的支持
Servlet结构体系
Servlet实质上就是按Servlet规范编写的Java类,但它可以处理Web应用中的相关请求
在上图中,其中Servlet接口和ServletConfig接口定义了Servlet的基本方法以及封装了Servlet的相关配置信息
GenericServlet是一个抽象类,它分别实现了上述3个接口,它的子类HttpServlet对HTTP请求处理进行实现,这个对象为HTTP请求中POST,GET等类型提供了具体的操作方法
通常情况下,我们编写的Servlet都继承于HttpServlet
Servlet代码结构
在Java中,通常所说的Servlet是指HttpServlet对象,在声明一个对象为Servlet时,需要继承HttpServlet类,继承之后,可以重写HttpServlet类中的方法,实现对HTTP请求进行处理
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class TestServlet extends HttpServlet {
public void init() throws ServletException{
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
}
public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
}
public void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
}
public void destroy(){
super.destroy();
}
}
该类包含6个方法,其中init()方法与destroy()方法为Servlet初始化与生命周期结束所调用的方法,其余4个方法为Servlet针对不同的HTTP请求类型所提供的方法
Servlet接口
在Servlet开发中,任何一个Servlet对象都要直接或间接实现javax.servlet.Servlet接口,在该接口中包含5个方法:
方法 | 说明 |
---|---|
public void init(ServletConfig config) | Servlet实例化后,Servlet容器调用该方法来完成初始化工作 |
public void service(ServletRequest request, ServletResponse response) | 用于处理客户端的请求 |
public void destroy() | 当Servlet对象从Servlet容器中移除时,容器调用该方法,以便释放资源 |
public ServletConfig getServletConfig() | 用于获取Servlet对象的配置信息,返回ServletConfig对象 |
public String getServletInfo() | 返回有关Servlet的信息,它是纯文本格式的字符串,如作者,版本等 |
eg:创建一个Servlet,向客户端输出一个字符串
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
public class WordServlet implements Servlet {
public void destroy(){
}
public ServletConfig getServletConfig(){
return null;
}
public String getServletInfo(){
return null;
}
public void init(ServletConfig arg0) throws ServletException {
}
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter();
writer.println("hello!");
writer.close();
}
}
在Servlet中,主要方法时service(),当客户端请求送达时,Servlet容器调用service()方法对请求进行处理
ServletConfig接口
ServletConfig接口位于javax.servlet包,封装了Servlet的配置信息,在Servlet初始化期间被传递
每个Servlet有且只有一个ServletConfig对象,该对象定义了4个方法:
方法 | 说明 |
---|---|
public String getInitParameter(String name) | 返回String类型名称为name的初始化参数值 |
public Enumeration getInitParameterNames() | 获取所有初始化参数名的枚举集合 |
public ServletContext getServletContext() | 用于获取Servlet上下文对象 |
public String getServletName() | 返回Servlet对象的实例名 |
HttpServletRequest接口
HttpServletRequest接口位于javax.servlet.http包中,继承了javax.servlet.ServletRequest接口,常用方法如下:
方法 | 说明 |
---|---|
public String getContextPath() | 返回请求的上下文路径,此路径以"/"开头 |
public Cookie[] getCookies() | 返回请求中发送的所有cookie对象,返回值为cookie数组 |
public String getMethod() | 返回请求所使用的HTTP类型,如get,post等 |
public String getQueryString() | 返回请求中参数的字符串形式,如请求MyServlet?username=mr,则返回username=mr |
public String getRequestURI() | 返回主机名到请求参数之间的字符串形式 |
public StringBuffer getRequestURL() | 返回请求的URL,此URL中不包含请求的参数,注意此方法返回的数据类型为StringBuffer |
public String getServletPath() | 返回请求URI中的Servlet路径的字符串,不包含请求中的参数信息 |
public HttpSession getSession() | 返回与请求关联的HttpSession对象 |
HttpServletResponse接口
HttpServletResponse接口位于javax.servlet.http包,继承了javax.servlet.servletResponse接口,常用方法如下:
方法 | 说明 |
---|---|
public void addCookie(Cookie cookie) | 向客户端写入cookie信息 |
public void sendError(int sc) | 发送一个错误状态码为sc的错误响应到客户端 |
public void sendError(int sc, string msg) | 发送一个包含错误状态码及错误信息的响应到客户端,参数sc为错误状态码,参数msg为错误信息 |
public void sendRedirect(String location) | 使用客户端重定向到新的URL,参数location为新的地址 |
GenericServlet类
在编写Servlet对象时,需要实现javax.servlet.Servlet接口,在Servlet接口中包含5个方法,这样操作不方便,javax.servlet.GenericServlet类简化了此操作,实现了Servlet接口
public abstract class GenericServlet
extends Object
implements Servlet, ServletConfig, Serializable
GenericServlet类是一个抽象类,分别实现了Servlet接口与ServletConfig接口。
该类实现了除service()之外的其他方法,所以创建Servlet对象时,可以继承GenericServlet类来简化程序代码,只需要实现service()方法
HttpServlet类
javax.servlet.HttpServlet类对GenericServlet类进行了扩展,为HTTP请求提供了灵活的方法
public abstract class HttpServlet
extends GenericServlet implements Serializable
HttpServlet类仍是一个抽象类,实现了service()方法,并针对HTTP1.1中定义的7种请求类型提供了相应方法:doGet(),doPost()、doPut()、doDelete()、doHead()、doTrace()和doOptions()方法,在此7个方法种,除了对doTrace()和doOptions()进行简单实现外,其他方法没有进行实现,需要对其进行重写
Servlet创建
Servlet配置
要使Servlet对象正常运行,需要进行适当配置,以告知Web容器哪一个请求调用哪一个Servlet对象处理,对Servlet起到一个注册的作用。
Servlet的配置包含在web.xml文件中,主要通过以下两种方法进行设置
1.声明Servlet对象
在web,xml文件中,通过
<servlet>
<servlet-name>FirstServletNewservlet-name>
<servlet-class>com.wang.yx.servlet.FirstServletNewservlet-class>
servlet>
2.映射Servlet
在web.xml文件中声明了Servlet对象之后,需要映射访问Servlet的URL。
该操作使用
其配置如下:
<servlet-mapping>
<servlet-name>FirstServletNewservlet-name>
<url-pattern>/FirstServletNewurl-pattern>
servlet-mapping>