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

Tha*_*ham 10 java jsf servlets jsf-2

这是我的commandLink工作方式

 <p:dataTable value="#{myBean.users}" var="item">
     <p:column>
         <h:commandLink value="#{item.name}" action="#{myBean.setSelectedUser(item)}" />     
     </p:column>
 </p:dataTable>
Run Code Online (Sandbox Code Playgroud)

然后在 myBean.java

 public String setSelectedUser(User user){
     this.selectedUser = user;
     return "Profile";
 }
Run Code Online (Sandbox Code Playgroud)

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

 <h:outputText value="{myBean.text(item.name,item.id)}" />
Run Code Online (Sandbox Code Playgroud)

那么text(String name, Long id)方法就回来了

"<a href=\"someURL?userId=\"" + id + ">" + name + "</a>"
Run Code Online (Sandbox Code Playgroud)

剩下的就是创建一个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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 19

JSF使用托管bean名称作为密钥将会话作用域托管bean存储为会话属性.所以以下内容应该有效(假设JSF在会话之前已经创建了bean):

MyBean myBean = (MyBean) request.getSession().getAttribute("myBean");
Run Code Online (Sandbox Code Playgroud)

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

<a href="profile.jsf?userId=123">
Run Code Online (Sandbox Code Playgroud)

与请求作用域中的以下内容相关联 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));
    // ...
}
Run Code Online (Sandbox Code Playgroud)