2010-08-09 237 views
0

我对我的facelets有个问题:JSF Facelets渲染问题

我收缩了一个导航部件,显示关于curren用户和注销按钮的登录信息。登录正常工作。但是在用户注销后,导航部分我的页面显示

Welcome, User (role) [Logout_Button] 

然而,我要的是,当你第一次发生在登录同样的事情

Welcome, Guest 

(谢谢你的那些简单单词的Java饮酒:-))

在这里你可以看到我的模板的一部分:

<div id="metaContainer"> 
     <ui:include src="/metaMenu.xhtml" /> 
    </div> 

这就是我的登录信息(称为metaMenu.xhtml)导航部分:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" lang="en" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core"> 
    <div id="login_info"> 
     <h:outputLabel value="Willkommen, "/> 
     <h:outputLabel class="principal" value="#{metaNavData.principal}"/> 
     <h:outputLabel value="#{metaNavData.role}"/> 
    </div> 
    <div id="meta_nav"> 
     <h:form name="loginform" rendered="#{authorisation.authenticated}"> 
     <h:commandLink action="#{loginController.logout}" rendered="#{authorisation.authenticated}"> 
     Logout</h:commandLink> 
     </h:form> 
    </div> 
</ui:composition> 

由于BalusC和Java酒徒认为这可能是一个Java的逻辑问题。我首先需要说的是,我使用Apache Shiro来解决安全问题。因此,这里是相关的Java代码:

我的LoginController包含注销方法:

@ManagedBean 
@SessionScoped //Mistake!!! That should be RequestScoped, see below 
public class LoginController { 

private Subject currentUser; // import org.apache.shiro.subject.*; 

public LoginController() { 
    currentUser = SecurityUtils.getSubject(); 
} 

public String logout() { 
    if (currentUser.isAuthenticated()) { 
    currentUser.logout(); 
    } 
    return "welcome.xhtml"; 
} 

而她,你可以看到我的支持豆“授权”,这是应该提供的信息可用于隐藏像loginbutton comonents:

@ManagedBean 
@RequestScoped 
public class Authorisation { 

    private Subject currentUser; 

    public Authorisation(){ 
     currentUser = SecurityUtils.getSubject(); 
    } 

    public boolean getAuthenticated(){ 
     return currentUser.isAuthenticated(); 
    } 
+1

我不知道我明白。你是说 ...部分在用户注销后不显示? – 2010-08-09 13:10:41

+0

对不起,我真的不知道这个问题。我认为你正在使用的“渲染”这个词含糊不清。你不是有条件地渲染代码示例的login_info div中的任何地方,但是你在问题描述中是这样说的。我认为你*实际上*意思是“显示值”或“返回值”,你说的“渲染”。这反过来不是渲染问题,而是模型/代码逻辑问题。 – BalusC 2010-08-09 16:44:52

+0

抱歉让人困惑的话。我的技术术语有时不是正确的。但我会改善! Thx阅读和帮助 – Sven 2010-08-10 06:46:50

回答

2

好了,从我的理解,你的问题是,用户注销后,也将导航你的页面的一部分显示

Welcome, User (role) [Logout_Button] 

然而,你想要的是,当你到达登陆第一次发生同样的事情:

Welcome, Guest 

的问题,我认为,是你的注销功能。无论出于何种原因,即使在注销后,#{authorisation.authenticated}正在返回true.其次,#{loginController.principal}仍包含先前登录的用户和他/她的角色的值。这些bean会话中的任何一个可能是作用域还是缓存值?

而且BalusC是正确(像往常一样)在您正在使用的词rendered这里不正确。按钮是有条件rendered.从我看到的唯一元素,在Welcome, User(role),VS Welcome, Guest仅基于loginController.

值。如果你可以张贴一些Java代码对那些豆类和登录/注销功能我们可以尝试以帮助进一步

+0

谢谢理解-.-我会编辑整篇文章并添加一些java逻辑:-) – Sven 2010-08-10 06:25:10

1

感谢对BalusC和Java的饮酒对你有所帮助,我发现我的愚蠢的错误:

是这些豆子会议的作用域 也许

这是错误的部分!我将SessionScoped用于我的控制器而不是RequestScoped。因此,这里是正确的控制器:

@ManagedBean 
@RequestScoped // Here was my mistake 
public class LoginController { 

private Subject currentUser; // import org.apache.shiro.subject.*; 

public LoginController() { 
    currentUser = SecurityUtils.getSubject(); 
} 

public String logout() { 
    if (currentUser.isAuthenticated()) { 
    currentUser.logout(); 
    } 
    return "welcome.xhtml"; 
} 

我发现约managedBeans的区别一个非常好的链接,应如何:-)作用域KLICk

也许这线程可以给出一些启示,初学java作为我也是;-)

+1

太棒了!很高兴我们可以提供帮助。 – 2010-08-10 12:18:28