gpt4 book ai didi

java - JSF 页面以重定向循环结束

转载 作者:行者123 更新时间:2023-11-30 04:48:40 27 4
gpt4 key购买 nike

我的浏览器总是返回重定向循环,我不知道为什么,看起来当我访问 login.html 时,它正在调用我的一些方法。

这是login.html 文件:

<ui:composition
template="/templates/master.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<ui:define name="body">

<div class="container-fluid">
<div class="row-fluid">
<div class="span12">
<h:form class="form-horizontal">
<fieldset>
<legend>Bem vindo a Sergio's</legend>
<br/>
<p>Preencha os campos abaixo para entrar no sistema.</p>
<div class="control-group">
<label class="control-label" for="user">Usuário</label>
<div class="controls">
<h:inputText required="true" id="user" value="#{loginController.username}" class="input-medium" />
<h:message for="user" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="password">Senha</label>
<div class="controls">
<h:inputSecret required="true" id="password" value="#{loginController.password}" class="input-medium"/>
<h:message for="password" />
</div>
</div>
<div class="form-actions">
<h:commandButton action="#{loginController.login()}" class="btn btn-primary" value="Entrar"/>
</div>
</fieldset>
</h:form>
<h:messages/>
</div>
</div>
</div>

</ui:define>
</ui:composition>

这是 LoginController:

package com.erp3.gui.controllers;

import java.io.IOException;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

@ManagedBean
public class LoginController {

public Boolean isLoggedIn = false;
private String username;
private String password;
private FacesMessage facesMessage;
public ExternalContext externalContent;

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public Boolean getIsLoggedIn() {
return isLoggedIn;
}

public void setIsLoggedIn(Boolean isLoggedIn) {
this.isLoggedIn = isLoggedIn;
}

public void login() throws IOException {
if (this.getUsername().equals("daniel") && this.getPassword().equals("123")) {
this.isLoggedIn = true;
externalContent = FacesContext.getCurrentInstance().getExternalContext();
externalContent.getSessionMap().put("loginController", this);
externalContent.redirect(externalContent.getRequestContextPath() + "/views/home.html");
} else {
this.isLoggedIn = false;
facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Usuário ou senha inválida.", username);
FacesContext.getCurrentInstance().addMessage(null, facesMessage);
externalContent.redirect(externalContent.getRequestContextPath() + "/views/login.htm");
}
}

public void logOut() throws IOException {
externalContent = FacesContext.getCurrentInstance().getExternalContext();
externalContent.getSessionMap().remove("loginController");
externalContent.redirect(externalContent.getRequestContextPath() + "/views/login.html");
}

}

我有一个 master.html,它是我的模板,它正在调用包含以下内容的 top.html:

<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container-fluid">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="#">Project name</a>
<div class="btn-group pull-right">
<a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
<i class="icon-user"></i>
<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li><a href="#">Conta</a></li>
<li class="divider"></li>
<li><a href="#{loginController.logout}">Sair</a></li>
</ul>
</div>
<div class="nav-collapse">
<ul class="nav">
<li class="active"><a href="#">Home</a></li>
<li><a href="#about">About</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</div>
</div>
</div>
</div>
</ui:composition>

最佳答案

模板文本中的 EL 表达式在渲染响应期间立即计算并被视为值表达式。 IE。它们的返回值作为 HTML 输出的一部分被打印。 “Plain vanilla”HTML 也是模板文本。所以如下

<li><a href="#{loginController.logOut()}">Sair</a></li>

基本上会调用该方法,将其返回值打印为 href渲染响应期间的 URL。生成的 HTML 如下:

<li><a href="">Sair</a></li>

(是的, href 为空,因为您实际上返回了 void 而不是有效的 String)

但是在该方法中,您告诉 JSF 重定向到登录页面,因此它最终会陷入无限循环。

这不是你真正想要的。您打算将其作为支持 bean 操作方法来调用。您应该使用完整的 JSF UICommand组件,例如 <h:commandLink> .

<li><h:form><h:commandLink value="Sair" action="#{loginController.logOut()}" /></h:form></li>

这样您还可以更改您的 logOut()返回完整导航结果的方法:

public String logOut() {
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
return "/views/login.html?faces-redirect=true";
}

ExternalContext#redirect()应该仅在您想要重定向到非 JSF URL 或实际上不在操作方法内时使用。

关于java - JSF 页面以重定向循环结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10339228/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com