2008-09-26 4 views

ответ

1

Я думаю, что вы хотите Seam, это позволяет для ссылки на компонент по имени. Однако выпущенная версия основана на JSF, но это меняется.

0

просто наткнулся на ваш вопрос, потому что я планирую сделать то же самое. Фактически вы можете использовать Spring и его @Configurable аннотацию (с использованием времени загрузки AspectJ или созревания во время компиляции) для внедрения сервисов в ваши реализации тегов. Для подробного объяснения всех вариантов взгляните на сообщение блога Рамниваса here.

Надежда, чтобы помочь в случае, если вы все еще нужно решение ...

0

Держите ссылку на ваш инжектор на ServletContext, а затем использовать в каждом теге, как вам нужно. См

В вашей установке Guice:

public class GuiceServletConfig extends GuiceServletContextListener { 

@Override 
protected Injector getInjector() { 
    return Guice.createInjector(blah, blah); 
} 

@Override 
public void contextDestroyed(ServletContextEvent servletContextEvent) { 
    ServletContext servletContext = servletContextEvent.getServletContext(); 
    servletContext.removeAttribute(Injector.class.getName()); 
    super.contextDestroyed(servletContextEvent); 
} 

@Override 
public void contextInitialized(ServletContextEvent servletContextEvent) { 
    Injector injector = getInjector(); 
    ServletContext servletContext = servletContextEvent.getServletContext(); 
    servletContext.setAttribute(Injector.class.getName(), injector); 
    super.contextInitialized(servletContextEvent); 
} 

}

, а затем в вашем TagLib:

@Singleton 
@SuppressWarnings("serial") 
public class MySampleTag extends TagSupport { 
@Inject private MyInjectedService myService; 

@Override 
public int doStartTag() throws JspException { 
    Injector injector = (Injector) pageContext.getServletContext().getAttribute(Injector.class.getName()); 
    injector.injectMembers(this); 

    String value = myService.doSomething(); 
      etc. 
      etc.