You can add Inject and EJB annotations in servlet's fields if your are using a Java EE 6 Application Server like Glassfish v3. Some like this:
@Inject
private AppManagedBean appmanaged;
@EJB
private SessionBean sessbean;
Remeber, those annotations are part of Context and Dependecy Injection or CDI, so, you must add the beans.xml deployment descriptor.
But, if you can't use the CDI annotations, lookup for the BeanManager interface at java:comp/BeanManager and use it for access (only) managed beans (inside a managed bean you can inject session beans with @EJB annotation). Also remember to add the beans.xml deployment descriptor.
Utility class looking up for java:comp/BeanManager:
package mavenproject4;
import java.util.Set;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class ManagedBeans {
private static final BeanManager beanManager;
static {
try {
InitialContext ic = new InitialContext();
beanManager = (BeanManager) ic.lookup("java:comp/BeanManager");
} catch (NamingException ex) {
throw new IllegalStateException(ex);
}
}
private ManagedBeans() {
}
public static <T> T getBean(Class<T> clazz, String name) {
Set<Bean<?>> beans = beanManager.getBeans(name);
Bean<? extends Object> resolve = beanManager.resolve(beans);
CreationalContext<? extends Object> createCreationalContext = beanManager.createCreationalContext(resolve);
return (T) beanManager.getReference(resolve, clazz, createCreationalContext);
}
}
Usage of utility class in servlet's processRequest method or equivalent:
response.setContentType("text/html;charset=UTF-8");
AppManagedBean appmanaged = ManagedBeans.getBean(AppManagedBean.class, "app");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet BeanManager</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>" + appmanaged.getHelloWorld() + "</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
Example of managed bean with injected session bean:
package mavenproject4;
import java.io.Serializable;
import javax.annotation.ManagedBean;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
@ManagedBean
@ApplicationScoped
@Named("app")
public class AppManagedBean implements Serializable {
private int counter = 0;
@EJB
private SessionBean sessbean;
public AppManagedBean() {
}
public String getHelloWorld() {
counter++;
return "Hello World " + counter + " times from Pachuca, Hidalgo, Mexico!";
}
}
I don't know if the code in utility class is 100% correct, but works. Also the code doesn't check NullPointerException and friends.