前言
Servlet的出现 |
早期的web服务器习惯于处理静态资源请求,随着网络的发展,用户所访问的资源已经不仅仅局限于服务器硬盘上存放的静态资源,更多的应用需要根据用户的请求动态生成页面信息。这时候就需要一个帮助程序来帮忙处理动态请求,web服务器会将动态请求转发给帮助程序,由帮助程序做一定的计算或者与数据库交互,帮助程序处理后,返回处理后的静态结果给web服务器。
这个帮助程序提供了相应的扩展功能,早期的web服务器扩展机制是CGI(Common Gateway Interface),公共网关接口,然而CGI程序存在编写困难,对用户请求的相应时间较长、性能较差等不足,1997年,SUN 公司推出了Servlet技术,作为Java 阵营的CGI解决方案。作为对微软ASP技术的回应,SUN公司于1998年推出了JSP技术,允许在html页面中嵌入Java脚本代码,从而实现动态网页功能。
什么是Servlet |
Servlet 是Java 语言中编写Web服务器扩展功能的重要技术,同时又时JSP技术的底层运行基础。
Servlet是为了解决实现动态页面而衍生的东西,它基于B/S 模式,用来处理请求和发送相应。它是一个规范,编写一个Servlet 实际上是按照Servlet规范编写一个java类,作为web组件,被Servlet容器所管理。
Servlet 和 Tomcat的关系 |
上面提到Servlet是一个web组件,需要部署到容器中才能运行,Tomcat就是一个容器,符合一定规范,提供组件运行环境。
Tomcat 是一个web应用服务器,也是一个servlet/jsp 容器。用于将客户端的请求传送给servle容器,servlet容器实例化一个servlet,将请求传送给实例化的servlet,并将servlet的相应传送回客户端。
【tomcat服务器接受客户端请求并做出响应】补充描述:
① 客户端(通常都是浏览器)访问web服务器,发送http请求
② web服务器接收到请求后,传递给Servlet容器。
③ Servlet容器加载Servlet,产生Servlet实例后,向其传递表示请求和响应的对象。
④ Servlet实例使用请求对象得到的客户端的请求信息,然后进行相应的处理。
⑤ servlet实例将处理结果通过相应对象发送回客户端,容器负责确保相应正确送出,同时将控制返回给web服务器。
Servlet的使用 |
生命周期
Servlet 的生命周期是指Servlet从产生到毁灭的过程,有三个生命周期函数,分别是 初始化Init() 、服务service()、销毁destory() 方法。
- Init() 方法
创建Servlet 实例时会调用改Servlet 的构造函数去创建一个具体的对象,如果有客户端请求,web服务器会调用Servlet对象的init方法。
在一个Servlet 生命周期中,init 方法只会被执行一次。
init方法有一个类型为ServletConfig 的参数,向Servlet 传递配置信息,主要负责简单的创建或者加载一些数据,这些数据将用于该Servlet 的整个生命周期中。 - service() 方法
当客户端请求到来时,service方法负责处理客户端的请求,由web服务器调用service方法去接收请求,构造一个类型为ServletRequest的请求对象 和 一个类型为ServletResponse的响应对象作为参数传递给方法,处理请求,并把处理结果返回。
做为开发人员,我们只需要关注好service 自动调用的doGet、doPost 等方法的实现就可以了。 - destory() 方法
当web应用关闭或者容器关闭或者电脑关闭时,调用destory 方法销毁servlet ,这时候容器将不会再把其他的请求发送给该对象。
在一个Servlet 生命周期中,该方法只会被执行一次。
工作原理(请求到web服务器到Servlet流程)
注: 客户端(浏览器)是通过URL 地址访问web服务器中的资源,URL地址(http://hostname: port/contextpath/servletpath) hostname和port 用来与服务器建立TCP连接,后面的URL 用来选择在服务器中哪个子容器服务用户的请求,这个是在web.xml 中部署完成的。
<!-- 请求地址:http:localhost:8080/test01/MyServlet -->
<servlet>
<!-- 3、找到servlet的名字,这个名字自定义,与下面的名字保持一致 -->
<servlet-name>MyServlet</servlet-name>
<!-- 4、servlet的全限定类名,找到了servlet的位置 -->
<servlet-class>test01.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 2、找到servlet的名字 -->
<servlet-name>MyServlet</servlet-name>
<!-- 1、浏览器通过该url 找到servlet -->
<url-pattrern>/MyServlet</url-pattern>
</servlet-mapping>
编写第一个Servlet |
- 1、开发Servlet
package helloWorldServlet;
//导入必需的java库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
//实现一个servlet需要继承HttpServlet ,更好地服务于http请求
public class HelloWorld extends HttpServlet{
private static final long serialVersionUID = 1L;
private String message;
//初始化方法
public void init() throws ServletException{
message = "Hello World";
}
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
//设置响应内容类型
response.setContentType("text/html");
//具体的逻辑
PrintWriter out = response.getWriter();
out.println("<h1>" + message + "</h1>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
public void destory(){
}
}
- 2、部署Servlet (web.xml 中配置Servlet元素和Servlet-mapping)
- 3、启动tomcat ( bin\startup.bat)
- 4、浏览器访问网址(http://localhost:8080/contestPath/servletPath)
为什么在servlet 中没有见到service ()方法?
我们都知道编写的servlet 继承于HttpServlet ,而httpServlet 又继承于GenericServlet类,在HttpServlet中提供了两个重载的service()方法,第一个service方法将req 对象和res 对象转换为HttpServletRequest 和 HttpServletResponse 类型,然后调用第二个service()方法对客户请求进行处理,将转换后的HttpServletRequest对象和HttpServletResponse 对象作为参数传递进去,首先调用HttpServletRequest对象的getMethod()方法,获取HTTP请求方法的类型,调用相应的doXxx()方法,所以我们在实现servlet时不需要去重写service()方法,只需要重写相应的doXxx()方法即可。
总结
servlet的内容先介绍到这里,后面博文将会写到servlet 的会话跟踪机制。