Мы в настоящее время добавляем некоторые новые опции к старому веб-приложению, которое использовало только JSP без любой платформы для передней стороны. Мы недавно добавили Spring, и мы хотели бы автосоединить наши бобы проводом в нашем измененном JSP, не переписывая все для использования SpringMVC, Struts2 или Tapestry5.
Мы используем автопроводное соединение типом, таким образом, это ведет для получения некоторого кода как это в JSP, ранее получая контекст веб-приложения (как "WAP"):
MyDao myDao = (MyDao) wap.getBeansOfType(MyDao.class).values().toArray()[0];
Мы хотели бы не использовать такой код, а скорее автоволшебно ввести наши бобы непосредственно в нашем JSPs, поскольку мы будем в бизнес-бобе с помощью @Autowired аннотацию.
На самом деле мы обращаемся к самым чистым способам ввести наши бобы в нашем JSPs. Что Вы используете?
Вы можете использовать Spring's ContextexPosinghttpservletRequest :
HTTPSERVEVLEPREQUEST DELATOR делает все весенние бобы в данном WebapplationContext Accessible AS. Запросить атрибуты, через ленивый Проверка как только атрибут получает доступен.
Это потребует кода вашего контроллера, чтобы обернуть оригинал httpservletRequest
в contextexposinghttpservledRequest
, а затем вперед , что на JSP. Он может либо выставлять конкретные названные фасоли, либо каждый боб в контексте.
Конечно, это просто сдвигает проблему от ваших JSP в код контроллера, но это возможно, более управляемая проблема.
Я сомневаюсь, что есть чистый способ вводить зависимости в JSP.
Я думаю, что чистое решение было бы начать рефактировать свой код, чтобы получить бизнес-логику из JSP, используя SpringMVC или одну из альтернатив, которые вы цитируете.
Начните с одного или нескольких минималистичных контроллеров, которые просто передают запрос к JSP с инъекционными бобами в качестве атрибутов; @ Ответ Skaffman дает один способ сделать это, или вы могли бы сделать это более избирательно. Затем постепенно мигрируют код из JSP и в контроллеры.
Вы не можете использовать @Autowired
напрямую, потому что и ваши jsps, и сервлеты создаются контейнером сервлетов. Таким образом, они не являются частью контекста Spring и, следовательно, их зависимости не внедряются.
Вы можете:
@Configurable
в ваших сервлетах (и добавьте javaagent, как описано в связанных документах) Другой способ - сделать сервлет частью текущего контекста вручную. Это возможно как в jsps, так и в сервлетах:
public void init() {
WebApplicationContext ctx = WebApplicationContextUtils
.getRequiredWebApplicationContext(getServletContext());
AutowireCapableBeanFactory bf = ctx.getAutowireCapableBeanFactory();
bf.autowireBean(this);
}
Это разрешит аннотированные зависимости @Autowired
.
Я не уверен, должны ли контейнеры сервлетов использовать только один экземпляр класса сервлета. Если нет, вам лучше поместить приведенный выше код в метод получения зависимости ( getDao ()
), и если свойство @Autowired
имеет значение null
(т.е. контейнером используется другой экземпляр класса сервлета) - выполните указанную выше операцию.
Тем не менее, действительно рассмотрите возможность использования веб-фреймворка (любого из перечисленных вами). Использовать логику в jsps совершенно неправильно, трудно поддерживать, трудно читать и т. Д.