head 的内容在 body 中重复
Contents of head is repeated in body
我正在 Java EE 中使用 JSF 和 Primefaces. I'm also using Hibernate 作为 ORM 框架开发一个项目。在我看来,Primefaces 和 Hibernate 不会干扰,但我提到它是为了让您了解全貌。
我有一个 login 和一个 register 页面。两者都是 Facelets 模板客户端,您可以从第一个导航到第二个。注册页面链接到 2 个托管 Bean 的属性,并从第一个托管 Bean 调用方法。 MCVE 将是:
index.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<body>
<ui:composition template="./templates/mainTemplate.xhtml">
<ui:define name="top"></ui:define>
<ui:define name="content">
<h:form>
<h2>Login</h2>
<h:panelGrid columns="2">
<h:outputLabel for="user" value="User:" />
<p:inputText id="user"/>
<h:outputLabel for="password" value="Password:" />
<p:password id="password"/>
<!-- Still no connection to the Login's MB -->
<p:commandButton value="Login"/>
<!-- Go to register.xhtml -->
<p:commandButton value="Register" action="register"/>
</h:panelGrid>
</h:form>
</ui:define>
<ui:define name="bottom">bottom</ui:define>
</ui:composition>
</body>
</html>
register.xhtml
<!--ui:composition nested in html and body as in index.xhtml-->
<ui:composition template="./templates/mainTemplate.xhtml">
<ui:define name="top"></ui:define>
<ui:define name="content">
<h:form id="frmRegister">
<h:panelGrid columns="2">
<h:outputLabel for="name" value="Name:" />
<p:inputText id="name" label="Name" required="true" size="50"
value="#{personBean.person.name}"/>
<h:outputLabel for="birthdate" value="Date of birth:" />
<p:calendar id="birthdate"
label="Date of birth"
placeholder="dd/mm/aaaa"
required="true"
value="#{personBean.person.birthdate}"/>
<h:outputLabel for="password" value="Password(*):"/>
<p:password id="password" label="Password" required="true" size="30"
value="#{userBean.user.password}"/>
<h:outputLabel for="password-repeat" value="Repeat your password(*):"/>
<p:password id="password-repeat" label="Repeated password" required="true" size="30"
value="#{userBean.repeatPassword}"/>
<p:commandButton value="Register User" actionListener="#{personBean.addPerson()}"/>
<p:commandButton value="Back" action="index" />
</h:panelGrid>
</h:form>
</ui:define>
<ui:define name="bottom">bottom</ui:define>
</ui:composition>
mainTemplate.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<h:outputStylesheet name="./css/default.css"/>
<h:outputStylesheet name="./css/cssLayout.css"/>
<h:outputStylesheet name="./css/libs/bootstrap.min.css"/>
<h:outputStylesheet name="./css/libs/bootstrap-theme.min.css"/>
<title>Title</title>
</h:head>
<h:body>
<div id="top">
<ui:insert name="top">Top</ui:insert>
<h1>A Test</h1>
</div>
<div id="content" class="center_content">
<ui:insert name="content">Content</ui:insert>
</div>
<div id="bottom">
<ui:insert name="bottom">Bottom</ui:insert>
</div>
问题是,当我尝试加载页面时,我得到一个空白页面,而当我打开 Chrome 的开发人员工具时,我可以看到主体呈现的信息与头部呈现的信息相同.获取图片:
<head>
<link type="text/css" rel="stylesheet" href=".../theme.css?ln=primefaces-bootstrap">
...
<script type="text/javascript" src="...jquery.js?ln=primefaces&v=5.0"></script>
...
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>THE TITLE</title>
<link rel="icon" href="resources/img/favicon.ico">
</head>
<body>
<link type="text/css" rel="stylesheet" href=".../theme.css?ln=primefaces-bootstrap">
...
<script type="text/javascript" src="...jquery.js?ln=primefaces&v=5.0"></script>
...
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>THE TITLE</title>
<link rel="icon" href="resources/img/favicon.ico">
<div id="textarea_simulator" style="position: absolute; top: 0px; left: 0px; visibility: hidden;"></div>
</body>
并且控制台给我以下错误:
[Warning] Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check http://xhr.spec.whatwg.org/.
[Error] Uncaught TypeError: Cannot read property 'debug' of undefined
如您所见,除 <div id="textarea_simulator">
元素外,其他都是一样的。当我退出对 MB 的人员属性的引用时,页面工作正常(我的意思是删除 <p:inputText />
元素中的 value=#{}
)。
根据 the video tutorial suggested in the JSF wiki, and to the Java EE documentation(ch 8.4 使用 Facelets 模板,第 136 页),当您有一个 ui:composition
标签(这是一个 Facelets Template Client), 外面的一切都被忽略。因此,我尝试将 XML 命名空间定义放入 index
和 register
的此标记中,但结果是相同的。
我的托管Bean如下:
personBean.java
@ManagedBean
@RequestScoped
public class PersonBean {
@ManagedProperty("#{userBean}")
private UserBean userBean;
private Person person;
//Empty constructor, getter/setter
public void addPerson(){
//In a try/catch block: open connection, make query with prepared statement and commit
}
}
userBean.java
@ManagedBean
@RequestScoped
public class UserBean {
private User user;
private String repeatPassword;
//Constructor, getters and setters
}
最后,Person
和 User
是具有属性、getter 和 setter 的 POJO(没有构造函数)我是否遗漏了什么?我的错误是什么?
我正在使用 Netbeans 8.0.2 和 Glasfish Sever 4.1。非常感谢任何帮助。提前致谢。
备注
Glassfish 服务器给我以下消息:
SEVERE: JSF cannot create the managed bean personBean when it is required. Following errors have been found:
- The property userBean does not exists for the managed bean personBean
(我是从西班牙语翻译的,所以消息可能与你能得到的消息不同)。我将 @ManagedProperty("#{userBean}")
更改为 @ManagedProperty("#{UserBean}")
(大写),但结果是一样的。
知道了。而不是使用 @ManagedProperty
注释
import javax.faces.bean.ManagedProperty;
...
@ManagedProperty("#{userBean}")
private UserBean userBean;
我使用了 @Inject
注释
import javax.inject.Inject;
...
@Inject private UserBean userBean;
现在可以完美呈现。解决方案来自 The Java EE Tutorial, Release 7,第 23.7 章。- 注入 Beans,第 23.6 页 (400)。
我看到其他 tutorials/examples 使用 @ManagedProperty
并且工作正常,但由于某些原因在这里不起作用。事实上,我在提到的教程中进行了搜索,没有对 @ManagedProperty
的引用,但它记录在 Java EE API.
中
我刚刚在 this post
中找到了关于这个主题的非常好的讨论
我正在 Java EE 中使用 JSF 和 Primefaces. I'm also using Hibernate 作为 ORM 框架开发一个项目。在我看来,Primefaces 和 Hibernate 不会干扰,但我提到它是为了让您了解全貌。 我有一个 login 和一个 register 页面。两者都是 Facelets 模板客户端,您可以从第一个导航到第二个。注册页面链接到 2 个托管 Bean 的属性,并从第一个托管 Bean 调用方法。 MCVE 将是:
index.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<body>
<ui:composition template="./templates/mainTemplate.xhtml">
<ui:define name="top"></ui:define>
<ui:define name="content">
<h:form>
<h2>Login</h2>
<h:panelGrid columns="2">
<h:outputLabel for="user" value="User:" />
<p:inputText id="user"/>
<h:outputLabel for="password" value="Password:" />
<p:password id="password"/>
<!-- Still no connection to the Login's MB -->
<p:commandButton value="Login"/>
<!-- Go to register.xhtml -->
<p:commandButton value="Register" action="register"/>
</h:panelGrid>
</h:form>
</ui:define>
<ui:define name="bottom">bottom</ui:define>
</ui:composition>
</body>
</html>
register.xhtml
<!--ui:composition nested in html and body as in index.xhtml-->
<ui:composition template="./templates/mainTemplate.xhtml">
<ui:define name="top"></ui:define>
<ui:define name="content">
<h:form id="frmRegister">
<h:panelGrid columns="2">
<h:outputLabel for="name" value="Name:" />
<p:inputText id="name" label="Name" required="true" size="50"
value="#{personBean.person.name}"/>
<h:outputLabel for="birthdate" value="Date of birth:" />
<p:calendar id="birthdate"
label="Date of birth"
placeholder="dd/mm/aaaa"
required="true"
value="#{personBean.person.birthdate}"/>
<h:outputLabel for="password" value="Password(*):"/>
<p:password id="password" label="Password" required="true" size="30"
value="#{userBean.user.password}"/>
<h:outputLabel for="password-repeat" value="Repeat your password(*):"/>
<p:password id="password-repeat" label="Repeated password" required="true" size="30"
value="#{userBean.repeatPassword}"/>
<p:commandButton value="Register User" actionListener="#{personBean.addPerson()}"/>
<p:commandButton value="Back" action="index" />
</h:panelGrid>
</h:form>
</ui:define>
<ui:define name="bottom">bottom</ui:define>
</ui:composition>
mainTemplate.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<h:outputStylesheet name="./css/default.css"/>
<h:outputStylesheet name="./css/cssLayout.css"/>
<h:outputStylesheet name="./css/libs/bootstrap.min.css"/>
<h:outputStylesheet name="./css/libs/bootstrap-theme.min.css"/>
<title>Title</title>
</h:head>
<h:body>
<div id="top">
<ui:insert name="top">Top</ui:insert>
<h1>A Test</h1>
</div>
<div id="content" class="center_content">
<ui:insert name="content">Content</ui:insert>
</div>
<div id="bottom">
<ui:insert name="bottom">Bottom</ui:insert>
</div>
问题是,当我尝试加载页面时,我得到一个空白页面,而当我打开 Chrome 的开发人员工具时,我可以看到主体呈现的信息与头部呈现的信息相同.获取图片:
<head>
<link type="text/css" rel="stylesheet" href=".../theme.css?ln=primefaces-bootstrap">
...
<script type="text/javascript" src="...jquery.js?ln=primefaces&v=5.0"></script>
...
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>THE TITLE</title>
<link rel="icon" href="resources/img/favicon.ico">
</head>
<body>
<link type="text/css" rel="stylesheet" href=".../theme.css?ln=primefaces-bootstrap">
...
<script type="text/javascript" src="...jquery.js?ln=primefaces&v=5.0"></script>
...
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>THE TITLE</title>
<link rel="icon" href="resources/img/favicon.ico">
<div id="textarea_simulator" style="position: absolute; top: 0px; left: 0px; visibility: hidden;"></div>
</body>
并且控制台给我以下错误:
[Warning] Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check http://xhr.spec.whatwg.org/.
[Error] Uncaught TypeError: Cannot read property 'debug' of undefined
如您所见,除 <div id="textarea_simulator">
元素外,其他都是一样的。当我退出对 MB 的人员属性的引用时,页面工作正常(我的意思是删除 <p:inputText />
元素中的 value=#{}
)。
根据 the video tutorial suggested in the JSF wiki, and to the Java EE documentation(ch 8.4 使用 Facelets 模板,第 136 页),当您有一个 ui:composition
标签(这是一个 Facelets Template Client), 外面的一切都被忽略。因此,我尝试将 XML 命名空间定义放入 index
和 register
的此标记中,但结果是相同的。
我的托管Bean如下:
personBean.java
@ManagedBean
@RequestScoped
public class PersonBean {
@ManagedProperty("#{userBean}")
private UserBean userBean;
private Person person;
//Empty constructor, getter/setter
public void addPerson(){
//In a try/catch block: open connection, make query with prepared statement and commit
}
}
userBean.java
@ManagedBean
@RequestScoped
public class UserBean {
private User user;
private String repeatPassword;
//Constructor, getters and setters
}
最后,Person
和 User
是具有属性、getter 和 setter 的 POJO(没有构造函数)我是否遗漏了什么?我的错误是什么?
我正在使用 Netbeans 8.0.2 和 Glasfish Sever 4.1。非常感谢任何帮助。提前致谢。
备注
Glassfish 服务器给我以下消息:
SEVERE: JSF cannot create the managed bean personBean when it is required. Following errors have been found:
- The property userBean does not exists for the managed bean personBean
(我是从西班牙语翻译的,所以消息可能与你能得到的消息不同)。我将 @ManagedProperty("#{userBean}")
更改为 @ManagedProperty("#{UserBean}")
(大写),但结果是一样的。
知道了。而不是使用 @ManagedProperty
注释
import javax.faces.bean.ManagedProperty;
...
@ManagedProperty("#{userBean}")
private UserBean userBean;
我使用了 @Inject
注释
import javax.inject.Inject;
...
@Inject private UserBean userBean;
现在可以完美呈现。解决方案来自 The Java EE Tutorial, Release 7,第 23.7 章。- 注入 Beans,第 23.6 页 (400)。
我看到其他 tutorials/examples 使用 @ManagedProperty
并且工作正常,但由于某些原因在这里不起作用。事实上,我在提到的教程中进行了搜索,没有对 @ManagedProperty
的引用,但它记录在 Java EE API.
我刚刚在 this post
中找到了关于这个主题的非常好的讨论