2010-06-10 5 views
1

Я использую IBM WebSphere в качестве контейнера сервлета. Мое приложение имеет несколько сервлетов и классы Java. Мое намерение - вызвать один из этих сервлетов непосредственно из класса Java. Проведя некоторые исследования, я понял, что для этого можно использовать интерфейс RequestDispatcher. Но необходимо передать объекты ServletRequest и ServletResponse в качестве аргументов метода forward(). Есть какой-то способ обойти это безопасно и «красиво»? Под «красиво» я хотел сказать, чтобы сохранить хорошие шаблоны программирования и дизайна.Можно вызвать сервлет из класса Java?

ответ

2

Это поможет получить дополнительную информацию о том, почему вы пытаетесь это сделать. Я предполагаю, что вы хотите вызвать часть бизнес-логики в сервлете. Это признак того, что приложение плохо спроектировано.

Вы знакомы с MVC architecture? Если ваш «модельный» код был слабо связан, вы могли бы вызвать его напрямую.

+0

В этом случае приложение действительно плохо спроектировано, что является причиной моей борьбы. Но я не могу реорганизовать бизнес-логику этого сервлета, по крайней мере, не сейчас. Сервлет, который должен быть вызван, был предоставлен другой компанией, чтобы предложить интерфейс к собственной системе устаревания. –

+0

Немного приличная IDE (Eclipse, Netbeans, IntelliJ и т. Д.) Может содержать код рефакторинга за несколько кликов. Вы были бы готовы раньше, чем время, необходимое для публикации этого вопроса, ожидая ответов и изобретая хак/обходной путь, который не будет работать. – BalusC

+0

Я полностью понимаю и согласен с вами. Но, к сожалению, есть некоторые политические проблемы, которые мешают мне делать какие-либо рефакторинг прямо сейчас. Я просто не хочу вызывать сервлет с помощью HTTP внутри одного приложения. –

5

Единственный способ сделать это приятно - отделить желаемую логику от сервлетов. Это требование является признаком того, что сервлеты слишком плотно связаны с логикой бизнес-кода домена, которая, по-видимому, должна использоваться также вне контекста web-приложения.

Refactor оригинального сервлет код в многоразовый класс Java (ов) и метод (ы) (который, в свою очередь, делает ничего из javax.servlet пакета не использовать), так что вы можете, наконец, импортировать и вызывать его из как класс сервлета и класс Java «простой ваниль».

2

Вы можете написать фильтр, в котором хранятся текущий запрос и ответ в статическом ThreadLocal, чтобы вы могли использовать их позже из одного запроса. Затем вы можете реализовать свой собственный статический метод forward, который использует их и отправляет на другую страницу.

Это как-то подход, применяемый в JSF, где FacesContext.getCurrentInstance может быть доступен в любое время.

Но я бы не квалифицировал это как элегантный дизайн. Скорее старайтесь следовать советам @BalusC и реорганизовать свою логику.

+0

Re: _'FacesContext.getCurrentInstance' можно получить в любое время._ - это потому, что 'FacesServlet' (или аналогичный контроллер) инициализирует его как переменную ThreadLocal перед вызовом жизненного цикла. Вы не получите тот же контекст Faces в другом потоке. – McDowell

+0

@McDowell Конечно. Именно это я описываю в первом разделе с фильтром и 'ThreadLocal'. Является ли мой ответ неясным? – ewernli

+0

нет, мой комментарий был глупым. Я, должно быть, взглянул на ваш ответ и пропустил откровенно очевидное. Я думаю, что я пытался объяснить ThreadLocal/FacesContext так много раз, что у меня есть автоматический ответ на эту тему. Извиняюсь! – McDowell