Model view controller 使用侦听器在CDI中导航

Model view controller 使用侦听器在CDI中导航,model-view-controller,jsf,navigation,el,cdi,Model View Controller,Jsf,Navigation,El,Cdi,引用,h:outputText是否需要在此处使用?我应该使用f:setPropertyActionListener而不是f:actionListener 单击id 2564会在日志末尾显示: INFO: SingletonNNTP..only once... INFO: NNTP.loadMessages... INFO: SingletonNNTP.connect.. INFO: SingletonNNTP.setIndex..2,562 INFO: SingletonNNTP.page..2

引用,h:outputText是否需要在此处使用?我应该使用
f:setPropertyActionListener
而不是
f:actionListener

单击id 2564会在日志末尾显示:

INFO: SingletonNNTP..only once...
INFO: NNTP.loadMessages...
INFO: SingletonNNTP.connect..
INFO: SingletonNNTP.setIndex..2,562
INFO: SingletonNNTP.page..2,572
INFO: SingletonNNTP.setIndex..2,562
INFO: Initializing Mojarra 2.1.6 (SNAPSHOT 20111206) for context '/NNTPjsf'
INFO: WEB0671: Loading application [NNTPjsf] at [/NNTPjsf]
INFO: NNTPjsf was successfully deployed in 7,612 milliseconds.
INFO: Messages..
INFO: Messages..
INFO: MessageBean..
INFO: Messages.postConstruct..
INFO: SingletonNNTP..only once...
INFO: NNTP.loadMessages...
INFO: SingletonNNTP.connect..
INFO: SingletonNNTP.setIndex..2,562
INFO: SingletonNNTP.page..2,572
INFO: SingletonNNTP.setIndex..2,562
INFO: SingletonNNTP.getMessages..
INFO: Messages.getModel..
INFO: Messages.getModel..
INFO: Messages.getModel..
INFO: Messages..
INFO: Messages.postConstruct..
INFO: SingletonNNTP.getMessages..
INFO: Messages.getModel..
INFO: Messages.getModel..
INFO: Messages.getModel..
INFO: Messages.getModel..
INFO: Messages.getModel..
INFO: Messages.getModel..
INFO: Messages.getModel..
INFO: Messages.getModel..
INFO: Messages.getModel..
INFO: Messages.getModel..
INFO: MessageListener.processAction..
INFO: ..MessageListener.processAction
INFO: MessageBean..
INFO: MessageBean.postConstruct..
INFO: SingletonNNTP.setIndex..0
INFO: SingletonNNTP.getMessage..
INFO: MessageBean.setMessage..2564
INFO: MessageBean.setId..2564
INFO: MessageBean.getId..2564
INFO: MessageBean.setPrevious..2563
INFO: MessageBean.getId..2564
INFO: MessageBean.setNext..2565
INFO: MessageBean.setUrl..
INFO: MessageBean.setMessage..2556
INFO: Messages.getModel..
INFO: Messages.getModel..
INFO: Messages.getModel..
但是,它从不从client.xhtml导航到message.xhtml

目前还不清楚MessageListener.processAction()在这里应该扮演什么角色,也不清楚它具体会产生什么影响

client.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="./template.xhtml"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:c="http://java.sun.com/jsp/jstl/core"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:f="http://java.sun.com/jsf/core">


    <ui:define name="top">
        <div style="float: left">
            <h:form>
                <h:commandLink action="#{messages.back()}">
                    <f:actionListener type="net.bounceme.dur.listeners.BackListener" />
                    <h:outputText value="..back"/>
                </h:commandLink>
            </h:form>
        </div>
        <div style="float: right">
            <h:form>
                <h:commandLink action="#{messages.forward()}">
                    <f:actionListener type="net.bounceme.dur.listeners.ForwardListener" />
                    <h:outputText value="..forward"/>
                </h:commandLink>
            </h:form>
        </div>
    </ui:define>
    <ui:define name="content">
        <h:dataTable value="#{messages.model}" var="m">
            <h:column>
                <f:facet name="id">
                    <h:outputText value="id" />
                </f:facet>
                <h:form>
                    <h:commandLink id="messageLink" action="#{messageBean.setMessage(m)}">
                        <f:actionListener type="net.bounceme.dur.listeners.MessageListener" />
                        <h:outputText value="#{m.messageNumber}"/>
                    </h:commandLink>
                </h:form>
            </h:column>
            <h:column>
                <f:facet name="subject">
                    <h:outputText value="subject" />
                </f:facet>
                <h:outputText value="#{m.subject}"></h:outputText>
            </h:column>
            <h:column>
                <f:facet name="date">
                    <h:outputText value="date" />
                </f:facet>
                <h:outputText value="#{m.sentDate}"></h:outputText>
            </h:column>
        </h:dataTable>
    </ui:define>
</ui:composition>

Messages.java:

package net.bounceme.dur.beans;

import java.io.Serializable;
import java.net.URL;
import java.util.List;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ConversationScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.inject.Inject;
import javax.inject.Named;
import javax.mail.Message;
import net.bounceme.dur.nntp.SingletonNNTP;

@Named
@ConversationScoped
public class Messages implements Serializable {

    private static final long serialVersionUID = 1L;
    private static final Logger LOG = Logger.getLogger(Messages.class.getName());
    private DataModel messagesDataModel = null;
    private List<Message> messages = null;
    @Inject
    private MessageBean messageBean;

    @PostConstruct
    public void postConstruct() throws Exception {
        LOG.info("Messages.postConstruct..");
        SingletonNNTP nntp = SingletonNNTP.INSTANCE;
        boolean debugNNTP = false;
        messages = nntp.getMessages(debugNNTP);
        messagesDataModel = new ListDataModel(messages);
    }

    public Messages() {
        LOG.info("Messages..");
    }

    public DataModel getModel() throws Exception {
        LOG.info("Messages.getModel..");
        return messagesDataModel;
    }

    public void forward() throws Exception {
        LOG.info("Messages.forward..");

    }

    public void back() throws Exception {
        LOG.info("Messages.back..");
    }

    public MessageBean getMessageBean() {
        return messageBean;
    }

    public void setMessageBean(MessageBean messageBean) {
        this.messageBean = messageBean;
    }

    public void insert(Message message) {
        LOG.info("Messages.insert..");
    }
}
package net.bounceme.dur.beans;
导入java.io.Serializable;
导入java.net.URL;
导入java.util.List;
导入java.util.logging.Logger;
导入javax.annotation.PostConstruct;
导入javax.enterprise.context.ConversationScope;
导入javax.faces.model.DataModel;
导入javax.faces.model.ListDataModel;
导入javax.inject.inject;
导入javax.inject.Named;
导入javax.mail.Message;
导入net.bounceme.dur.nntp.singletonntp;
@命名
@会话范围
公共类消息实现可序列化{
私有静态最终长serialVersionUID=1L;
私有静态最终记录器LOG=Logger.getLogger(Messages.class.getName());
私有数据模型messagesDataModel=null;
私有列表消息=null;
@注入
私有消息bean消息bean;
@施工后
public void postConstruct()引发异常{
LOG.info(“Messages.postConstruct.”);
singletonntp nntp=singletonntp.INSTANCE;
布尔debugNNTP=false;
messages=nntp.getMessages(debugNNTP);
messagesDataModel=新的ListDataModel(消息);
}
公共信息(){
LOG.info(“消息…”);
}
公共数据模型getModel()引发异常{
LOG.info(“Messages.getModel..”;
返回消息sdatamodel;
}
public void forward()引发异常{
LOG.info(“Messages.forward…”);
}
public void back()引发异常{
LOG.info(“Messages.back..”;
}
public MessageBean getMessageBean(){
返回消息bean;
}
公共void setMessageBean(MessageBean MessageBean){
this.messageBean=messageBean;
}
公共无效插入(消息){
LOG.info(“Messages.insert..”);
}
}

为了在POST请求中导航到不同的页面,操作方法需要返回您需要导航到的页面的视图ID。大概是这样的:

<h:commandLink action="#{bean.submit}">submit</h:commandLink>
   
这将转到
someViewId.xhtml

动作侦听器对导航没有影响。如果必要,他们打算在调用实际操作之前预处理/准备材料。查看代码片段,您似乎不完全了解如何使用操作和操作侦听器。你似乎把动作听众和动作混淆了。您在action listener方法中所做的工作实际上应该在action方法中完成

例如,在您的特定情况下

<h:form>
    <h:commandLink id="messageLink" action="#{messageBean.setMessage(m)}">
        <f:actionListener type="net.bounceme.dur.listeners.MessageListener" />
        <h:outputText value="#{m.messageNumber}"/>
    </h:commandLink>
</h:form>
操作完成后,将导航到
message.xhtml

这与转换无关。转换器只是在
字符串
和复杂Java对象之间进行转换,以便复杂Java对象可以用HTML表示,或者可以作为HTTP请求参数处理,而HTTP请求参数只能是字符串

另见:

谢谢,我也看过了。有点傻,因为我知道返回字符串。如果它停留在同一页上,那是另一个问题吗?正在调用setMessage,但我无法跟踪它返回的字符串的“位置”。然后返回值无效。你在文件夹里吗?尝试设置绝对视图ID,例如
return”/somefolder/message.xhtml。当您的JSF项目阶段设置为“开发”时,您应该得到一个关于此的开发人员警告。是的,javax.faces.project_阶段显示为web.xml中的开发,所以对此不确定。似乎是另一个问题。不过谢谢你。
<h:form>
    <h:commandLink id="messageLink" action="#{messageBean.setMessage(m)}">
        <f:actionListener type="net.bounceme.dur.listeners.MessageListener" />
        <h:outputText value="#{m.messageNumber}"/>
    </h:commandLink>
</h:form>
<h:form>
    <h:commandLink id="messageLink" action="#{messageBean.setMessage(m)}">
        <h:outputText value="#{m.messageNumber}"/>
    </h:commandLink>
</h:form>
public String setMessage(Message message) {
    // Do your business job here.

    return "message";
}