这是我在 index.xhtml
中使用的模板:
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title><ui:insert name="title">Default title</ui:insert></title>
<h:outputStylesheet library="default" name="css/style.css" />
</h:head>
<h:body>
<div id="wrapper" style="width: 800px; align: center">
<div id="header">
<div style="float: left">
<h:graphicImage library="default"
name="img/032-ivan-the-terrible-theredlist.jpg" />
</div>
<h:form id="loginForm" rendered="#{sessionScope.user == null}">
Username: <h:inputText id="username"
value="#{userController.user.username}" />
Password: <h:inputSecret id="password"
value="#{userController.user.password}" />
<h:commandButton value="Login" action="#{userController.login}" />
</h:form>
<h:commandButton value="Logout" action="#{userController.logout}"
rendered="#{sessionScope.user != null}" />
<h:outputLink target="register.xhtml"
rendered="#{sessionScope.user == null}">Register</h:outputLink>
<h:outputText rendered="#{sessionScope.user != null}"
value="You are logged in as #{sessionScope.user.username}" />
</div>
<div id="menu" style="clear: both">Menu</div>
<div id="content">
<ui:insert name="content">Default content</ui:insert>
</div>
<div id="footer">Footer</div>
</div>
</h:body>
</html>
这是用户控制器。注册并登录工作正常 - 但注销对我的生命不起作用。
@ManagedBean
@ViewScoped
public class UserController {
// http://stackoverflow.com/a/10691832/281545
private User user;
@EJB // do not inject stateful beans !
private UserService service;
public User getUser() {
return user;
}
@PostConstruct
void init() {
// http://stackoverflow.com/questions/3406555/why-use-postconstruct
user = new User();
}
public String login() {
FacesContext context = FacesContext.getCurrentInstance();
try {
System.out.println("Pass :" + user.getPassword());
user = service.find(user.getUsername(), user.getPassword());
context.getExternalContext().getSessionMap().put("user", user);
return "/index.xhtml?faces-redirect=true";
} catch (NoResultException e) {
context.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_ERROR, "Unknown login, please try again",
null));
return null;
}
}
public String register() {
FacesContext context = FacesContext.getCurrentInstance();
user = service.register(user);
if (user.getIduser() == 0) {
context.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_ERROR, "Registration failed", null));
return null;
}
context.getExternalContext().getSessionMap().put("user", user);
return "/index.xhtml?faces-redirect=true";
}
public String logout() {
FacesContext.getCurrentInstance().getExternalContext()
.invalidateSession();
return "/index.xhtml?faces-redirect=true";
}
}
因此,当登录按钮将我重定向到索引并显示我的登录名并将寄存器发送给我登录的索引作为新的注册用户,当我点击注销按钮时,我剩下的我盯着You are logged in as <username>
。应用程序中只有索引页面和注册页面
编辑:index.xhtml
:
<ui:composition template="/WEB-INF/xhtml/template.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<ui:define name="title">All Times Classics - Welcome</ui:define>
<ui:define name="content">
<h1 style="text-align: center">Welcome to All Times Classics</h1>
You can <a href="register.xhtml">Register</a> if you want to enjoy all
the goodies we have to offer.
</ui:define>
</ui:composition>
问题是您的<h:commandButton>
必须在<h:form>
内部才能工作。在这里检查:
<h:form id="loginForm" rendered="#{sessionScope.user == null}">
Username: <h:inputText id="username" value="#{userController.user.username}" />
Password: <h:inputSecret id="password" value="#{userController.user.password}" />
<h:commandButton value="Login" action="#{userController.login}" />
</h:form>
<!-- needs to be enclosed by <h:form> -->
<h:form>
<h:commandButton value="Logout" action="#{userController.logout}"
rendered="#{sessionScope.user != null}" />
</h:form>
您可以在此处检查说明:commandbutton/commandlink/ajax action/侦听器方法未调用或输入值未更新,原因1。