1、Tomcat介绍
Tomcat是一个容器,如果
Web服务器应用(如
Apache)得到一个指向servlet的请求(非静态页面),此时服务器不会把这个请求交给servlet本身,而是交给部署该servlet的容器。要由容器向servlet提供HTTP请求和响应,而且要由容器调用servlet的方法,如doPost()或者doGet()。
1.1 Tomcat功能
Tomcat容器用来管理和运行servlet,主要完成了如下的功能:
- 通信支持
利用容器提供的方法,能够让servlet和Web服务器对话。无需自己建立ServerSocket、监听端口、创建流等。容器知道自己与Web服务器之间的协议,所以你的servlet不必担心Web服务器(如Apache)和你自己Web代码之间的API。开发人员只需要考虑如何在servlet中实现业务逻辑即可。 - 生命周期管理
容器控制着servlet的生与死,负责加载类、实例化和初始化servlet、调用servlet方法,并使servlet实例能够被垃圾回收。 - 多线程支持
容器会自动为接收的每个servlet请求创建一个新的Java线程。针对客户请求,如果servlet已经运行完相应的HTTP服务方法,这个线程就会结束。 - 声明方式实现安全
通过容器,可以使用XML部署描述文件来配置和修改安全性,而不必将其硬编码写到servlet或者其他类代码中。 - Jsp支持
容器负责将jsp代码翻译成java执行。
1.2 Tomcat处理请求的过程
当客户向servlet发起一个请求,容器的处理过程如下:
- Tomcat容器看出这是一个向servlet发起的请求,然后,Tomcat容器会创建两个对象HttpServletReponse和HTTPServletRequest,分别代表请求和响应对象。
- 容器根据请求URL,在web.xml配置文件中找到对应的servlet,为这个请求创建或者分配一个线程,并把前面创建的请求和响应对象传递给这个servlet线程。
- 容器调用servlet的service()方法。然后根据请求类型的不同,service()方法会用请求和响应对象作为参数调用对应的doGet()或者doPost()方法。
- 然后,由doGet()或者doPost()方法生成动态页面“填入”响应对象。
- 线程结束时,容器把响应对象转换为一个HTTP响应,然后把它发给客户,然后删除请求和响应对象。最后,线程要么被撤销,要么返回到容器管理的一个线程池。
2、Servlet介绍
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
2.1 servlet的生命周期
- 实例化和初始化
一般来说,servlet会在第一次被访问时被实例化,实例化之后,会调用init()方法(该方法在servlet的整个生命周期中只执行一次)来完成一些初始化的操作(比如得到一个数据库连接等)。 - 处理请求
接下来,任何对该servlet的每次请求,都会在一个单独的线程中执行servlet的service()方法(service()方法会进一步根据请求的类型,调不同的doGet()或者doPsot()方法)。 - 销毁servlet
在servlet被垃圾回收,被销毁之前会调用destroy()方法(该方法在servlet的整个生命周期中也只执行一次)完成一些销毁的操作。
2.2 Servlet的简单例子
Servlet使用比较方便,一般来说就是重写doGet()和doPost()方法,这里简单介绍两个例子。
2.2.1 Servlet中使用RequestDispatcher将请求发给jsp
通过这种方式,使用jsp可以避免将大量的页面展现,写死在servlet的代码中,实现展现和处理的分离。
Servlet2Jsp.java代码:
package com.web.test;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Created by chengxia on 2018/12/3.
*/
public class Servlet2Jsp extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String []nbaPlayers = {"Kobe Byrant","Tim","Jordan"};
request.setAttribute("players",nbaPlayers);
RequestDispatcher view = request.getRequestDispatcher("players.jsp");
view.forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
}
Jsp文件的代码(players.jsp):
<%--
Created by IntelliJ IDEA.
User: chengxia
Date: 2018/11/25
Time: 12:40 PM
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>My Favourite NBA Players!</title>
</head>
<body>
<h1>My Favourite NBA Players:</h1>
<%
String [] players = (String [])request.getAttribute("players");
for(int i=0; i < players.length; i++){
out.print("<h2>" + players[i] + "</h2>");
}
%>
<h2></h2>
</body>
</html>
运行效果:
servlet到jsp效果
2.2.2使用servlet重定向让浏览器完成工作
有时候,需要将请求转发给另外一个url,这里可以通过servlet重定向来完成。
ServletRedirect.java代码如下:
package com.web.test;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Created by chengxia on 2018/12/3.
*/
public class ServletRedirect extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.sendRedirect("http://www.baidu.com");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
}
当请求这个servlet时,浏览器中会出现百度首页,因为我们在servlet中做了重定向。
2.2.3 重定向和RequestDispatcher请求分派的区别
重定向是由客户来完成的,客户会在浏览器看到新的url。而前面通过RequestDispatcher做的请求分派是在服务器端做的。
网友评论