当前位置: 首页 > 面试题库 >

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

长孙永思
2023-03-14
问题内容

这是我的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));
    // ...
}


 类似资料:
  • 如何从Servlet访问JSF ViewScope托管bean? (假设所讨论的托管bean已经创建,但尚未销毁)

  • 问题内容: 假设我有一个实体类,汽车。 我的IDE使我可以从实体类自动生成会话bean,因此最终得到了CarFacade 我也可以生成JSF托管bean 我可以理解Entity类和其他Bean之间的有意义的区别,但是无状态会话Bean和托管Bean之间有什么区别?我读到无状态会话Bean用于实现在实体上运行的业务逻辑,而托管Bean用于通过在托管Bean上使用网页调用方法并进行托管Bean调用来与

  • 我有一些cdibean。以前,它们都是JSF管理的bean(从JSF管理的bean更改为CDI管理的bean)。 我像下面这样做是为了删除用户成功下在线订单后管理的一些会话范围的JSF。 以便在订单处理完成后将所有内容设置为默认值。这与在订单处理成功终止后不能注销用户的整个HTTP会话的销毁/无效无关。 与JSF托管bean不同,CDIBean通过一些CDI管理器实现(如Weld)存储到服务器内存

  • 我有一个使用servlet会话属性显示div的问题 我有一个“result.jsp”页面。在jsp中,我有一个“生成URL”链接、一个空的输入文本字段和一个“addThis”div。链接“生成URL”调用jquery ajax方法“utilComp()”,它调用一个设置会话属性“saveLink”、返回一个值并填充空文本字段的servlet。 如果属性会话“saveLink”为空(因为尚未单击生成

  • 我与一位同事讨论了单例会话bean中的并发管理。根据我的理解,在阅读了Oracle文档之后,如果您取消了注释,那么它默认为容器管理的并发。在文档中,它说明了以下关于容器管理的单例会话bean的内容: javax.ejb.Lock注释和javax.ejb.LockType类型用于指定单例业务方法或@Timeout方法的访问级别。 和 如果singleton类上不存在@Lock注释,则默认的锁类型@L

  • 我在解决如何正确处理JSF中会话的自动销毁方面遇到了困难。当然,此时,容器会使会话失效,从而也会在会话范围的bean上调用@PreDestroy方法。 在某些会话范围bean的预销毁中,我们正在注销一些侦听器,如下所示: 然而,getWS()方法实际上试图获取对另一个会话范围bean的引用,但失败了,如返回null。Ryan Lubke认为,后者似乎是正常的JSF行为: 我们遵守这里的规范。我不确