Что самый чистый путь состоит в том, чтобы автосоединить Бобы Spring проводом в JSP?

Мы в настоящее время добавляем некоторые новые опции к старому веб-приложению, которое использовало только JSP без любой платформы для передней стороны. Мы недавно добавили Spring, и мы хотели бы автосоединить наши бобы проводом в нашем измененном JSP, не переписывая все для использования SpringMVC, Struts2 или Tapestry5.

Мы используем автопроводное соединение типом, таким образом, это ведет для получения некоторого кода как это в JSP, ранее получая контекст веб-приложения (как "WAP"):

MyDao myDao = (MyDao) wap.getBeansOfType(MyDao.class).values().toArray()[0];

Мы хотели бы не использовать такой код, а скорее автоволшебно ввести наши бобы непосредственно в нашем JSPs, поскольку мы будем в бизнес-бобе с помощью @Autowired аннотацию.

На самом деле мы обращаемся к самым чистым способам ввести наши бобы в нашем JSPs. Что Вы используете?

8
задан temsa 26 January 2010 в 11:48
поделиться

3 ответа

Вы можете использовать Spring's ContextexPosinghttpservletRequest :

HTTPSERVEVLEPREQUEST DELATOR делает все весенние бобы в данном WebapplationContext Accessible AS. Запросить атрибуты, через ленивый Проверка как только атрибут получает доступен.

Это потребует кода вашего контроллера, чтобы обернуть оригинал httpservletRequest в contextexposinghttpservledRequest , а затем вперед , что на JSP. Он может либо выставлять конкретные названные фасоли, либо каждый боб в контексте.

Конечно, это просто сдвигает проблему от ваших JSP в код контроллера, но это возможно, более управляемая проблема.

9
ответ дан 5 December 2019 в 06:37
поделиться

Я сомневаюсь, что есть чистый способ вводить зависимости в JSP.

Я думаю, что чистое решение было бы начать рефактировать свой код, чтобы получить бизнес-логику из JSP, используя SpringMVC или одну из альтернатив, которые вы цитируете.

Начните с одного или нескольких минималистичных контроллеров, которые просто передают запрос к JSP с инъекционными бобами в качестве атрибутов; @ Ответ Skaffman дает один способ сделать это, или вы могли бы сделать это более избирательно. Затем постепенно мигрируют код из JSP и в контроллеры.

4
ответ дан 5 December 2019 в 06:37
поделиться

Вы не можете использовать @Autowired напрямую, потому что и ваши jsps, и сервлеты создаются контейнером сервлетов. Таким образом, они не являются частью контекста Spring и, следовательно, их зависимости не внедряются.

Вы можете:

  1. переместить весь код в чистые сервлеты, а не в jsps - оставить только представление в jsps.
  2. используйте @Configurable в ваших сервлетах (и добавьте javaagent, как описано в связанных документах)

Другой способ - сделать сервлет частью текущего контекста вручную. Это возможно как в jsps, так и в сервлетах:

public void init() {
    WebApplicationContext ctx = WebApplicationContextUtils
         .getRequiredWebApplicationContext(getServletContext());

    AutowireCapableBeanFactory bf = ctx.getAutowireCapableBeanFactory();

    bf.autowireBean(this);
}

Это разрешит аннотированные зависимости @Autowired .

Я не уверен, должны ли контейнеры сервлетов использовать только один экземпляр класса сервлета. Если нет, вам лучше поместить приведенный выше код в метод получения зависимости ( getDao () ), и если свойство @Autowired имеет значение null (т.е. контейнером используется другой экземпляр класса сервлета) - выполните указанную выше операцию.


Тем не менее, действительно рассмотрите возможность использования веб-фреймворка (любого из перечисленных вами). Использовать логику в jsps совершенно неправильно, трудно поддерживать, трудно читать и т. Д.

7
ответ дан 5 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: