如何启动一个HTTP小程序(附代码实例)

166 阅读5分钟

由于有这么多的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应用程序显示字符串信息。这是通过声明一个名为outPrintWriter 对象来实现的,以默认的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页面上。

The HTTP servlet-based application running in Google Chrome

接下来你应该用HTTP Servlets构建什么?

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