参见英文答案 >
Get JSF managed bean by name in any Servlet related class6
这是我的commandLink如何工作
这是我的commandLink如何工作
<p:dataTable value="#{myBean.users}" var="item"> <p:column> <h:commandLink value="#{item.name}" action="#{myBean.setSelectedUser(item)}" /> </p:column> </p:dataTable>
然后在myBean.java中
public String setSelectedUser(User user){ this.selectedUser = user; return "Profile"; }
假设用户名是彼得.然后,如果我点击彼得,我将把selectedUser设置为彼得的用户对象,然后重定向到配置文件页面,该配置文件页面现在从selectedUser呈现信息.我只想使用< h:outputText> ;,创建相同的效果,所以GET请求被记住.所以我这样做
<h:outputText value="{myBean.text(item.name,item.id)}" />
那么文本(String name,Long id)方法只是返回
"<a href=\"someURL?userId=\"" + id + ">" + name + "</a>"
所有剩下的都是创建一个servlet,捕获该id,查询数据库以获取用户对象,设置为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来查询用户的数据库,然后访问managed bean将用户设置为selectedUser,然后重定向到profile.jsf?
解决方法
JSF将会话作用域管理的bean存储为会话属性,使用受管Bean名称作为关键字.所以下面的工作(假设JSF已经在会话中创建了之前):
MyBean myBean = (MyBean) request.getSession().getAttribute("myBean");
也就是说,我有一种感觉,你在解决方案方向错误.你也可以这样做:
<a href="profile.jsf?userId=123">
在与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)); // ... }