一、Servlet基础
1. BS架构
** ** 首先,我们先介绍一下BS架构。当我们访问网站或者使用App时,大部分场景下都是基于Browser/Server 模式,简称BS架构,它的特点是,户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web页面,并把Web页面展示给用户即可。Web页面具有极强的交互性。于Web页面是用HTML编写的,而HTML具备超强的表现力,并且,服务器端升级后,客户端无需任何部署就可以使用到新的版本,因此,BS架构升级非常容易。
2. HTTP协议
HTTP协议是一个基于TCP 协议之上的应用层协议,基于**请求——响应模式**。例如:我们
使用Chrome 浏览器查看百度首页的过程就是基于请求——响应模式。 在Web应用中,浏览器请求一个URL,服务器就把生成的HTML网页发送给浏览器,浏览器和服务器之间的传输协议是HTTP, 所以:
HTML是一种用来定义网页的文本,掌握HTML ,就可以编写网页;
HTTP 是在网络上传输HTML 的协议,用于浏览器和服务器的通信。
3.Servlet 实现
编写HTTP服务器其实是非常简单的,只需要先编写基于TCP协议的服务,然后在一个TCP连接中读取HTTP请求,发送HTTP响应即可。但是,要编写一个完善的HTTP服务器,以HTTP/1.1为例,需要考虑的包括:
识别正确和错误的HTTP请求;
识别正确和错误的HTTP头;
复用TCP连接;
复用线程;
IO异常处理;
这些基础工作需要耗费大量的时间,并且经过长期测试才能稳定运行。如果我们只需要输出一个简单的HTML页面,就不得不编写上千行底层代码,那就根本无法做到高效而可靠地开发。因此,在JavaEE平台上,处理TCP连接,解析HTTP协议这些底层工作统统扔给现成的Web服务器去做,我们只需要把自己的应用程序跑在Web服务器上。为实现这一目的,**JavaEE 提供了Servlet API**,我们使用 Servlet API 编写自己的Servlet来处理HTTP请求,Web 服务器实现ServletAPI接口,实现底层功能: ![](https://img-blog.csdnimg.cn/fa8f52544a8644c791c71923163af3b2.png) 接下来,我们来做一个简单的Servlet:
// WebServlet注解表示这是一个Servlet,并映射到地址 hello.do
@WebServlet("/hello.do")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 设置响应类型:
resp.setContentType("text/html");
// 获取输出流:
PrintWriter out = resp.getWriter();
// 写入响应:
out.write("<h1>Hello, world!</h1>");
// 最后不要忘记flush强制输出:
out.flush();
}
}
二、Servlet的生命周期
1.Servlet概述
简单来讲,一个Web App就是由一个或多个Servlet组成的,每个Servlet通过注
解说明自己能处理的路径。一个Web app完全可以有多个Servlet,分别映射不同的路
径。例如: HelloServlet能处理/hello.do这个路径的请求。
@WebServlet(urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
...
}
@WebServlet(urlPatterns = "/signin")
public class SignInServlet extends HttpServlet {
...
}
@WebServlet(urlPatterns = "/")
public class IndexServlet extends HttpServlet {
...
}
注:早期的Servlet需要要在web.xml中配置映射路径,但最新Servlet 版本只需要通过注解就可以完成映射。
因为浏览器发送请求的时候,还会有请求方法( HTTP Method ) :即GET、POST、PUT 等不同类型的请求。因此,我们要处理相应的请求,就得覆写对应的方法。例如要处理GET请求,我们就要覆写doGet()方法:
@WebServlet("/hello.do")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
...
}
}
2. Servlet的生命周期
在通过一个URL路径发起对一个Servlet请求的过程中,其本质是在调用执行Servlet实例的doXXX() 方法。该Servlet实例创建和使用的过程,被称为Servlet的生命周期。整个生命周期包括:**实例化、初始化、服务、销毁**。
- 实例化:根据Servlet请求的路径(例如: home.do ),查找该 Servlet的实例。如果实例不存在,则通过调用构造方法,完成Servlet 实例的创建。
- 初始化:通过该Servlet的实例,调用init() 方法,执行初始化的逻辑。
- 服务:通过该Servlet的实例,调用service() 方法,如果子类没有重写该方法,则调用HttpServlet父类的service() 方法,在父类的该方法中进行请求方式的判断,如果是GET请求,则调用doGet() 方法;如果是POST请求,则调用doPost() 方法;如果子类重写doXXX() 方法,则调用子类重写后的doXXX() 方法;如果子类没有重写doXXX() 方法,则调用父类的doXXX() 方法,在父类的方法实现中,返回一个405状态码的错误页面。 405状态码:代表请求的方式服务器不提供支持。
- ** **销毁:服务器关闭或重启时,会销毁所有的Servlet实例,会调用Servlet实例的destroy()方法。
三、常见的状态码
- 200 OK:表示成功;
- 301 Moved Permanently:示该URL已经永久重定向;
- 302 Found:示该URL需要临时重定向;
- 304 Not Modified:示该资源没有修改,客户端可以使用本地缓存的版本;
- 400 Bad Request:表示客户端发送了一个错误的请求,例如参数无效;
- 401 Unauthorized:表示客户端因为身份未验证而不允许访问该URL;
- 403 Forbidden:示服务器因为权限问题拒绝了客户端的请求;
- 404 Not Found:表示客户端请求了一个不存在的资源;
- 500 Internal Server Error:表示服务器处理时内部出错,例如因为无法连接数据库;
- 503 Service Unavailable:表示服务器此刻暂时无法处理请求。
版权归原作者 落日即是告别 所有, 如有侵权,请联系我们删除。