0

可能我使用的表格不正确。这个想法是 detail.content 显示一些 HTML,这部分工作正常。该表单应该允许在右侧输入并显示多个(一对多的注释。

显示默认注释时,不会显示更多注释。如何将注释 bean 链接到详细信息 bean?我在想一个字符串“id”并将它从一个bean传递到另一个。

这类似于将参数从一个 view.xhtml 传递到另一个的想法,只是它都在一个页面上。我想让豆子与众不同。最终,我想用 EJB 来做这件事,所以想保持这个选项打开,同时还没有使用 EJB。

查看,detail.xhtml:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                template="./complexTemplate.xhtml"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:c="http://java.sun.com/jsp/jstl/core"
                xmlns:f="http://java.sun.com/jsf/core">
    <ui:define name="top">
        <h:form>
            <h:outputLink id="back" value="detail.xhtml">
                <f:metadata>
                    <f:viewParam name="id" value="#{detail.id}"  />
                </f:metadata>
                <f:param name="id" value="#{detail.back()}" />
                <h:outputText value="back" />
            </h:outputLink>
        </h:form>
        <h:form>
            <h:outputLink id="forward" value="detail.xhtml">
                <f:metadata>
                    <f:viewParam name="id" value="#{detail.id}"  />
                </f:metadata>
                <f:param name="id" value="#{detail.forward()}" />
                <h:outputText value="forward" />
            </h:outputLink>
        </h:form>
    </ui:define>
    <ui:define name="content">
        <h:outputText escape="false" value="#{detail.content}"></h:outputText>
    </ui:define>
    <ui:define name="right">
        <p>#{notes.note.id}</p>
        <p>#{notes.note.comment}</p>
        <h:form>
            <h:inputText value="#{notes.note.comment}" />
            <h:commandButton value="add note"
                             action="#{notes.commentAction()}"/>
        </h:form>
    </ui:define>
</ui:composition>

豆,Notes.java:

package net.bounceme.dur.nntp;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.context.Dependent;
import javax.inject.Named;

@Named
@Dependent
public class Notes {

    private static final long serialVersionUID = 1L;
    private static final Logger logger = Logger.getLogger(Notes.class.getName());
    private static final Level level = Level.INFO;
    private Note note = new Note();

    public Notes() {
        logger.log(level, "Notes..");
    }

    public Note getNote() {
        return note;
    }

    private void setNote(Note note) {
        this.note = note;
    }

    public void commentAction() {
        logger.log(level, "Notes.newNote..");        note.setId("messageIdGoesHere");
        note.setComment("hmmm");
    }
}

另一个 bean,Details,工作正常。但是,我不确定如何将两个 bean 集成到一个页面上,以便两个 bean 相互了解。

4

1 回答 1

4

使用@Inject.

@Named
public class Notes {

    @Inject
    private Detail detail;

}

它将在方法Notes之外的生命周期内在实例中可用@PostConstruct。反过来也可以。在您的特定情况下,父子关系并不完全清楚。


与具体问题无关,您有一些奇怪的视图标记。只有一个<f:metadata>在定义的顶部就足够了。此外,#{detail.back()}作为一个值表达式是奇怪的。您应该有一个getBack()方法并将其引用为#{detail.back}. 对于forward(). 此外,EJB 与这一切无关。您是否计划使用 EJB 与这个特定问题无关。我建议通过一本像样的书/教程来学习 JSF,而不是在不理解完整图片的情况下将一些松散的片段拼凑在一起。

于 2012-04-12T04:36:45.997 回答