Я проверял 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.