由于有这么多的Java技术,要想知道用哪种技术来驱动基于Java的网络应用,可能会很困难。
初级的Java程序员可以从使用servlets中受益,因为它们提供了一个了解Java低级概念的机会。Servlets也是构建交互式网络应用程序和动态网页的好帮手,因为它们被用来扩展由网络服务器托管的应用程序。它们处理浏览器和HTTP服务器上的任何客户端、数据库或应用程序之间的HTTP请求。
在本文中,你将学习如何构建和运行你的第一个servlet来托管你的Java应用。
教程要求
用Gradle启动一个新的Java项目
Gradle是一个方便的工具,可以让你在不同的平台上高性能地构建任何软件。如果你使用Homebrew,输入以下命令来安装Gradle:
brew install gradle
导航到一个你希望项目所在的目录。
下面的命令将帮助你为Java servlet应用程序创建一个基本项目目录。当提示你选择一个构建脚本DSL或测试框架时,按回车键选择默认:
$ gradle init --type java-library
Starting a Gradle Daemon (subsequent builds will be faster)
Select build script DSL:
1: Groovy
2: Kotlin
Enter selection (default: Groovy) [1..2]
Select test framework:
1: JUnit 4
2: TestNG
3: Spock
4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4]
Project name (default: java-twilio-sample): servlets-practice
Source package (default: servlets.practice):
> Task :init
Get more help with your project: https://docs.gradle.org/7.2/samples/sample_building_java_libraries.html
BUILD SUCCESSFUL in 52s
2 actionable tasks: 2 executed
一旦构建成功,使用下面的命令,创建一系列的子文件夹并导航到WEB-INF子文件夹:
$ mkdir -p src/main/webapp/WEB-INF
$ cd src/main/webapp/WEB-INF
这个目录结构很重要,因为它包含了部署Web应用程序所需的信息。这些文件夹将防止你的项目资源从网络浏览器中被公开访问。如果涉及敏感数据和认证,这一点尤其重要。
配置关于servlet的信息
在这个文件夹中创建一个名为web.xml的文件,用可扩展标记语言(也称为XML)编写以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
metadata-complete="true"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>helloWorld</servlet-name>
<servlet-class>guide.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloWorld</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
XML用于解释数据,所以当与servlet一起使用时,它可以为网络应用程序存储和传输数据,这对于动态网站是必要的。
该servlet被命名为 "helloWorld",需要映射到一组相关的URL。这意味着在网页浏览器上解释URL路径时,url-pattern 标签之间的每一个字符都将被解释和匹配起来。对于这个项目,url-pattern 是一个正斜杠,如果没有定义,这也是映射的默认匹配。
配置Gradle
Gradle需要导入相关的库和插件。用以下命令导航回项目目录的根文件夹:
$ cd ../../../../
创建一个build.gradle并添加以下插件:
apply plugin: 'java'
apply plugin: 'war'
apply from: 'https://raw.github.com/gretty-gradle-plugin/gretty/master/pluginScripts/gretty.plugin'
这些行允许你应用War插件,为Web应用组装Web应用资源(WAR)文件。你还可以使用Gretty插件,这样Java应用就可以被Gradle部署。Gretty对象将在本文件后面定义。
在文件中添加以下存储库和依赖关系列表:
repositories {
mavenCentral()
}
dependencies {
// The production code uses the SLF4J logging API at compile time
implementation group: 'org.slf4j', name: 'slf4j-simple', version:'1.7.21'
implementation group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
}
存储库的声明是为了让Java项目能够利用公共的开源依赖。对于这个项目,mavenCentral() ,因为它在Java项目中很流行,但如果你愿意,也可以使用Ivy或其他开源仓库。
这些依赖关系是为生产和测试目的而定义的。由于使用了servlet,为了利用定义的servlet容器在运行时需要的类和接口,实现了javax.servlet-api 。此外,还实现了一个简单的Java日志界面(SLF4J),以便在部署期间记录各种框架。
通过在文件底部添加gretty 对象来完成build.gradle文件:
gretty {
httpPort = 8080
contextPath = '/java-guide'
}
这些行提供了Jetty实例的上下文根。你可以定制Gretty插件的更多方面,并寻找不同的属性来为项目使用。
保存并关闭该文件。
创建servlet文件
用命令cd src/main/ ,导航到项目目录下的src/main文件夹。制作一个名为 "java "的文件夹,并在里面制作一个名为 "指南 "的子文件夹。你可以使用以下命令:
$ mkdir -p java/guide
$ cd java/guide
创建一个名为HelloWorldServlet.java的新文件并粘贴以下代码:
package guide;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.http.HttpServletResponse;
public class HelloWorldServlet extends HttpServlet {
private String mymsg;
public void init() throws ServletException {
mymsg = "Http Servlet Demo";
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1>" + mymsg + "</h1>");
out.println("<p>" + "Ahoy ahoy!" + "</p>");
}
}
注意,新创建的类HelloWorldServlet 继承了HTTPServlet 类的属性和方法,这样Java应用程序就可以使用HTTP的具体实现。
该类被初始化为一个变量,该变量将在以后的网页上使用和显示。
一个doGet() 函数被调用,以使servlet能够处理GET请求。这个函数被重写,以支持HTTP HEAD请求。doGet() 服务接收了一个HttpServletRequest 对象参数,为HTTP servlet提供请求信息。此外,该服务在发送响应时使用HttpServletResponse 对象来访问HTTP头文件和cookies。
在重载函数中,setContentType 被用来指定以文本和HTML格式发送到客户端的响应。
该函数以两个println 语句结束,以向Web应用程序显示字符串信息。这是通过声明一个名为out 的PrintWriter 对象来实现的,以默认的ISO-8859-1值向客户端发送字符文本。
启动HTTP servlet
用这个命令返回到项目根目录:
$ cd ../../../../
在启动HTTP servlet之前,请随时参考GitHub仓库,以确保所有文件都已到位,并且目录结构相互匹配:
运行gradle build 。
一旦构建成功,使用下面的命令来运行该应用程序。你应该看到一个类似于下图的输出:
$ gradle appRun
15:35:59 INFO Jetty 9.4.24.v20191120 started and listening on port 8080
15:35:59 INFO java-guide runs at:
15:35:59 INFO http://localhost:8080/java-guide
> Task :appRun
Press any key to stop the server.
16:52:47 INFO Jetty 9.4.24.v20191120 started and listening on port 8080
16:52:48 INFO java-guide runs at:
16:52:48 INFO http://localhost:8080/java-guide
16:55:33 INFO Jetty 9.4.24.v20191120 started and listening on port 8080
16:55:33 INFO java-guide runs at:
16:55:33 INFO http://localhost:8080/java-guide
<===========--> 87% EXECUTING [1h 22m 24s]
> :appRun
让应用程序在后台运行,并在你的网络浏览器中进入http://localhost:8080/java-guide。
在这段时间里,你能够对HelloWorldServlet.java文件进行修改,并看到这些修改反映在localhost页面上。

接下来你应该用HTTP Servlets构建什么?
恭喜你建立了你的第一个HTTP Servlet!但不要在此停留。但不要在此停留。继续深入探索其他一些可以用Twilio构建的整洁的Java项目。