Статьи

Просмотр технологий для MVC 1.0

Спецификация MVC 1.0 (JSR371) только что выпустила предварительный вариант для рассмотрения. Я очень рад видеть, что люди интересуются этим JSR и начинают глубже смотреть, как будет выглядеть MVC 1.0. На данный момент любые отзывы очень ценны и приветствуются.

Один из часто задаваемых вопросов — какие технологии просмотра MVC 1.0 будет поддерживать. Ответ в том, что в MVC есть встроенная поддержка JSP и Facelets . Кажется, это разочаровывает людей. Тем более, что JSP больше не считается «современной» технологией просмотра.

Я хочу отметить несколько вещей здесь. Первый JSP не так плох, как думает большинство людей. Конечно, у него есть свои недостатки (как и у любой другой технологии), но есть веские аргументы в пользу использования JSP. Например, каждая IDE поддерживает JSP из коробки, и я думаю, что приличный инструментарий — это то, чего не хватает многим другим технологиям представления. Одна из основных проблем JSP заключается в том, что она позволяет делать действительно очень плохие вещи, такие как встраивание кода Java в представление. Но если вы используете JSP разумным образом, это работает очень хорошо. А если вам не нравится JSP, вы также можете выбрать Facelets, которые уже давно существуют в мире JSF и предлагают множество замечательных шаблонных концепций.

Тем не менее, я согласен, что есть много других великолепных технологий. И я полностью понимаю людей, которые предпочитают такие библиотеки, как Thymeleaf, поскольку они предлагают много замечательных функций, которых вы не получаете с JSP или Facelets.

Одна из вещей, которые мне больше всего нравятся в MVC 1.0, это то, что на самом деле не имеет значения, какие технологии просмотра он поддерживает из коробки. Зачем? Потому что так легко интегрировать технологии произвольного представления с MVC. Ты мне не веришь? Хорошо, вот пример, чтобы убедить вас.

Создание пользовательского механизма просмотра

Одним из самых популярных шаблонизаторов для node.js является Jade . Подобно Haml в мире Ruby, он основан на идее использовать отступ для определения блоков, что в основном означает, что вам больше не нужно вручную закрывать элементы. Существует даже реализация языка Jade на языке Java, называемая jade4j . Итак, давайте рассмотрим необходимые шаги для использования jade4j в качестве технологии просмотра для вашего приложения на основе MVC 1.0.

Чтобы интегрировать шаблонизатор с MVC, вы должны реализовать интерфейс ViewEngine, который состоит только из двух методов. MVC 1.0 использует CDI для обнаружения всех реализаций механизма представления. Нет необходимости регистрировать реализацию где-либо. Просто добавьте @ApplicationScopedк своей реализации, и MVC найдет его.

Хорошо, давайте посмотрим на код:

@ApplicationScoped
public class JadeViewEngine implements ViewEngine {

  @Inject
  private ServletContext servletContext;

  @Override
  public boolean supports(String view) {
    return view.endsWith(".jade");
  }

  @Override
  public void processView(ViewEngineContext context) throws ViewEngineException {

    try {

      String viewName = "/WEB-INF/views/" + context.getView();
      URL template = servletContext.getResource(viewName);

      String html = Jade4J.render(template, context.getModels(), true);

      context.getResponse().getWriter().write(html);

    } catch (IOException e) {
      throw new IllegalStateException(e);
    }

  }

}

Это все! Все, что вам нужно для интеграции jade4j с MVC 1.0. Это не так много кода, не так ли? Конечно, этот код может быть (и должен быть) улучшен в отношении обработки ошибок, кэширования и так далее. Но это отличный пример, чтобы продемонстрировать основы.

supports()Метод используется реализацией MVC , чтобы найти двигатель вида , отвечающий за имя вида возвращаемого методом контроллера или с указанным @Viewаннотацией. В этом примере наш механизм просмотра обработает все представления с расширением файла .jade.

processView()Метод , где все происходит волшебство. Цель этого метода — визуализировать представление и записать результат в поток ответов. Все, что вам для этого нужно, доступно в ViewEngineContext. Приведенный выше код использует ServletContextшаблон Jade для загрузки из папки просмотра по умолчанию /WEB-INF/views. Jade4J предоставляет простые статические методы, которые вы можете использовать для оценки шаблонов. Все, что вам нужно, это шаблон и модель. После этого вы можете записать полученную HTML-страницу в выходной поток.

Использование движка вида

Теперь давайте проверим, работает ли движок вида должным образом. Сначала мы создадим простой контроллер, который использует API MVC 1.0 :

@Path("/hello")
public class HelloController {

  @Inject
  private Models models;

  @GET
  @Controller
  public String controller() {
    models.put("name", "Christian");
    return "hello.jade";
  }

}

Как видите, в этом контроллере нет ничего особенного. Это похоже на любой другой контроллер MVC 1.0. Разница лишь в том, что он возвращает имя представления hello.jadeвместо чего-то вроде hello.jsp. Теперь давайте посмотрим на соответствующий вид:

!!! 5
html
  head
    title Jade4J Demo
  body
    h1.
      Hello #{name}

Я думаю, это выглядит очень странно, если вы никогда раньше не видели что-то вроде Джейд или Хэмла . Это простая страница, которая отображает h1элемент, содержащий приветствие. Он использует EL-подобные выражения для ссылки на значения из модели. Если вы хотите узнать больше о Jade, взгляните на Jade Language Reference .

Итак, вы видите, что интеграция Jade работает нормально. И нам нужно было создать только один класс. Легко, не правда ли? 🙂

Вывод

Я надеюсь, что этот пример покажет вам, как легко интегрировать пользовательские технологии просмотра с MVC 1.0. Ozark , ссылка реализация MVC 1.0, уже предоставляет ряд дополнительных реализаций вида двигателя для шаблонных двигателей , как Thymeleaf , Freemarker , Velocity , рули и усы . Все они доступны от Maven Central .

Я надеюсь, вам понравился этот пост. Если вы хотите попробовать MVC 1.0, я рекомендую взглянуть на todo-mvc , это небольшой пример приложения, которое я создал, чтобы продемонстрировать, как выглядит типичное приложение, созданное с использованием MVC 1.0.

Повеселись!