🌸Author Echo Pan
Servlet(Server Applet),全称Java Servlet
。
Sevlet本质上是一段Java程序或代码,其运行在服务器端,用于响应客户端的请求。
Servlet是继承自HttpServlet类
的Java类,通常由三个部分构成:
导入的包
import java.io.*;
import javax.servlet.*;
...
处理请求的方法,包括doGet()
和doPost()
方法
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException {
//代码块
}
向客户端发送的数据
//上面代码块中的内容
response.setContext("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
out.println("<html><head>
<title>MyJSP</title>
</head>
<body>
Hello World!<br>
</body>
</html>");
JSP经过编译后生成的就是Servlet文件,JSP是Servlet的简化;
JSP侧重视图,而Servlet主要用于逻辑控制。
JSP是Java和HTML组合的.jsp
扩展文件,Sevlet则是纯Java代码;
JSP中有内置对象,而Sevlet中没有。
Servlet能更好地组织业务逻辑代码,但是HTML代码可读性差、维护困难;
JSP虽然规避了上述劣势,但是由于在HTML中混入大量Java代码,一样不可取。
注:后面学的MVC设计模式能够规避两者的短板。
Servlet API所在包:
大概过程:
当Web容器首次载入一个Servlet文件后,会建立该文件的Servlet
接口实例。然后根据Servlet
接口设定的初始化配置和其他信息(一般在web.xml
中)创建一个ServletConfig
实例。通过Servlet
接口的init()
方法传入该ServletConfig
实例完成对Servlet
实例的初始化。
Servlet
实例初始化完成后,当收到请求时,Web容器会创建Http请求和响应对象,再通过urlPattern
找到对应的Servlet
实例,调用其service()
方法,传入(Http)ServletRequest
、(Http)ServletResponse
实例。
Web应用被停止或重新启动之前,Web容器将调用Servlet
实例的destroy()
方法释放资源并卸载Servlet
。
Servlet容器也叫Servlet引擎,是Web服务器或应用服务器的一部分,为响应和请求提供网络服务。
所有的Servlet类都必须实现该接口。
Servlet 接口定义了5个方法,其中3个由Servlet容器调用,2个可以在JavaWeb的程序代码里访问。
由于Servlet接口编写的Servlet类要实现5个方法,比较麻烦,于是有了GenericServlet抽象类。
该类定义了一个通用的、不依赖具体协议的Servlet,实现了Servlet接口和ServletConfig接口。该类给出了除service()
方法以外其他4个方法的简单实现。通过GenericServlet编写Servlet类只需实现service()方法即可。
虽然GenericServlet
对Servlet
进行了加强,但并不常用。HttpServlet
才是今天的主角。
一般,客户端通过HTTP协议访问服务器资源。Sun公司提供了抽象类HttpServlet,它继承自GenericServlet类,用来创建适合Web站点的HTTP Servlet。
针对HTTP1.1定义的7种请求方法,HttpServlet提供了7个处理方法:
doGet(),doPost(),doHead(),doPut(),doDelete(),doTrace(),doOptions()
注:TRACE和OPTIONS做了适当实现;
其他5个方法只提供了返回HTTP错误的实现。
我们常用的一般是doGet()
方法和doPost()
方法。
doGet()
方法public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Servlet code
}
doPost()
方法public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Servlet code
}
当容器接收到针对HttpServlet
对象的请求时,调用过程如下:
Public service()
方法Public service()
方法中,将参数类型转换为HttpServletRequest
和HttpServletResponse
,然后将转换后的这两个对象作为参数传递给Protected service()
方法Protected service()
方法中,首先调用HttpServletRequest
对象的getMethod()
方法,获取HTTP请求类型,调用相应的doXxx()
方法因此,在编写HttpServlet的派生类时,一般不用覆写service()
方法,而只需要重写相应的doXxx()
方法即可。
HttpServletRequest
接口扩展于javax.servlet.ServletRequest
接口
HttpServletResponse
接口扩展于javax.servlet.servletResponse
接口
当容器接收到客户端的请求时,会创建一个ServletRequest
对象,用来封装请求的数据,同时创建一个ServletResponse
对象,用来封装响应的数据,这两个对象作为参数传入service()
方法,Servlet再通过service()
方法获取请求和发送响应。
HttpServletRequest
接口和HttpServletResponse
接口分别继承自ServletRequest
接口和ServletResponse
接口,并在原有基础上新增了一些方法,比如请求常用的getSession()
方法,响应常用的sendRedirect()
方法。
初始化Servlet
对象时,使用ServletConfig
对象获取初始化参数(从web.xml
中获取)。一个Servlet
只有一个ServletConfig
对象。
在ServletConfig接口中,定义了4个方法:
web.xml
配置中的<init-param>
参数或者@WebServlet
注解中的initParams
属性元素;Enumeration<String>
对象,没有参数时返回空值;web.xml
配置中的<servlet-name>
或@WebServlet
中的name属性,未配置时返回该实例的类名(可通过xxx.class.getName()获取)。注:上面提到的配置文件和注解相关的知识会在后面说
Web容器会为每个Web应用创建一个唯一的上下文对象,应用中的所有Servlet共享该对象,不同Servlet之间可以通过该对象实现资源传递和共享,因此ServletContext
对象也被称为Context
域对象。
我们可以通过4种方式获取ServletContext
对象:
//1.GenericServlet 的 getServletContext 方法
ServletContext servletContext = this.getServletContext();
//2.ServletConfig 的 getServletContext 方法
ServletContext servletContext = this.getServletConfig().getServletContext();
//下面的方法暂作了解即可
//3.HttpSession 的 getServletContext 方法
ServletContext servletContext = request.getSession().getServletContext();
//4.HttpServletRequest 的 getServletContext 方法
ServletContext servletContext = request.getServletContext();
通过ServletContext
对象,我们可以获取初始化参数、Web应用中的文件以及实现Servlet之间的数据传递。
通过RequestDispatcher
对象实现请求转发。
ServletRequest
接口的RequestDispatcher()
方法ServletContext
接口的getNamedDispatcher()
方法ServletContext
接口的getRequestDispatcher()
方法forward()
方法include()
方法//forward() 方法
public void forward(ServletRequest request, ServletResponse response)
throws ServletException, IOException;
//include() 方法
public void include(ServletRequest request, ServletResponse response)
throws ServletException, IOException;