Статьи

Современная веб-разработка с Maven, Mercurial и Spring MVC

Через несколько минут вы сможете начать работу с управлением версиями, сборкой / упаковкой и ненавязчивой веб-инфраструктурой. Вот как!

Открытый исходный код предоставляет современному разработчику так много вариантов, от операционной системы, в которой вы пишете код, до IDE и даже до контейнера, в котором развернуты ваши WAR / EAR. Проще говоря: никогда не было лучше быть разработчиком, чем сейчас.

Этот краткий учебник дает краткое руководство по началу работы с тремя великолепными технологиями, с которыми вы должны быть знакомы — Maven, Mercurial и Spring MVC.

Настройка сцены

Давайте создадим проект, используя maven и особенно его архетип веб-приложения:

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp 
-DarchetypeArtifactId=maven-archetype-webapp

Получение версии

Большинство распределенных систем управления версиями (DVCS) позволяют вам за считанные секунды поместить свой код в хранилище, что является большой победой для разработчиков, потому что лень распространена! Давайте перейдем в каталог нашего недавно созданного проекта, а затем инициализируем, добавим, а затем передадим в новый репозиторий Mercurial.

$ hg init .
$ hg add .
adding pom.xml
adding src/main/webapp/WEB-INF/web.xml
adding src/main/webapp/index.jsp
$ hg com -m "initial commit"

Теперь вы в безопасности — любые сделанные вами изменения могут быть зафиксированы, а любые ошибки могут быть исправлены Давайте посмотрим, что Mercurial («hg») может сделать для нас. Каков статус нашего хранилища прямо сейчас?

$ hg st

ОК, нет новостей, это хорошие новости. Давайте добавим интеграцию Spring MVC в наш web.xml в src / main / weapp / WEB-INF /.

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>

Теперь мы изменили наш файл, давайте снова поместим его в наш репозиторий, используя hg

$ hg st
M src/main/webapp/WEB-INF/web.xml

Mercurial говорит нам, что есть один измененный файл. Прежде чем приступить к выполнению, давайте удостоверимся, что мы сделали все необходимое для запуска и запуска Spring MVC с нашим проектом, добавив файл dispatcher-servlet.xml (который является нашим дескриптором контекста Spring). Создайте файл ‘dispatcher-servlet.xml’ в каталоге src / main / webapp / WEB-INF / и поместите в него следующее:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">

<context:component-scan base-package="com.mycompany.app"/>

<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>

Отлично, теперь у нас есть Spring, интегрированный с нашим веб-приложением. Поскольку это один набор изменений, давайте передадим его в Mercurial, чтобы он был полностью готов, прежде чем мы начнем писать наш основной контроллер. Вы заметите, что если вы запустите «hg st» (status), у вас будет src / main / webapp / WEB-INF / dispatcher-servlet.xml, помеченный знаком?. Это означает, что Mercurial видит файл, который не находится под контролем версий. Просто запустите «hg add src / main / webapp / WEB-INF / dispatcher-servlet.xml», чтобы добавить его в репозиторий. Запуск «hg st» после этого покажет «A» перед ним — это означает, что он готов к добавлению всякий раз, когда вы фиксируете.

$ hg add src/main/webapp/WEB-INF/dispatcher-servlet.xml
$ hg st
M src/main/webapp/WEB-INF/web.xml
A src/main/webapp/WEB-INF/dispatcher-servlet.xml
$ hg com -m "Integrate Spring MVC"

Готово! Легко как то. Теперь все, что нам нужно, — это убедиться, что к нашим зависимостям в нашем файле pom.xml добавлены Spring MVC и Spring Core, а затем мы можем начать кодирование.

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>2.5.1</version>
</dependency>

Теперь, не запрашивая, зафиксируйте это в своем хранилище;)

Единственный аспект, который остается сделать, — это заняться программированием. В 2.5 Spring выпущены аннотации для контроллеров, которые позволяют вам избавиться от большей части конфигурации XML, которая вам была бы необходима в противном случае. Я лично думаю, что это большой плюс; Если вы привыкли работать в большой команде, в которой много изменений, вы будете знать, что конфигурационные файлы Spring XML только увеличивают объем и усложняют слияние.

Первая аннотация, с которой вы столкнетесь, — это @Controller, которая помечает его как контроллер (да!) Для управления Spring. Эта аннотация относится к классу и должна применяться к любому классу, который Spring должен предоставить. Подумайте — вы уже избавились от 8 строк объявления сервлета и отображения в вашем файле web.xml!

Далее вы будете использовать @RequestMapping. Это аннотация уровня метода, которая сообщает Spring, какое сопоставление URL следует использовать для запросов. Ранее мы настраивали весь контент .html для прохождения через сервлет Dispatcher, поэтому помните, что при настройке URL-адресов таким способом. Давайте начнем. Ниже приведен фрагмент кода, который вы должны добавить в src / main / java / com / mycompany / app / view / IndexController.java (не забудьте создать этот каталог, поскольку наш веб-приложение не требует этого!).

package com.mycompany.app;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController {

@RequestMapping("/index.html")
public String indexHandler() {
return "index";
}

}

Приведенный выше класс очень прост, но является отличным примером того, как аннотации можно использовать в Spring для очень быстрого запуска и запуска. Сверху вниз видно, что происходит — кроме возвращаемого «индекса»; что, если вы знаете, что Spring MVC должен быть самоочевидным, так как это просто JSP URI, который создается с использованием префикса и суффикса символов в Web XML, и знать, что он не привязан к каркасу, также является плюсом. Вы не расширяете или не реализуете что-то из еще одной сторонней кодовой базы, и вы можете структурировать это так, как пожелает ваша организация (или даже потребует!).

О, не забудьте «hg commit» ваши изменения! В следующий раз мы расширим приложение, чтобы использовать аннотацию @RequestParam и многое другое!

Вывод

Итак, теперь у вас есть веб-приложение с управлением версиями, использующее Spring MVC, Mercurial и Maven. Там очень мало!