Pull to refresh

Comments 28

UFO just landed and posted this here
Больше похоже на небольшой рандомный кусок из какого-то руководства, чем на полезную статью.
При чем руководство это, судя по всему, немножно устаревшее
Дорогие начинающие Java-разработчики (и автор?), пользуясь случаем очень хочется сказать пару вещей. Во первых, не обращайте внимания на комментарии, некоторые люди легко забывают что сами когда-то продирались через дебри мутной и пугающей документации для сервлет контейнеров, чтобы понять что вообще там к чему. Во-вторых, не думайте сильно сервлетами и прочими низкоуровневыми абстракциями.

Первая реакция, которая возникает, когда пытаешься задеплоить Hello World в сервлет контейнер, даже следуя такому простому и понятному руководству, как в этой статье — это ужас. Особенно после простых, как бревно, Node.js, PHP, Python. И наверное возникает мысль «Зачем люди так делают?!». Так вот, в целом — не делают. Сейчас на уровне сервлетов пишут и мыслят только разработчики фреймворков, для обычных разработчиков знать и понимать их полезно, но возможно не в самую первую очередь.

Так вот, если вы смотрите на то, чтобы начать web-разработку на Java в 2017, я бы порекомендовал следующее:
1. Особо не погружайтесь в дебри JSP или сервлетов. Берите простой и понятный веб-фреймворк, типа Spark, Ninja, Jooby — там все очень удобно и понятно. Плюс современные и приличные движки для шаблонов, а не (кхм) JSP.

Вот пример на Spark:
import static spark.Spark.*;

public class HelloWorld {
    public static void main(String[] args) {
        get("/hello", (req, res) -> "Hello World");
    }
}


2. Не разбирайтесь (пока) в тонкостях сервлет-контейнеров и деплоя WAR, любой фреймворк даст embedded сервер, который запустится в командной строке

3. Даже не смотрите (пока) на сервера приложений и Java EE, там сразу слишком много новых концепций. Если хочется современного энтерпрайза — можно посмотреть на Spring, начиная с малого. Вопреки популярному заблуждению, он простой, легкий, и удобный для новичков — если брать Spring Boot.

Современная Java это все-таки не совсем ужас-ужас, вот эти все килобайты XML и JSP сейчас, к счастью, не нужны чтобы начать писать web-приложения.
P.S. Если все таки Spring — то есть супер вещь Spring Initializr, он может сгенерить (если выбрать Web зависимость) готовый и настроенный Maven / Gradle Спринг проект, в котором все сразу будет работать и который можно будет запустить из Idea или командной строки.
Огромное спасибо за наводку.

Не соглашусь. По опыту моего обучения:


  • Считаю, что осваивать web, особенно новичкам, следует с сервлетов. Самое примитивное CRUD приложение на сервлетах. Разобраться не так сложно. А если таки сложно-приглашаю на свою практику по Java.
    Spark, Ninja, Jooby — это все круто, модно и удобно но не для начинающих. Если вы напишите в резюме что работали с этими фреймворками и не сможете ответить на элементарный вопрос про сервлет на собеседовании шансов, что вас возьмут будет 0.

Некоторые вообще рекомендуют начинать изучение Java без IDE (я к ним не отношусь).
Для новичков самое основное- понимать, КАК внути все это работает. Я собеседовал людей, которые изучали Spring без знания основ (а сервлеты это основы). Ужастно. Николай Алименков задает новичкам на собеседовании вопросы, поверх чего реализован Hibernate. Если вы не ответите, что JBDC и не будете иметь про него представление- кому нужен такой разработчик?


  • Про JSP — с 2005 года я поработал более чем на 10 проектах. В 60% использовался JSP. Почему? Да потому что встроено в Tomcat (42% по статистике 2016 г) и на нем выводят что-то достаточно примитивное. Остальное делается в основном на js фреймворках. И еще потому что в основном проекты уже N-летней давности. И в 90% смысла переписывать JSP на чтото другое никакого. Далее — если вы знаете JSP, то например освоить Thymleaf или любой другой шаблонизатор будет легче. А сам JSP достаточно простой.


  • изучать Spring MVC можно только после того, как будете знать что такое сервлет. Тогда будет понятно что такое DispatcherServlet и паттерн Front Controller
    Как можно работать со спринг не зная HttpServletRequest и прочие 5 основных классов сервлетов? Как вы будете его хотя бы дебажить?


  • НЕ беритесь за Spring-Boot, пока не освоили Spring. Точнее не так: все зависит от ваших задач. Если вам надо быстро написать небольшое работающее приложение- отличный выбор. Но если вы хотите стать Java разработчиком, пройти собеседование, устроится на работу и использовать Boot на больших проектах- не ваш вариант. Для вас это будет черный ящик, полный магии.

Те еще раз- джуниорам нужно учить именно основы и то, что требуется в вакансиях. Проверить легко: на hh в поиске работы по ключевым словам, ограничив область поиска разработкой ПО.


Напоследок приведу цитату


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

Илон Маск

А как же вы в Spring страницы собираетесь делать без JSP?
А как одно зависит от другого?
Эм… Так ведь 2017 год на дворе.
Уж извините, не смог удержаться.
Вот бы кто про Spring написал и рассказал, что там к чему.
кто бы написал, как это всё на живую выкатывать.
да вот как раз разбираюсь в спринг. Я сумел поставить томкат, написал хелло ворлд первый. А теперь есть желание узнать как это всё ставится на живой сервер. Особенно где и как, в конфигурации убирается localhost:8080/имя_WAR/test имя_WAR. чтобы было не test.com/имя_WAR/test, а test.com/test
Зависит от проекта. Если это Spring без извращений — то это Spring MVC и там в пути war не будет, если задеплоить проект как root.war / root.jar. Если проект новый и там Spring Boot — то ничего деплоить не нужно, просто запустить полученный jar через java -jar . Boot предоставляет настенный и готовый к запуску embedded Tomcat.
В tomcat'e это сродни магии. На сколько помню, один из вариантов переименовать имя_WAR.war в ROOT.war.
Проще поставить nginx перед tomcat'ом и настроить в нем проксирование запросов на localhost:8080/имя_WAR/
А вот, кстати, Apache Server не подойдет вместо nginx? Я промудохался 2 дня, ничего особо не вышло, с этими бесконечными файлами конфигураций.
Давно не работал с apache, но вроде как mod_proxy должен подойти.
По поводу nginx: для такой задачи конфиг у него будет не очень большой. На хабре есть статья на эту тему.
В свое время я начал с того, что выкинул Томкат и взял embedded jetty — жизнь упростилась в разы, чего и вам желаю :)
UFO just landed and posted this here
UFO just landed and posted this here
Спасибо, годные посты. Но все же хочется найти обзорную лекцию про спринг, он все таки огромный и что там за что отвечает разобраться трудно.

Если уж есть желание работать с сервлетами на Java, то советую изучить аннотации из последних спецификаций. Конфигурация и деплоймент значительно упростятся (например, не нужно вручную мапить сервлеты в web.xml).

Вброшу, так сказать, свои пару слов:
1. Начиная с servlet-api 3.0, файл web.xml стал необязательным и указание сервлетов, фильтров, слушателей осуществляется соответствующими аннотациями — WebServlet, WebFilter, WebListener и т.д.
2. Если нужно определить синонимы урлов страниц (aka чистые ссылки), то это стоит выделить в отдельный сервлет или вовсе переложить обязанность на фронтенд веб-сервер (например, nginx).
3. По поводу выкладки на сервер. На продуктивной среде автодеплой war-ников в целях безопасности обычно выключают, в server.xml прописываем свои приложения, а выкладку делаем руками или шелл-скриптами. Для тестовой (часто обновляемой) среды можно использовать CI систему.
В интересное время живём: статья про «Создание сервлетов для чайников» вполне может оказаться не для начинающих, а про интернет вещей.
Допустим, мы где-то взяли Maven и знаем, как работает Maven, HTTP и что такое аспектно-ориентированное программирование.
Когда пишете простой мануал на систему из огромных кусков, хотя бы подготовьте ссылки на тот же Хабр, где почитать об остальных кусках, необходимых для понимания искомого. Или сразу предупреждайте, каким уровнем знаний должен обладать читатель вашей статьи.
Sign up to leave a comment.

Articles