giovedì 27 ottobre 2011

Ne ho abbastanza di correre alla Scala in un terminale, proviamo con una applicazione web


Stavo controllando Scala come un nuovo linguaggio di programmazione da imparare, e dopo essere rimasta positivamente impressionata ho voluto fare di più facendo finta superare i test. Essendo uno sviluppatore web per natura, ho iniziato cercando di risolvere il primo problema fondamentale: scrivere un'applicazione web in Scala.

Proviamo Sollevare

Ho pensato che la soluzione più semplice era quella di iniziare con un quadro: Ho scaricato Lift, uno dei principali framework web Scala. Un esempio per la vecchia scuola programmatore come me è disponibile ( from_mvc ), pronto per essere compilato ed eseguito tramite Maven.

Un quadro che fornisce la struttura

Ascensore funziona su Jetty (un servlet container embedded) per lo sviluppo rapido, dato che tutto il codice viene compilato in bytecode la JVM come sempre, il servlet container si può utilizzare sono le stesse per le applicazioni web Java.
Se guardiamo l'albero dei sorgenti di un'applicazione Ascensore, scopriamo alcuni luoghi interessanti:
src / main / webapp contiene file statici come HTML, CSS e file JavaScript. In realtà, questi modelli vengono analizzati e widget vengono sostituiti basandosi sugli attributi particolari:
1.campata class "lift: TimeNow" >?? po 'di tempo </ durata >
principale / Scala / bootstrap / liftweb / Boot.scala è una classe di bootstrap per la configurazione delle opzioni come percorsi e codifica dei caratteri.
principale / Scala / code / frammento contiene i file di origine Scala per i widget pagine:
1./ / il nostro frammento
2.oggetto TimeNow {
3./ / crea una funzione (NodeSeq => NodeSeq)
4./ / che mette l'ora corrente nel
5./ / corpo della Elem in arrivo
6.def render = "* *" #> now.toString
7.}
Beh, è ​​un po 'complicato come un quadro: è una curva di apprendimento che avrei dovuto lavorare. Proviamo qualcosa di più semplice. Di sicuro un quadro ha alcuni strumenti interessanti per la compilazione e la distribuzione, che sono già integrate, ma non mi permette di imparare ciò che accade sotto il cofano.

Semplice servlet vecchio

Il minimo comune denominatore per lo sviluppo web sulla JVM è l'API Servlet. Ho trovato una classe HelloScalaServletseguendo questa serie e ho iniziato mettendo su un piccolo esempio ciao mondo, a partire dal codice Java.
. 01pacchetto com.dzone;
02. 
03.importare javax.servlet.http. {HttpServlet,
04.HttpServletRequest => HSReq, HttpServletResponse => HSResp}
05. 
06.classe HelloScalaServlet estende HttpServlet
07.{
08.override def doGet (req: HSReq, resp: HSResp) =
09.resp.getWriter (). print ( "<HTML>" +
10."<HEAD> <TITLE> Ciao, Scala </ TITLE> </ HEAD>" +
11."<BODY> Ciao, Scala! Questo è un servlet. </ BODY>" +
12."</ HTML>" )
13.}
Questa servlet ha bisogno di qualche configurazione da eseguire, come una semplice WEB-INF.xml per configurare il percorso:
01.<! DOCTYPE web-app
. 02PUBLIC "- / / Sun Microsystems, Inc. / / DTD Web Application 2.3 / / EN"
04.web-app >
05.servlet >
06.servlet-name > helloWorld </ servlet-name >
07.servlet-class > com.dzone.HelloScalaServlet </ servlet-class >
08.</ servlet >
09.servlet-mapping >
10.servlet-name > helloWorld </ servlet-name >
11.url-pattern > / sayHello </ url-pattern >
12.</ servlet-mapping >
13.</ web-app >
Il problema è che non so come compilare questa roba dal cli. Scala torna erros perché servelet pacchetto non viene trovato, e non scalax opere out of the box. Non so come trattare con errori di compilazione, ma posso fare quello che faccio sempre quando lavoro con Java codice: utilizzando un IDE.

Aggiungiamo alcuni utensili

ScalaIDE è un plugin di Eclipse che ci consentono di creare progetti Scala, promettendo di fornire il supporto per il percorso di costruzione e per la compilazione, fuori dalla scatola. Questo plugin funziona su Eclipse 3.6.2 e 3.7, e la sua installazione può essere fatta dall'interno di Eclipse nel nuovo software di installazione di dialogo. C'è anche un video che spiega l'installazione ste-by-step: io sono un ragazzo di Vim, ma devo ammettere ScalaIDE è veramente utile.
Dopo aver installato questo plugin e l'aggiunta di Apache v6.0 nelle biblioteche del progetto Tomcat, la compilation è andato con successo.

Non immediata implementazione

Questa è stata una distribuzione standard di Java: ho copiato il web.xml nella directory WEB-INF dell'applicazione Web e il HelloScalaServlet.class in WEB-INF/classes, con tanto di pacchetto (quindi in realtà è WEB-INF/classes / com / DZone / HelloScalaServlet.class).
Tuttavia, c'era ancora un pezzo mancante:
1.javax.servlet.ServletException: Errore durante l'allocazione di un'istanza servlet
2....
3.root cause
4.java.lang.NoClassDefFoundError: scala / ScalaObject
Dopo aver compilato questa servlet da Scala codice, mi stavo perdendo le classi di base scala in ambiente Tomcat.
Così ho copiato la mia scala-library.jar in / usr/share/tomcat6/lib /, che è la cartella librerie di Tomcat. Dopo un riavvio, ora posso distribuire qualsiasi servlet derivato da codice Scala in questa istanza di Tomcat.

Le mie conclusioni

Se dovessi iniziare una seria applicazione web con Scala, anzi cercherei un framework come Ascensore per salvarmi tempo. Tuttavia, mentre l'apprendimento, è meglio per me, per costruire i miei strumenti proprio nel campo che mi interessa, ad esempio potrei scrivere un Ant distribuzione basata, invece di basarsi su Eclipse (che non riesce nemmeno a lanciare progetti per default alla Scala di Tomcat).
Il problema quando adotta una nuova lingua di solito non è nella stessa lingua, ma nella mancanza di attrezzature.Tuttavia, Scala ha dimostrato che se si proviene da sfondo Java è possibile installare un IDE in pochi minuti, e distribuirequasi come se si stesse scrivendo codice Java.