如何从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的字段中添加Inject和EJB注释。 有人喜欢这样:
@Inject private AppManagedBean appmanaged; @EJB private SessionBean sessbean;
记住,这些注释是Context和Dependecy Injection或CDI的一部分 ,因此,您必须添加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 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(""); 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和朋友 。