如何从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设置userselectedUser,然后重定向到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));
    // ...
}