English 中文(简体)
每页刷新都调用会议范围管理豆类构建器
原标题:Session Scoped Managed Bean constructor being called on each page refresh
  • 时间:2012-05-27 19:22:03
  •  标签:
  • jsf

我正使用一个管理好的会话豆处理 Java EE 应用程序中的登录。 在我验证用户后, 用户对象将保存在本会话豆中。 然而, 在我刷新页面后, 会话豆值将不复存在 。

我调试了代码,结果显示会议范围管理的豆类的构建者在页面更新中再次被调用,因此用新用户初始化了用户对象。 我猜这不是正常行为,因为它应该保存在会场上,不是吗?

我正在张贴登录管理豆类的某些部分, 包括参数和登录方法。 基本上来说, 输入的 Email 和 输入的Password 用于登录格式上输入的数据。 如果认证成功, 登录的 Boolean 将变为真实, 用户对象中的登录将存储在选中的用户变量中 。

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class LoginController  implements Serializable {

@EJB
private LoginSessionBean loginSessionBean;
@EJB
private LecturerFacade lecturerFacade;

private Lecturer checkedUser;
private String enteredEmail;
private String enteredPassword;
private boolean loggedIn;





/** Creates a new instance of loginController */
public LoginController() {
   loggedIn = false;
   checkedUser = new Lecturer();
时 时
public String login(){
    RequestContext context = RequestContext.getCurrentInstance();
    FacesMessage msg = null;

    this.setCheckedUser(lecturerFacade.findLecturerByEmail(enteredEmail));

    if(loginSessionBean.checkPassword(checkedUser, enteredPassword))
    {
        loggedIn = true;
        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Welcome", checkedUser.getFirstName()+ " " + checkedUser.getLastName());



        FacesContext.getCurrentInstance().addMessage(null, msg);
        context.addCallbackParam("loggedIn", loggedIn);



    时 时
    return "Index";

我还在张贴上面管理的豆类所使用的两个EJB。讲师法卡德用输入的电子邮件检索用户对象,而登录SymondBean检查密码。

@Stateless
public class LecturerFacade extends AbstractFacade<Lecturer> {
@PersistenceContext(unitName = "EffectinetWebPU")
private EntityManager em;

Logger logger = Logger.getLogger("MyLog");
FileHandler fh;


protected EntityManager getEntityManager() {
    return em;
时 时

public LecturerFacade() {
    super(Lecturer.class);
时 时

public Lecturer findLecturerByEmail(String email) {
    try {
        return (Lecturer) this.getEntityManager().createQuery("SELECT l FROM Lecturer l WHERE l.email = :email").setParameter("email", email).getSingleResult();
    时 时 catch (NoResultException e) {
        System.err.println("Caught NOResultException: "+  e.getMessage());
        return null;
    时 时 catch (NonUniqueResultException e) {
        System.err.println("Caught NonUniqueResultException: "+  e.getMessage());
        return null;
    时 时 catch (IllegalStateException e) {
        System.err.println("Caught IllegalStateException: "+  e.getMessage());
        return null;
    时 时
时 时

_

@Stateless

public class LoginSessionBean {

// Add business logic below. (Right-click in editor and choose
// "Insert Code > Add Business Method")
@PersistenceContext(unitName = "EffectinetWebPU")
private EntityManager em;

protected EntityManager getEntityManager() {
    return em;
时 时

public void setEntityManager(EntityManager em) {
    this.em = em;
时 时



public boolean checkPassword(Lecturer user, final String enteredPassword) {
    if (user.getPassword().equals(enteredPassword)) {
        return true;
    时 时 else {
        return false;
    时 时
时 时

时 时

如果有人知道出了什么事 请告诉我

我用玻璃鱼3.1作为应用程序服务器,用头巾作为JSF图书馆。此外,我检查并进口了会话Scovered批注,从右包中而不是从 Javax. 企业...

最佳回答

你的问题就在这里:

<p:menuitem value="Logout" ... onclick="#{loginController.logout()}"/>

点击 < code> 时单击 属性应代表一个 < strong> JavaScript 处理器函数,当终端用户单击该元素时,该函数将在 Webbrowser 中执行。

onclick="alert( You have clicked this element! )"

on kick 属性也接受 ValueExpression , 这样您甚至可以让 JSF/EL 自动生成其值 :

onclick="#{bean.onclickFunction}"

public String getOnclickFunction() {
    return "alert( You have clicked this element! )";
}

因此, 当页面完成时, 全部 EL 都会被评估 。 在您的特殊情况下, 每次对 EL 进行评估时, 都会使用 < code>logout () 方法, 这样一来, 每次完成页面, 您就会重新取消会话!

您需要将其绑绑到一个属性上, 该属性需要 methodExpression , , 而在此特定情况下,

<p:menuitem value="Logout" ... action="#{loginController.logout()}"/>

要理解这一点,可以理解基本的 HTML 和 JavaScript 概念,并铭记JSF 最终会生成 HTML/CSS/JS。 以网页浏览器、右键和View Source 打开 JSF 页面,以了解它。

问题回答

今天我设法解决了这个问题。这是问题所在,虽然我无法解释为什么:

我在JSF图书馆里用Primeface 3.2作为首页3.2, 所以这是索引页的主菜单。

<h:form>
        <p:menubar >
            <p:menuitem id="registerLink" value="Register" rendered="#{!loginController.loggedIn}" onclick="registerDialog.show()" /> 

            <p:menuitem id="loginLink" value="Login" rendered="#{!loginController.loggedIn}" onclick="loginDialog.show()" />

            <p:submenu label="Units" rendered="true"> 
                <p:menuitem id="addNew" value="Add New" onclick="createUnitDialog.show()" />

                <p:menuitem id="myUnits" value="My Units" onclick="" />
            </p:submenu>        

            <p:menuitem id="results" value="Results/Statistics" rendered="#{loginController.loggedIn}" onclick=""/>

            <p:menuitem id="profile" value="My Profile" rendered="#{loginController.loggedIn}" onclick=""/>

            <p:menuitem id="logout" value="Logout" rendered="#{loginController.loggedIn}" onclick="#{loginController.logout()}"/>

        </p:menubar>
    </h:form>

设置了整个代码的断点后,我发现,每个页面的刷新都要求使用本应销毁管理过的豆的注销()方法。 我不知道为什么会发生这种情况,因为点击注销菜单项时应该叫它。

然而,在更改 onclick="\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

我查了普列面的文件 但没有任何解释





相关问题
JSF a4j:support with h:selectManyCheckbox

I m having trouble with a JSF selectManyCheckbox and A4J support. The purpose is to run some action when a checkbox is selected. This works perfectly in Firefox. Yet, when testing in any IE (ie6 / ie7 ...

Mojarra for JSF Encoding

Can anyone teach me how to use mojarra to encode my JSF files. I downloaded mojarra and expected some kind of jar but what i had downloaded was a folder of files i don t know what to do with

如何拦截要求终止?

在共同基金中,如果用户要求终止,就需要采取一些行动。 我需要某种拦截器,但我不知道如何这样做。 我需要帮助。 增 编

ICEFaces inputFile getting the file content without upload

Is there any way of just getting the content of the browsed file without any upload/file transfer operations? I currently use ICEFaces inputFile component but I do not need the default uploading ...

Weird behaviour of h:commandLink action (MethodExpression)

I have two JSPs where I am displaying some info from database in a h:dataTable. One of them is showing all the info, and one of them user specifically. I have showXML.jsp that shows the "XML" column ...

How to correctly use ResultSet with h:dataTable

The problem is, that after displaying the ResultSet with <h:dataTable>, the connection is left open. If I close it, it closes the ResultSet too. I m thinking about copying the ResultSet data ...