xhtml文件没有通过注释与bean绑定

时间:2014-11-12 07:53:41

标签: java eclipse jsf jboss

我使用注释在JSF 2.0中创建了一个简单的登录页面。我正在使用与JBOSS 6的eclipse。 Login.xhtml文件代码是

    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"      
      xmlns:h="http://java.sun.com/jsf/html">


<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Sign-In Page</title>
</h:head>
<h:body>
<h3>Sign In</h3>
<h:form>
<!--   Email id: <h:inputText value="#{loginBean.emailid}" id="emailid" size="20"></h:inputText>
<br />
Password: <h:inputSecret value="#{loginBean.password}" id="password"></h:inputSecret>-->

<h:commandButton value="signin" action="#{loginBean.dologin}" id="signin"></h:commandButton>
</h:form>
</h:body>
</html>

LoginBean.java代码是:

    package com;
import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.swing.JOptionPane;

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

@ManagedBean(name = "loginBean" , eager=true)
@SessionScoped

public class LoginBean implements Serializable {

    private static final long serialVersionUID = 7765876811740798583L;

private String emailid = "Madiha";
private String password = "madiha";


public void dologin()
{
    if (emailid.equals("Madiha") && password.equals("madiha")) {
        JOptionPane.showInputDialog("Eggs are not supposed to be green.");
        // System.out.print("You are logged IN");
    }

    FacesMessage msg = new FacesMessage("Login error!", "ERROR MSG");
    msg.setSeverity(FacesMessage.SEVERITY_ERROR);
    FacesContext.getCurrentInstance().addMessage(null, msg);

}

public String getEmailid() {
    return emailid;
}

public void setEmailid(String emailid) {
    this.emailid = emailid;
}

public String getPassword() {
    return password;
}

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

当我运行此login.xhtml时,它们仅显示标签,而无按钮或文本字段。 似乎Bean类没有正确绑定。

2 个答案:

答案 0 :(得分:1)

<强> 1。错误的JSF标记。标记名称是1)区分大小写的标记和2)您使用的标记属于另一个标记名称为h:的标记库,在xmlns属性中设置{{1}元素。您应该将html更改为f:inputtext,将h:inputText更改为f:inputSecret,将h:inputSecret更改为f:commandbutton

<强> 2。错误的bean属性定义。正如@ SJuan76所指出的,要使用属性h:commandButton,您应该在托管bean中定义公共方法#{bean.property}(区分大小写!)。

为了避免将来出现此类问题,您最好使用某些IDE(例如Netbeans IDE或Intellij IDEA)。 IDE具有出色的自动完成和验证功能,尤其适用于JavaEE标准库。

第3。您正在混合CDI和JSF依赖注入机制。将CDI的public String getProperty(){}@javax.inject.Named或JSF @javax.enterprise.context.SessionScoped@javax.faces.bean.ManagedBean一起使用。

<强> 4。错误@javax.faces.bean.SessionScoped h:CommandButton属性。 JSF规范(JSP标记文档/ h:/ Tag commandButton)说action属性:

  

表达式必须求值为不带参数的公共方法,并返回一个Object(调用toString()以获取逻辑结果),该对象将传递给此应用程序的NavigationHandler

即。 action不得无效。它应该返回,例如字符串结果,WEB-INF / faces-config.xml中存在导航规则或应导航到的视图名称。例如。如果dologin()返回dologin(),则用户将导航至success.xhtml;如果"success"返回dologin(),则用户将导航到failure.xhtml。

JSF的文档可在jcp.org上找到:JSF 2.2 spec

如果您想显示对话框而不是导航到不同的视图,则应在Login.xhtml中使用"failure"标记f:ajax来部分呈现视图。你不能在这里使用Swing的h:commandButton,因为客户端Swing与服务器端的JSF无关。

PS我建议下载JSF规范以供参考,例如,&#34; JavaServer Faces 2.0:完整参考&#34; (Ed Burns,Chris Schalk)。当然,使用像NetBeans或Intellij IDEA这样的IDE。它将提升您使用JSF的体验。

我的Login.xhtml有效:

JOptionPane

答案 1 :(得分:0)

我可以看到两个问题,我不确定是哪一个导致问题

首先:emailid getter / setter的名称是错误的。

您必须将getter / setter中属性的第一个字母大写,而不是

public String getemailid() {... }

应该是

public String getEmailid() {...}

奇怪的是,你正在为password财产做正确的事。

第二:您正在将@ManagedBean(通过JSF进行实例化)与@javax.enterprise.context.SessionScoped混合。较旧版本的JSF通过JSF使用实例化,您应该使用@javax.faces.bean.SessionScoped。较新的版本使用CDI,您应该使用@Named代替@ManagedBean

另外需要注意的是,在提问时通常值得说明您使用的是哪个版本的JSF / server / J2EE(没有这些信息,我们无法告诉您应该使用哪些注释)。