Статьи

Разработка веб-приложений с Gaelyk

В течение долгого времени я задавался вопросом: каков лучший фреймворк для небольших экспериментальных веб-приложений?

Я программист на Java с 1996 года, и я могу создать сервлет или jsp с простым HTML, но я вижу ряд вещей в качестве проблем.

Прежде всего — управление пользователями. Форма входа / регистрации, электронная почта и т. Д. — я предпочитаю тратить как можно меньше времени на все эти вопросы.

Второе — хостинг — хостинг на Java дорогой.

И, наконец, я нашел решение — это Gaelyk : Groovy-фреймворк для Google App Engine.

Существует несколько способов создания простого проекта Gaelyk — вы можете скачать шаблон проекта   и создать проект с использованием архетипа maven , но оба используют стандартный компилятор groovy (а не компилятор eclipse groovy). Также ни один из них не содержит примеров постоянства объекта.

Итак, я создал свой собственный архетип Maven для Gaelyk. Давайте использовать его для создания простого проекта Gaelyk:

mvn archetype:generate -DarchetypeGroupId=org.bernshtam -DarchetypeArtifactId=gaelyk-archetype -DarchetypeRepository=http://bernshtam.name/maven2 -DgroupId=myexample -DartifactId=test1 -DarchetypeVersion=1.0

Теперь вы можете импортировать этот проект в Intellij IDEA.

После импорта не забудьте добавить фасет App Engine в проект. Теперь вы можете добавить конфигурацию запуска.

Обратите внимание, что комплект разработчика Google App Engine должен быть уже установлен и установлен в IDEA.

maven принесет остальные зависимости 🙂 

Давайте запустим maven «install» и …

Сейчас — запуск! 

Да! Это работает! Это простое приложение для создания заметок с приоритетом.

Давайте посмотрим на исходный код.

web.xml настроить сервлет и фильтр для groovlets и шаблонов (файлы gtpl)

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
    <listener>
        <listener-class>groovyx.gaelyk.GaelykServletContextListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>GroovletServlet</servlet-name>
        <servlet-class>groovyx.gaelyk.GaelykServlet</servlet-class>
        <init-param>
            <param-name>verbose</param-name>
            <!-- Set it to true for more details -->
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>TemplateServlet</servlet-name>
        <servlet-class>groovyx.gaelyk.GaelykTemplateServlet</servlet-class>
        <init-param>
            <!-- Remove the default "generated by" messages from the templates -->
            <param-name>generated.by</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>verbose</param-name>
            <!-- Output generation time in the HTML, see source page -->
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <filter>
        <filter-name>RoutesFilter</filter-name>
        <filter-class>groovyx.gaelyk.routes.RoutesFilter</filter-class>
    </filter>

    <servlet-mapping>
        <servlet-name>GroovletServlet</servlet-name>
        <url-pattern>*.groovy</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>TemplateServlet</servlet-name>
        <url-pattern>*.gtpl</url-pattern>
    </servlet-mapping>

    <filter-mapping>
        <filter-name>RoutesFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.gtpl</welcome-file>
    </welcome-file-list>
</web-app>

appengine-web.xml — это дескриптор Google App Engine. Вам необходимо заменить test1-archetype на имя приложения ядра приложения (если вы хотите его развернуть) и создать это приложение в консоли App Engine перед развертыванием.

 

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0-SNAPSHOT">
    <application>test1-archetype</application>
    
    <version>1</version>

    <!-- Enable concurrent requests by default to serve requests in parallel -->
    <threadsafe>true</threadsafe>

    <!-- If all your templates and groovlets are encoding in UTF-8 -->
    <!-- Please specify the settings below, otherwise weird characters may appear in your templates -->
    <system-properties>
        <property name="file.encoding" value="UTF-8"/>
        <property name="groovy.source.encoding" value="UTF-8"/>
        <property name="java.util.logging.config.file" value="WEB-INF/logging.properties" />
    </system-properties>

    <!-- Uncomment this section if you want your application to be able to receive XMPP messages -->
    <!-- And create a file named jabber.groovy in /WEB-INF/groovy -->
    <!-- Similarily, if you want to receive incoming emails -->
    <!-- And create a file named email.groovy in /WEB-INF/groovy -->
    <!--
    <inbound-services>
        <service>xmpp_message</service>
        <service>mail</service>
    </inbound-services>
    -->

    <!-- It it advised to keep this parameter to true -->
    <!-- as per the release of SDK 1.2.8, -->
    <!-- this should speed up cold startups of applications by 10% -->
    <precompilation-enabled>true</precompilation-enabled>
    
    <static-files>
        <exclude path="/WEB-INF/**.groovy" />
        <exclude path="**.gtpl" />
    </static-files>
</appengine-web-app>

Теперь Gaelyk конкретные вещи. route.groovy содержит инструкции по перенаправлению HTTP-запросов.

get "/", redirect: "listnotes.groovy"
get "/favicon.ico", redirect: "/images/favicon.png"

Gaelyk — это MVC-фреймворк, поэтому большинство запросов будет перенаправляться на контроллеры, роль которых в Gaelyk играет groovlets. Вы можете увидеть полное описание маршрутов. Groovy DSL здесь  .

Давайте теперь посмотрим на класс Примечание:

package myexample

import groovyx.gaelyk.datastore.Entity
import groovyx.gaelyk.datastore.Key
import groovyx.gaelyk.datastore.Unindexed

@Entity(unindexed=false)
class Note {
    @Key long id
    String login
    @Unindexed int priority
    String text
}

По умолчанию Gaelyk предлагает вам очень простую интеграцию с Google App Engine Datastore. Это не настоящий ORM, не JPA, но вы можете использовать его для простых приложений.

Давайте посмотрим примеры из этого контроллера приложения:

Note  note = new Note(priority:priority, text: text, login: email)
note.save()
...

def  note = Note.get(id)
note.delete()
..
def notes = Note.findAll { login == email }

Приятно 🙂 Разве не так?

Теперь давайте посмотрим на переменные user, request и log.

def email = user.email
...
log.fine("$notes ${notes.size()}")
...
String text = request.getParameter("text")

Эти переменные там не определены. Они вводятся. Пользователь будет содержать ноль, если пользователь не вошел в систему и будет содержать информацию о пользователе в противном случае. log содержит регистратор, а запрос содержит объект HttpRequest.

Вы будете взволнованы тем, сколько переменных автоматически вводится   в контроллеры Gaelyk, шаблоны (и, если хотите, любые другие классы)

. Модель передается из контроллера в представление с помощью свойств объекта запроса:

request['notes'] = notes
forward "index.gtpl"

Шаблоны — это последнее, что нужно увидеть. Они выглядят как jsp, содержат директивы% include% и фрагменты кода.

<% include '/WEB-INF/includes/header.gtpl' %>

<h1>My notes</h1>

<% if (user) { %>
    <p>



            <table width="50%" border="1">
                <tr><th width="30%">Note</th><th>Priority</th><th></th></tr>
                    <% request.notes.each { note -> %>
                        <tr><td>${note.text}</td><td align="left"> ${note.priority}</td><td><A href="deletenote.groovy?id=${note.id}">X</A> </td></tr>
                    <% } %>
            </table>


    </p>
    <div class="add">
    <h2>Add a new note</h2>
    <p>
    <form name="addnote" action="addnote.groovy" method="post">

    Priority: <input name="priority" id="priority" type="number" value="1" min="1" max="10"/><br/> <br/>
    Text: <input name="text" id="text" type="text"/>
    <input type="submit" value=" Add Note "/></form>
    </p>
    </div>
    <% } else { %>
    <p><A href="${users.createLoginURL("/")}">Login</A> </p> to access your notes
<% } %>


<% include '/WEB-INF/includes/footer.gtpl' %>

 

Посмотрите, как мы проверяем, что пользователь вошел в систему (if (user) …), как мы получаем режим (request.notes.each …), отличный стиль встраивания переменных ($ {note.priority}) , создание ссылки для входа в систему ($ {users.createLoginURL («/»)} — пользователи — это еще одна

внедренная переменная. Если вам нравится Gaelyk — начните с чтения этого урока !