在JSF bean之间传递params以获得单个view.xhtml

时间:2012-04-12 03:57:22

标签: java jsf ejb cdi

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

显示默认音符时,不会显示更多音符。如何将note bean链接到detail bean?我正在考虑一个字符串“id”并将其从一个bean传递给另一个bean。

这类似于passing params from one view.xhtml to another的想法,除了它都在一页上。我想保持豆类清晰。最后,我想用EJB做这个,所以想要保持该选项的开放,而不是使用EJB。

view,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>

bean,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相互了解。

1 个答案:

答案 0 :(得分:4)

使用@Inject

@Named
public class Notes {

    @Inject
    private Detail detail;

}

Notes方法之后的@PostConstruct实例中,它将在<f:metadata>实例中可用。反过来也可以。在你的特定情况下,父子关系是什么并不完全清楚。


对具体问题

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