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&amp;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&amp;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 documentationch 8.4 使用 Facelets 模板,第 136 页),当您有一个 ui:composition 标签(这是一个 Facelets Template Client), 外面的一切都被忽略。因此,我尝试将 XML 命名空间定义放入 indexregister 的此标记中,但结果是相同的。

我的托管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
}

最后,PersonUser 是具有属性、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

中找到了关于这个主题的非常好的讨论