2015-11-29 2 views
1

Я знаю, что это плохая идея встроить бизнес-логику в ваши сервлеты, это принято делать на стороне сервера приложений. Иногда у вас есть много параметров в вашем запросе, и все они вам нужно отправить на классы, которые представляют вашу бизнес-логику. Как было бы лучше сделать это? (Я думал о JavaBeans, но они были предназначены для другого пурпуса.) Спасибо.Как отправить параметры запроса в бизнес-логику

+0

Если вы говорите JavaBeans, вы имеете в виду EJB? Потому что они на самом деле должны жить в бизнес-логике. – fvu

+0

Нет, я имею в виду JavaBeans. Я еще не изучал EJB. –

+0

Любой класс с нулевым конструктором arg, свойства которого доступны через getters и seters, сериализуемый, является JB. См. [Здесь] (http://stackoverflow.com/questions/3295496/what-is-a-javabean-exactly). Первоначально (назад, когда COM и SOM были ключевыми словами) бобы должны были стать краеугольным камнем структуры компонентов, в то время как их использование намного более общее. Поэтому не стесняйтесь использовать бобы, хотя я чувствую, что вы окажете себе одолжение, если параллельно вы начнете узнавать о EJB. Учебник Oracle JEE очень хорош, ИМО. – fvu

ответ

1

Вы должны разделить свою бизнес-логику на отдельный класс, который реализует интерфейс, и класс сервлета должен просто отвечать за десериализацию входного потока в какой-то объект запроса, передачу его в объект бизнес-логики, а затем сериализация ответа. Если вы добавите немного магии DI, то может оказаться довольно простым найти и построить правильную реализацию класса бизнес-логики для использования.

Пример

public interface TheBusiness { 
    MyBusinessResponse doProcess(MyBusinessRequest request); 
} 

public final class MyBusinessClass implements TheBusiness { 
    @Override 
    public MyBusinessResponse doProcess(MyBusinessRequest request) { 
     // all the complex logic goes here. 
     return response; 
    } 
} 

public class MyBusinessServlet extends HttpServlet { 
    private final TheBusiness theBusiness; 
    private final ObjectMapper objectMapper; 

    public MyBusinessServlet() { 
     theBusiness = // locate and construct implementation. 
     objectMapper = // Initialise Jackson deserialisation. 
    } 

    public void doGet(HttpServletRequest request, HttpServletResponse response) { 
     final MyBusinessRequest requestBody = objectMapper.readValue(
               request.getInputStream(), MyBusinessRequest.class); 
     final MyBusinessResponse responseBody = theBusiness.doProcess(requestBody); 
     objectMapper.writeValue(response.getOutputStream(), responseBody)); 
    } 
} 

Единственная сложная вещь здесь инстанцировании ваши MyBusinessClass. Существуют шаблоны для различных структур DI, которые могут помочь там. В основном они предполагают использование сервлета, предоставляемого инфраструктурой, для выполнения всех этих маршаллинга и развязывания для вас, и вам просто нужно закодировать бизнес-логику и соответствующим образом аннотировать класс. И Spring-MVC, и Джерси делают это. Важно то, что класс сервлета имеет дело со всем взаимодействием типа HTTP и с сериализацией, в то время как логика инкапсулирована в другое место за интерфейсом, поэтому каждый класс может быть хорошо протестирован изолированно.

Смежные вопросы