Servlet基础
1.首先聊一下客户端/浏览器和服务器交互的大致流程
第一步:客户端与服务器建立连接
第二步:客户端向服务器发出请求
第三步:服务器响应客户端的请求
第四步:断开连接
2.服务器到底是什么?
平时我们生活中说到的服务器,可能更多的是指一个物理的硬件组成的机器,但其实服务器是一个软件。
服务器作用:
客户端向服务器发出一个请求时,服务器会根据我们的请求,做出特定的响应,所以,服务器就是一个容器,用来放置“怎样响应”的代码。
服务器怎样工作:
首先,服务器被动提供服务;当客户端向服务器发送请求时,服务器根据请求调用服务器容器中的特定代码,然后响应给客户端。
用Tomcat服务器做个例子:
怎样访问某一个计算机上的Tomcat服务器?
只需要在浏览器输入URL http://主机ip:该主机中Tomcat的端口号/项目虚拟的地址/项目中的Servlet类
例如: http://localhost:8080/test/testServlet
localhost 主机ip(也可以写成127.0.0.1)表示本机
8080 :Tomcat服务器在本机的端口号 test :项目的虚拟路径 testServlet : test项目中的一个Servlet类的映射路径
输入上述的URL后,浏览器通过主机ip和端口号可以与服务器建立连接,ip地址可以定位一台计算机,端口号可以确定一台计算机上的应用。之后,向test项目的Servlet发送请求,说的更明白一点,就是告诉服务器执行这个Servlet类,然后将结果通过响应发送给客户端。
3.通过上面的解释,再解释下什么是Servlet
Servlet就是实现了继承了HttpServlet的Java类
HttpServlet中有一个service()方法,当有客户端请求某一个Servlet类的时候,服务器(容器)就会执行这个Servlet类的service()方法。
通过配置web.xml,用一个其它的名字映射到Servlet类(Servlet的部署),这个过程是必须的
<servlet>
<servlet-name>映射名(桥梁)</servlet-name>
<servlet-class>Servlet类名字</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>映射名(桥梁)</servlet-name>
<url-pattern>/这里的名字可以映射到上面的Servlet类</url-pattern>
</servlet-mapping>
<servlet-name>相同,表示为一组;一组中的<url-pattern>可以映射到<servlet-class>
4.Servlet的生命周期(加载到内存-->销毁)
什么时候加载进入内存?
默认情况:第一次调用(请求)这个Servlet的时候
通过配置web.xml在服务器启动时加载
<servlet>
<servlet-name>...</servlet-name>
<servlet-class>Serlet类名</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<load-on-startup>1</load-on-startup>的数字表示加载顺序,如果有多个Servlet类在服务器启动时被加载,这个类会第一个加载。
什么时候销毁?
服务器关闭时
5.Servlet关键的方法
void init(); //初始化调用,在加载进内存时调用
void service(HttpServletRequest request, HttpServletResponse response); //Servlet被请求时,服务器调用该方法
void destory(); //Servlet销毁时调用,也就是说,关闭服务器时
接下来说一下doGet()和doPost()方法
重写这两个方法后,doGet()可以用来处理get请求,doPost()可以用来处理post请求。
问题:服务器不是调用service方法吗?怎么会执行doGet()和doPost()
这里利用了java的多态 看一下HttpServlet的部分源代码
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String method = req.getMethod();
if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
}
...
...
可以看到,通过HTTP请求可以得到请求方式,再通过不同的方式调用不同的方法。上面的代码表示如果是一个request请求,那么就调用doGet()方法
服务器只会调用service()方法,但是service()方法又会调用doGet()和doPost()方法