Kotlin Web应用程序教程

时间:2020-02-23 14:37:33  来源:igfitidea点击:

在本教程中,我们将学习如何创建Kotlin Web应用程序。
我们假设您已经精通Java EE和Kotlin,然后再进行本教程的业务工作。

Kotlin Web应用程序

Java EE是Java SE的扩展,用于创建Web应用程序,其余Web服务以及与Web相关的任何内容(不要忘记微服务)。

我们也很清楚,JetBrains开发的最新语言Kotlin是静态类型的,并且基于JVM。
Kotlin的存在是为了解决Java开发人员面临的问题。

Kotlin简洁明了,并具有非常友好的语法来学习和适应。
此外,它与Java 100%互操作,可轻松编译为Java 6和Java 8字节码。

知道Kotlin比Java具有许多优势,为什么不在我们的Java EE环境中采用它。

这就是本教程的全部内容。
我们将使用Kotlin,Servlet和Tomcat localhost服务器开发一个简单的Web应用程序。
在此之前,我们来看看将Kotlin集成到Java EE应用程序中所面临的挑战。

  • Kotlin类默认为final:除非某个类被声明为" open class",否则默认为final。
    大多数时候,java ee应用程序类都不是最终的,因此我们可以集成" all-open"插件,而不是每次都将类定义为" open class"(否则会导致运行时异常)。
    在我们的IntelliJ Ideabuild.gradle文件中。

  • 默认情况下,Kotlin的构造函数带有命名参数:no-arg编译器插件为带有特定批注的类生成附加的零参数构造函数,从而使我们可以在没有显式指定构造函数的情况下实例化类。

以下是我们项目的build.gradle文件中要进行的修改。

buildscript {
  dependencies {
      classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
      classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
  }
}

apply plugin: "kotlin-noarg"
apply plugin: "kotlin-allopen"

我们将在Kotlin中使用Servlet创建一个Http Web应用程序。
注意:Servlet的核心是可以处理HTTP请求(通常是GET和POST请求)的类。
让我们在IntelliJ Ultimate中使用Kotlin创建第一个Hello World Web应用程序。
这就是创建Java EE应用程序所需要的。

Kotlin Web App项目

从侧列中选择Gradle,然后在右侧选择Kotlin(JVM)和Web。

如下所示设置组,工件和gradle设置。

注意:工件是项目资产的组合,将它们组合在一起以测试,部署或者分发软件解决方案或者其一部分。
当我们在服务器上运行应用程序时,它将被调用。

配置build.gradle

buildscript {
  ext.kotlin_version = '1.2.10'

  repositories {
      mavenCentral()
  }
  dependencies {
      classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  }
}

group 'com.theitroad.kotlinjavaee'
version '1.0-SNAPSHOT'

apply plugin: 'kotlin-platform-jvm'

repositories {
  mavenCentral()
}

dependencies {
  compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
  testCompile "junit:junit:4.12"
  testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
  testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
  testCompile group: 'junit', name: 'junit', version: '4.11'
}

compileKotlin {
  kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
  kotlinOptions.jvmTarget = "1.8"
}

让我们添加war插件和java ee依赖项。

buildscript {
  ext.kotlin_version = '1.2.10'

  repositories {
      mavenCentral()
  }
  dependencies {
      classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  }
}

group 'com.jour.as'
version '1.0-SNAPSHOT'

apply plugin: 'kotlin-platform-jvm'
apply plugin: 'war'

repositories {
  mavenCentral()
}

dependencies {
  compile group: 'javax', name: 'javaee-api', version: '7.0'
  compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
  testCompile "junit:junit:4.12"
  testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
  testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
  testCompile group: 'junit', name: 'junit', version: '4.11'
}

compileKotlin {
  kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
  kotlinOptions.jvmTarget = "1.8"
}

War插件扩展了Java插件,以添加对组装Web应用程序WAR文件的支持。

Kotlin Web App项目结构

由于本教程仅涉及Servlet,因此我们删除jsp文件。
在webapp内创建一个新目录,即WEB-INF,并向其中添加文件web.xml。

下面给出了MyServlet.kt(无.java扩展名)的代码。

import javax.servlet.annotation.WebServlet
import javax.servlet.http.HttpServlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

@WebServlet(name = "Home", value = "/hello")
class MyServlet : HttpServlet() {
  override fun doGet(req: HttpServletRequest, res: HttpServletResponse) {
      res.writer.write("Hello, World!")
  }
}

@WebServlet注解用于声明一个servlet并将其映射到指定的值(servlet映射)。
值参数是强制性的。
name参数在这里是可选的。

doGet函数用于将输入内容打印到屏幕上。

由于使用了@WebServlet批注,因此不需要部署描述符(web.xml文件)。

注意:以上注释不适用于Tomcat 7以下的版本。

运行Kotlin Web应用程序

从右上方的菜单按钮编辑配置:

将Tomcat(流行的servlet容器)设置为服务器。

由于端口号已经在使用中,因此我们将端口号从8080设置为8888。
我们已将URL路径添加到Hello World servlet,该URL将在项目运行时启动。

让我们设置部署所需的工件。

注意:如果未安装Tomcat,请转到IntelliJ-> Applications-> Plugins-> Tomcat Server

运行上述项目时的输出如下。

使用web.xml进行Servlet映射

除了在MyServlet.kt文件中设置注解,URL模式之外,我们可以在充当部署描述符文件的web.xml文件中进行设置,如下所示。

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.1"
       xmlns="https://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee https://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
       metadata-complete="false">

  <servlet>
      <servlet-name>MyServlet</servlet-name>
      <servlet-class>MyServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>MyServlet</servlet-name>
      <url-pattern>/hello/*</url-pattern>
  </servlet-mapping>

</web-app>

让我们修改MyServlet.kt文件,以将HTML作为输入显示在屏幕上。

import javax.servlet.annotation.WebServlet
import javax.servlet.http.HttpServlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

//@WebServlet(name = "Home", value = "/hello")
class MyServlet : HttpServlet() {
  override fun doGet(req: HttpServletRequest, res: HttpServletResponse) {
      //res.writer.write("Hello, World!")
      res.setContentType("text/html")
      val out = res.getWriter()

      out.print("<html><body>")
      out.print("<h3>theitroad Tutorial</h3>")
      out.print("<h4>Servlet App Using Kotlin</h4>")
      out.print("</body></html>")

  }
}