如何从Servlet访问托管bean和会话bean
问题内容:
这是我的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";
}
假设用户名是Peter
。然后,如果单击Peter
,将设置selectedUser
为Peter的用户对象,然后重定向到配置文件页面,该页面现在从中呈现信息selectedUser
。我只想使用创建相同的效果<h:outputText>
,因此想到了GET请求。所以我这样做
<h:outputText value="{myBean.text(item.name,item.id)}" />
然后该text(String name, Long id)
方法就返回
"<a href=\"someURL?userId=\"" + id + ">" + name + "</a>"
剩下的就是创建一个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");
就是说,我觉得您在寻找错误的解决方案。您也可以按照以下步骤操作:
<a href="profile.jsf?userId=123">
与以下内容关联的请求范围的Bean中 profile.jsf
@ManagedProperty(value="#{param.userId}")
private Long userId;
@ManagedProperty(value="#{sessionBean}")
private SessionBean sessionBean;
@PostConstruct
public void init() {
sessionBean.setUser(em.find(User.class, userId));
// ...
}