一、什么是Web服务器
在了解Servlet之前,我们需要了解Web服务器。Web服务器使用HTTP协议来传输数据。最简单的一种情况是,用户在浏览器(客户端,client)中输入一个URL,然后就能获取网页进行阅览。
因此,服务器完成的工作就是发送网页至客户端。传输过程遵循HTTP协议,它指明了请求(request)消息和响应(response)消息的格式。
GET / HTTP/1.1
Host: www.sina.com.cn
User-Agent: Mozilla/5 MSIE
Accept: */* ┌────────┐
┌─────────┐ Accept-Language: zh-CN,en │░░░░░░░░│
│O ░░░░░░░│───────────────────────────>├────────┤
├─────────┤<───────────────────────────│░░░░░░░░│
│ │ HTTP/1.1 200 OK ├────────┤
│ │ Content-Type: text/html │░░░░░░░░│
└─────────┘ Content-Length: 133251 └────────┘
Browser <!DOCTYPE html> Server
<html><body>
<h1>Hello</h1>
...
二、什么是Servlet
Servlet(Servlet Applet),全称Java Servlert 是用Java编写的服务器端程序。其主要功能在与交互式的浏览和修改数据,生成动态Web内容。狭义的servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet的类。
Servlet 运行于支持Java的服务器中,从现实上讲,servlet 可以响应任何类型的请求,但是绝大多数情况下Servlet只用于来扩展基于THHP协议的Web服务器。
一个
Servlet
总是继承自
HttpServlet
,然后覆写
doGet()
或
doPost()
方法。
doGet()
方法传入了
HttpServletRequest
和
HttpServletResponse
两个对象,分别代表
HTTP
请求和响应。我们使用
Servlet API
时,并不直接与底层
TCP
交互,也不需要解析
HTTP
协议,因为
HttpServletRequest
和
HttpServletResponse
就已经封装好了请求和响应。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("被请求到了!");
}
三、常见的Servlet服务器
- Tomcat:由Apache开发的开源免费服务器;
- Jetty:由Eclipse开发的开源免费服务器;
- GlassFish:一个开源的全功能JavaEE服务器
四、Servlet的生命周期
servlet的生命周期,顾名思义,指的就是一个servler从创建到销毁的全部过程:
1.实例化
2.初始化
3.服务
4.销毁
一、实例化
在第一次启动服务器时,会调用它的无参构造方法,创建Servlet的实例
public HomeServlet() {
System.out.println("1.HomeServlet实例被创建");
}
二、初始化
重写HttpServlet父类的init()方法,通过实例自动调用init()方法
@Override
public void init() throws ServletException {
System.out.println("2.HomeServlet实例初始化");
}
三、服务
通过该
Servlet
的实例,调用
service()
方法,如果子类没有重写该方法,则调用HttpServlet父类的
service()
方法。
在父类的该方法中进行请求方式的判断,如果是
GET
请求,则调用
doGet()
方法;如果是
POST
请求,则调用
doPost()
方法;
如果子类重写
doGet()或doPost()
方法,则调用子类重写后的
doGet()或doPost()
方法;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("请求到了!");
String method = req.getMethod();
System.out.println("请求方式:" + method);
System.out.println(req.getRemoteHost());
}
如果子类没有重写
doGet()或doPost()
方法,则调用父类的
doGet()或doPost()
方法,在父类的方法实现中,返回一个
405
状态码的错误页面。
//以doGet()方法举例
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String msg = lStrings.getString("http.method_get_not_supported");
sendMethodNotAllowed(req, resp, msg);
}
public static final int SC_METHOD_NOT_ALLOWED = 405;
四、销毁
当服务器关闭或重启时,会销毁所有的Servlet实例,会调用Servlet实例的
destroy()
方法
@Override
public void destroy() {
System.out.println("4.HomeServlet实例被销毁");
}
五、小结
我们学习到一个servlet从创建到销毁的全过程,称作Servlet的生命周期
版权归原作者 记得爱蓝色 所有, 如有侵权,请联系我们删除。