内容:
- 什么是servlet容器
- 如何使用servlet容器
- 安装并运行 Tomcat”
- 将应用程序部署到 Tomcat
- 使用 HTTPS 协议代替 HTTP
- 生成证书
- 设置服务器
- 动态生成HTML页面
- Tomcat 的替代品
什么是servlet容器
这是一个在服务器上运行的程序,可以与我们创建的 servlet 进行交互。换句话说,如果我们想在服务器上运行 Web 应用程序,我们首先部署一个 servlet 容器,然后将 servlet 放入其中。它的工作方式很简单:当客户端联系服务器时,容器处理他的请求,确定哪个 servlet 应该处理它并将其传递。如何使用servlet容器
除了路由请求之外,servlet 容器还执行其他功能:- 从 JSP 文件动态生成 HTML 页面。
- 加密/解密 HTTPS 消息。
- 为 servlet 管理提供受限访问。
安装并运行 Tomcat
-
要安装 Tomcat,只需将下载的存档解压到所需目录即可。
-
请注意,Tomcat 需要 Java 版本 8 或更高版本才能运行。确保JAVA_HOME环境变量引用当前的jdk版本。
-
接下来,您需要配置用户对 Tomcat 的访问。这是在 tomcat-users.xml 文件中完成的,该文件位于 conf 文件夹中。
Tomcat 预先提供了四个角色:
- manager-gui - 访问图形界面和状态页面;
- manager-script - 访问文本界面和状态页面;
- manager-jmx - 访问 JMX 和状态页面;
- manager-status - 仅访问状态页面。
在 <tomcat-users> 标签内,我们将明确编写这些角色并将它们分配给我们的用户:
<role rolename="manager-gui"/> <role rolename="manager-script"/> <role rolename="manager-jmx"/> <role rolename="manager-status"/> <user username="user" password="password" roles="manager-gui, manager-script, manager-jmx, manager-status"/>
现在一切准备就绪,可以启动了!
-
在 bin 文件夹中,运行startup.bat 文件(Linux 上为startup.sh)。
-
几秒钟后,在浏览器中打开链接http://localhost:8080/。图形管理器将出现在那里:
如果看到这样的菜单,则说明 Tomcat 正在运行。
-
如果不行,手动检查JAVA_HOME和CATALINA_HOME环境变量:
- JAVA_HOME - 必须引用当前版本的Java 8+;
- CATALINA_HOME - 必须引用 Tomcat 或不存在(不得指向 Tomcat 的另一个版本)。
将应用程序部署到 Tomcat
我们成功启动了 Tomcat,因此是时候在其中部署某种项目了。让我们使用上一篇文章中的 servlet 。主服务程序:import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hello")
public class MainServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
HttpSession session = req.getSession();
Integer visitCounter = (Integer) session.getAttribute("visitCounter");
if (visitCounter == null) {
visitCounter = 1;
} else {
visitCounter++;
}
session.setAttribute("visitCounter", visitCounter);
String username = req.getParameter("username");
resp.setContentType("text/html");
PrintWriter printWriter = resp.getWriter();
if (username == null) {
printWriter.write("Hello, Anonymous" + "
");
} else {
printWriter.write("Hello, " + username + "
");
}
printWriter.write("Page was visited " + visitCounter + " times.");
printWriter.close();
}
}
索引Servlet:
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.sendRedirect(req.getContextPath() + "/hello");
}
}
在部署之前,我们的 servlet 必须打包到 war 存档中。通常使用 Maven 来完成此任务,但要创建 war 存档,您需要一个映射所有 servlet 的 web.xml 文件。我们使用新的 @WebServlet 注释编写 servlet,因此我们没有 web.xml。幸运的是,IDEA 可以为我们做这些肮脏的工作,并将我们的项目单独包装在一个战争档案中。为此,您需要打开项目结构 (Ctrl + Shift + Alt + S) -> Artifacts -> 选择所需的构建 -> 选中“包含在项目构建中”旁边的框 -> 单击“确定”。 使用组合键 Ctrl + F9 构建项目。现在我们的 war 存档位于目标目录中。 该文件可以重命名为更简单的名称 - 例如 servlet.war - 并移动到更方便的位置 - 在 C:\my\ 中。当啤酒可供使用时,将其放入容器中。这可以通过两种方式完成。
-
通过图形用户界面
为此,请点击链接http://localhost:8080/manager/html。Tomcat 应该提示您输入登录名和密码。
如果您重复我之后的所有步骤,则登录名是 user ,密码是 password。
授权成功后,您将看到 Tomcat Web 应用程序管理器。应用程序部分已包含 5 个应用程序 - 这些是简化使用 Tomcat 所需的实用程序应用程序。它们将来可以被删除。
下面是部署部分。使用它,您可以选择要部署的战争档案。让我们手动输入路径和上下文:
点击“Deploy”,我们看到我们的应用程序已经出现在Applications部分:
使用 Tomcat GUI,我们可以停止它、重新启动它、设置会话长度并删除它。部署时,我们指定了上下文 /demo,这意味着必须通过链接http://localhost:8080/demo访问我们的应用程序。检查一下,一切都应该正常。 -
通过文件系统
通过这种方式部署应用程序,需要打开Tomcat解压后的目录,进入webapps。以下是我们熟悉的实用应用程序:
我们需要做的就是将 servlet.war 移到这里。
我们等待几秒钟,我们看到出现了一个新的 servlet 文件夹,这意味着我们的应用程序已部署。让我们转到熟悉的应用程序管理器界面 - http://localhost:8080/manager/。在这里我们看到我们的应用程序部署在 /servlet 上下文中:
以这种方式部署时,上下文会自动分配给已部署的 war 存档的名称。要更改上下文,您可以使用应用程序重命名新创建的文件夹,但在此之前您需要删除该文件:否则 Tomcat 将使用存档的名称重新部署应用程序。
正如您所看到的,将应用程序部署到 Tomcat 比看起来要容易得多。但它的其他功能很容易使用。让我们检查。
使用 HTTPS 协议代替 HTTP
如果您还记得,我们在另一篇文章中讨论了 HTTP 和 HTTPS 之间的区别。HTTPS 与 HTTP 是相同的协议,但对传输的数据使用加密。在客户端,加密由浏览器处理,我们必须在服务器端提供加密。由于 Tomcat 接受并路由 HTTP 请求,因此将加密委托给它是合乎逻辑的。 为此,您需要:- 生成自签名证书;
- 进行其他服务器设置。
生成证书
JDK 附带了大量实用程序,无论版本如何,其中之一是keytool。这是一个用于生成加密密钥并使用它们的工具。要使用它,请使用命令行转至C:\Program Files\Java\jdk1.8.0_181\bin目录并运行命令keytool -genkey -alias tomcat -keyalg RSA。- keytool - 使用参数启动实用程序;
- -genkey - 表示我们要生成一个新密钥;
- -alias tomcat — 创建一个密钥别名;
- -keyalg RSA - 选择 RSA 作为密钥生成算法。
设置服务器
现在证书已准备就绪,您需要调整服务器设置,即 SSL 连接器。这是在 server.xml 文件中完成的,该文件位于apache-tomcat-9.0.30/conf/中。我们发现这样的块:<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
type="RSA" />
</SSLHostConfig>
</Connector>
并将我们的配置放在它们旁边:
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="C:\Users\user\.keystore" keystorePass="mypass"
clientAuth="false" sslProtocol="TLS"/>
我们为 keystoreFile 和 keystorePass 参数分配与我们相关的值,使用 shutdown.bat 和startup.bat 文件保存并重新启动 Tomcat。现在服务器已准备好处理 https 请求,只需在更改后的地址上进行一些处理 - https://localhost:8443/demo/hello。单击该链接时,您将看到有关证书有问题的警告,这并不奇怪。如前所述,要获得普通证书,您需要使用其中一个认证服务的服务。但到目前为止我们已经实现了我们的目标:应用程序使用 HTTPS 协议工作,这是最主要的!
动态生成HTML页面
现在让我们继续回顾 Servlet 容器的其他功能 - 动态生成 HTML 页面。想象一个理想的世界,您可以使用变量、循环、数组和其他语言结构编写 JAVA 代码,而不是枯燥的静态 HTML 代码。你想象过吗?好消息是类似的东西存在,坏消息是它并不完全存在。如果你还没猜到,我们正在谈论JSP(Java Server Pages)技术。简而言之,这是一种允许您将 JAVA 代码片段插入 HTML 页面的技术。诚然,那么这段代码在发送到客户端之前仍然会转换为 HTML,但它会考虑到各种因素而动态生成。例如,您可以使用条件结构并根据某些条件提供不同的内容。JSP 页面示例:<%@ page language="java"" %>
<html>
<head>
<title>JSP</title>
</head>
<body>
<%
String firstName="name";
String secondName="surname";
if(firstName.equals("name")){
out.print("Hello :"+firstName+"<br>");
}
if(firstName.equals("name") && secondName.equals("surname"))
{
out.print("Hello, my dear friend! <br>");
}
else
{
out.print("I don’t know you. Go away! <br>");
}
%>
</body>
</html>
您可以在此处阅读有关 JSP 的更多信息。其实...我们来这里不是为了这个,而是为了servlet容器!JSP跟它有什么关系呢?很简单:JAVA 代码从 JSP 到 HTML 代码的转换是由 servlet 容器执行的。当 servlet 即将返回 JSP 内容作为响应时,容器会注意到并首先将其转换为浏览器可读的 HTML 页面,然后再将该内容发送到客户端。如今,JSP 技术有许多类似的技术 - Thymeleaf、FreeMarket、Mustache 等。它们都遵循相似的原理。选择哪一个来工作是一个品味问题。这也适用于选择 servlet 容器。在示例中,我们使用最常见的容器 Tomcat,但有些项目使用其他容器。有必要简单地熟悉一下最流行的,并看看它们与 Tomcat 的区别。
Tomcat 的替代品
-
GlassFish是 Oracle 支持的开源容器。
与 Tomcat 不同,它是一个成熟的 Web 服务器,除了 servlet 之外,还可以操作 JavaEE 框架中的其他组件。同时,它使用更多的内存。微调服务器时更加灵活,这使得使用起来更加困难。使用 JavaEE 框架开发应用程序时值得使用。
-
WildFly - 以前称为Jboss。也是开源的。由红帽开发。更改名称是为了避免与公司的另一个产品——JBoss 企业应用平台混淆。
WildFly 与 GlassFish 一样,是一个成熟的 Web 服务器。顺便说一句,WildFly 在底层使用 Tomcat 作为 servlet 容器。与 GlassFish 不同,WildFly 更轻量且更易于设置。
-
Jetty - 与之前的类似,是开源的。由 Eclipse 开发。
与Tomcat一样,它是一个简单的servlet容器,不支持JavaEE框架的所有组件。同时,它更加轻量级,甚至可以在手机上运行。它启动和停止速度很快,并且扩展性良好。与 Tomcat 不同,它的社区和知识库较小。
-
WebLogic是授权软件,需要购买才能使用。归甲骨文所有。
与Tomcat相比,它的功能更广泛一些。可以使用ftp协议。但在开发和测试应用程序时就不太灵活了。
-
WebSphere(准确地说是WebSphere Application Server)是一个付费软件。由IBM 开发。与 WildFly 和 GlassFish 类似,它是一个成熟的应用程序服务器。但它具有更友好的设置界面,以及较高的运行可靠性。
缺点是占用资源较多,启动和停止时间较长,在开发小项目时不太方便。
GO TO FULL VERSION