如何从Servlet访问托管bean和会话bean

这是我的commandLink工作方式

  

然后在myBean.java

  public String setSelectedUser(User user){ this.selectedUser = user; return "Profile"; } 

假设用户名是Peter 。 然后,如果我点击Peter ,我会将selectedUser设置为Peter的用户对象,然后重定向到配置文件页面,该页面现在从selectedUser呈现信息。 我想仅使用创建相同的效果,因此我想到了GET请求。 所以我这样做

   

然后text(String name, Long id)方法才返回

 "" + name + "" 

剩下的就是创建一个servlet,捕获该id ,查询数据库以获取user对象,设置为selectedUser ,重定向。 所以这是我的servlet

 public class myServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Long userId = Long.parseLong(request.getParameter("userId")); } } 

现在我有了id ,如何访问我的会话bean来为user查询数据库,然后访问托管bean以将user设置为selectedUser ,然后重定向到profile.jsf

JSF使用托管bean名称作为密钥将会话范围的托管bean存储为会话属性。 所以下面应该工作(假设JSF已经在会话之前创建了bean):

 MyBean myBean = (MyBean) request.getSession().getAttribute("myBean"); 

也就是说,我觉得你正在寻找解决方案的错误方向。 你也可以这样做:

  

在与profile.jsf关联的请求范围bean中具有以下内容

 @ManagedProperty(value="#{param.userId}") private Long userId; @ManagedProperty(value="#{sessionBean}") private SessionBean sessionBean; @PostConstruct public void init() { sessionBean.setUser(em.find(User.class, userId)); // ... } 

如果您正在使用像Glassfish v3这样的Java EE 6应用程序服务器,则可以在servlet的字段中添加InjectEJB注释。 有人喜欢这样:

 @Inject private AppManagedBean appmanaged; @EJB private SessionBean sessbean; 

记住,这些注释是Context和Dependecy InjectionCDI的一部分 ,因此,您必须添加beans.xml部署描述符。

但是,如果您不能使用CDI注释,请在java:comp / BeanManager中查找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 getBean(Class clazz, String name) { Set> beans = beanManager.getBeans(name); Bean resolve = beanManager.resolve(beans); CreationalContext 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(""); out.println(""); out.println("Servlet BeanManager"); out.println(""); out.println(""); out.println("

" + appmanaged.getHelloWorld() + "

"); out.println(""); out.println(""); } 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和朋友