我使用注释在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类没有正确绑定。
答案 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(没有这些信息,我们无法告诉您应该使用哪些注释)。