...

четверг, 24 апреля 2014 г.

Строим веб-приложение на Java без JEE и Spring


Данная статья будет интересна тем, кто вдруг осознал, что ему хочется

попробовать создать что-то без навязанного обществом JEE и Spring.


Вы, о дорогой Java Смельчак, не хотите быть винтиком в огромном механизме вашего Фреймворка?

Вам надоело чувствовать себя «машинисткой» по написанию конфигов и настроек?

Вы хотите решать задачи так, как хочется вам, а не так, как это видится автору унифицированной на нужды

миллионов библиотеки?


Тогда добро пожаловать под кат, где я поделюсь с вами полезными находками Мира без Фреймворка.


Все дело в Контейнере

Как вы помните JEE или Spring (далее просто Фреймворк) завлекает прежде всего

возможностью Контейнера в котором будут жить ваши небольшие компоненты и сервисы.

Но ведь мы можем создать его сами.


Это просто.

Создаем Контекст через который доступно все, что нужно для работы:



public class Context {

public final DAO dao;
public final MailService mails;
public final AsyncService async;

public App root;

public Context(
DAO dao,
MailService mails,
AsyncService async) {
this.dao = dao;
this.mails = mails;
this.async = async;
}

}


Создаем Контейнер, в котором будут жить все наши Сервисы:



public class App {

public final SecurityService security;
public final CommentService comments;
public final UserService users;

public App(Context c) {

c.root = this;

this.security = new SecurityService(c);
this.users = new UserService(c);
this.comments = new CommentService(c);

}
}


В Сервисах у нас находятся бизнес-методы.

Через Контекст они смогут получить доступ к нужным ресурсам (как БД или другие Сервисы).


Пример:



class CommentService {

DAO dao;
MailService mails;
UserService users;

public CommentService(Context c){
dao = c.dao;
mails = c.mails;
users = c.root.users;
}

public Result getComments(Req req){

List comments = dao.getComments(req);
User user = users.getCurUser();
mails.sendMail();

}

}


Осталось только создать один экземпляр Контейнера на всё веб-приложение:



public class SingleApp {

private static App app;

public static synchronized App get() {

if(app != null) return app;

//создаем контекст
Context c = new Context();
...
//создаем контейнер
app = new App(c);

return app;
}

}


И использовать Сервисы из Контейнера в своей работе:



@WebServlet("/comments")
public class GetCommentsServlet extends HttpServlet {

CommentService comments;

public void init() {
App app = SingleApp.get();
comments = app.comments;
}

protected void doGet(HttpServletRequest req, HttpServletResponse resp) {

List result = comments.getComments(...);

req.setAttribute("comments", result);
req.getRequestDispatcher("/WEB-INF/jsp/comments.jsp").forward(req, resp);
}
}


Итог



Двумя-тремя простейшими классами нам удалось создать себе условия для комфортной работы без Фреймворка.

Нам не понадобилось 5 мегабайт библиотек, наше решение стартует максимально быстро (т.к. в нем есть только то,

что нужно именно нам), его легко запустить в юнит тестах.

Но главное: мы видим весь цикл работы приложения и можем его менять как нам вздумается.

На примере данного подхода я создал вот этот небольшой веб-сервис. И остался доволен результатами.

Там нет JEE, там нет Spring. Но там есть всё, что мне нужно. :)


Если данная тематика зацепит читателей, то я с удовольствием продолжу знакомить вас с миром вне Фреймворка.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий