如果您正在使用像Glassfish v3这样的Java EE 6应用服务器,那么可以在Servlet的字段中添加Inject和EJB注释。如下所示:
@Inject
private AppManagedBean appmanaged;
@EJB
private SessionBean sessbean;
请注意,这些注释是
上下文和依赖注入或
CDI的一部分,因此您必须添加
beans.xml部署描述符。
但是,如果您无法使用
CDI注释,请查找
BeanManager接口,位于
java:comp / BeanManager并将其用于访问(仅)
托管bean(在托管bean中,您可以使用
@EJB注释注入
会话bean)。还要记得添加
beans.xml部署描述符。
实用程序类查找
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);
}
}
在servlet的processRequest
方法或等效方法中使用实用程序类:
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();
}
具有注入的会话Bean的托管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!";
}
}
我不知道实用类中的代码是否100%正确,但是它能正常工作。此外,该代码没有检查NullPointerException等错误。
@ManagedProperty
和@PostConstruct
来应用和处理请求参数。 - BalusC欢迎,#{bean.sessionBean.user.name}
。 - BalusC