Статьи

Мне достаточно запустить Scala в терминале, давайте попробуем с веб-приложением

Я проверял Scala как новый язык программирования для изучения, и, оставаясь положительно впечатленным, я хотел сделать больше, чем просто пройти поддельные тесты. Будучи веб-разработчиком по натуре, я начал пытаться решить первую фундаментальную проблему: написать веб-приложение на Scala.

Пробовать Лифт

Я думал, что самое простое решение — начать с фреймворка: я скачал Lift, основной веб-фреймворк Scala. Пример для программиста старой школы, такого как я, доступен ( from_mvc ), готов для компиляции и запуска через Maven.

Фреймворк предоставляет вам структуру

Lift работает на Jetty (встроенный контейнер сервлетов) для быстрой разработки; поскольку весь код компилируется в байт-код JVM как всегда, контейнер сервлета, который вы можете использовать, такой же, как и для веб-приложений Java.

Если мы посмотрим на дерево исходных текстов для приложения Lift, мы обнаружим несколько интересных мест:

src / main / webapp содержит статические файлы, такие как файлы HTML, CSS и JavaScript. На самом деле эти шаблоны анализируются, а виджеты заменяются на основе определенных атрибутов:

<span class="lift:TimeNow">??? some time</span>

main / scala / bootstrap / liftweb / Boot.scala — это класс начальной загрузки для настройки таких параметров, как маршруты и кодировка символов.

main / scala / code / snippet содержит исходные файлы Scala для виджетов страниц:

// our snippet
object TimeNow {
  // create a function (NodeSeq => NodeSeq)
  // that puts the current time into the
  // body of the incoming Elem
  def render = "* *" #> now.toString
}

Что ж, это немного сложно, как в любой среде: у нее есть кривая обучения, над которой мне пришлось бы работать. Давайте попробуем что-нибудь попроще. Конечно, у фреймворка есть некоторые интересные инструменты для компиляции и развертывания, которые уже интегрированы, но это не позволяет мне узнать, что происходит под капотом.

Простые старые сервлеты

Минимальным общим знаменателем для веб-разработки на JVM является Servlet Api. Я нашел класс HelloScalaServlet, соответствующий этому стандарту, и начал создавать небольшой приветственный пример, начиная с кода Java.

package com.dzone;

import javax.servlet.http.{HttpServlet,
  HttpServletRequest => HSReq, HttpServletResponse => HSResp}

class HelloScalaServlet extends HttpServlet
{
        override def doGet(req : HSReq, resp : HSResp) =
            resp.getWriter().print("<HTML>" +
                  "<HEAD><TITLE>Hello, Scala!</TITLE></HEAD>" +
                  "<BODY>Hello, Scala! This is a servlet.</BODY>" +
                  "</HTML>")
}

Для запуска этого сервлета требуется некоторая конфигурация, например, простой WEB-INF.xml для настройки маршрута:

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <servlet>
    <servlet-name>helloWorld</servlet-name>
    <servlet-class>com.dzone.HelloScalaServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>helloWorld</servlet-name>
    <url-pattern>/sayHello</url-pattern>
  </servlet-mapping>
</web-app>

Проблема в том, что я не знаю, как скомпилировать этот материал из Cli. Scala возвращает ошибку, поскольку пакет с сервлетом не найден, и ни одна из скалярных платформ не работает из коробки. Я не знаю, как бороться с ошибками компиляции, но я могу делать то, что всегда делаю, когда работаю с Java-кодом: использовать IDE.

Давайте добавим некоторые инструменты

ScalaIDE — это плагин Eclipse, который позволяет нам создавать проекты Scala, обещая обеспечить поддержку пути сборки и компиляции из коробки. Этот плагин работает на Eclipse 3.6.2 и 3.7, и его установка может быть произведена из Eclipse в диалоге установки нового программного обеспечения . Есть даже видео, объясняющее пошаговую установку: я парень из Vim, но должен признать, что ScalaIDE очень полезен.

После установки этого плагина и добавления Apache Tomcat v6.0 в библиотеки проекта компиляция продолжилась успешно.

Не немедленное развертывание

Это было стандартное развертывание Java: я скопировал файл web.xml в каталог WEB-INF веб-приложения и файл HelloScalaServlet.class в классы WEB-INF /, в комплекте с его пакетом (так что на самом деле это WEB-INF / classes / ком / DZone / HelloScalaServlet.class).

Тем не менее, все еще был недостающий кусок:

javax.servlet.ServletException: Error allocating a servlet instance
...
root cause
java.lang.NoClassDefFoundError: scala/ScalaObject

Скомпилировав этот сервлет из кода Scala, мне не хватало базовых классов Scala в среде Tomcat.

Поэтому я скопировал свой scala-library.jar в / usr / share / tomcat6 / lib /, которая является папкой библиотек Tomcat. После перезапуска теперь я могу развернуть любой сервлет, полученный из кода Scala, в этом экземпляре Tomcat.

Мои выводы

Если бы я запустил серьезное веб-приложение со Scala, я бы действительно искал такую ​​среду, как Lift, чтобы сэкономить мне время. Однако во время обучения мне лучше создавать собственные инструменты в областях, которые меня интересуют; например, я мог бы написать развертывание на основе Ant, а не полагаться на Eclipse (который даже не может запускать проекты Scala по умолчанию в Tomcat).

Проблема при принятии нового языка обычно не в самом языке, а в отсутствии инструментов. Тем не менее, Scala продемонстрировала, что если вы пришли из Java-среды, вы можете установить IDE за считанные минуты и развернуть ее почти так же, как если бы вы писали код Java.