簡體   English   中英

facelet 數據表:在支持 bean 中找不到方法,試圖將實例發送回 bean

[英]facelet dataTable: method not found in backing bean, trying to send instance back to bean

我如何將 ListDataTable 針對特定行的當前 javax.mail.Message 發送回支持 bean,以便獲取該特定 Message 實例的一些標頭信息? 我認為問題在於這是來自客戶端數據表。

如何使 getUrl 可用於 ListDataTable?

我試過了:

<h:outputText value="#{messageBean.foo(m.header("Archived-at"))}"></h:outputText>

返回錯誤:

Element type "h:outputText" must be followed by either attribute specifications, ">" or "/>".

我認為它類似於command link ,它暗示了以下語法:

<h:commandLink action="#{bean.insert(item.id)}" value="insert" />

這與我正在做的事情很接近。 就我而言,我只想將特定消息發送回 MessageBean.getUrl(Message) 但這並沒有像我預期的那樣工作。

我也試過:

/foo/client.xhtml @48,61 value="#{messageBean.url(m)}": Method url not found

所以這顯然不是將對象從模板客戶端發送到支持 bean 的正確方法。 但是,這是我想要的方法,將實際的 Message 實例發送回 bean。

facelets 2.0 客戶端:

<?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:f="http://java.sun.com/jsf/core">
    <ui:define name="content">
        <h:dataTable value="#{messageBean.model}" var="m">
            <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="content">
                    <h:outputText value="content" />
                </f:facet>
                <h:outputText value="#{m.sentDate}"></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>

支持豆:

package net.bounceme.dur.nntp;

import java.io.Serializable;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.context.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.inject.Named;
import javax.mail.Header;
import javax.mail.Message;

@Named
@SessionScoped
public class MessageBean implements Serializable {

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

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

    public DataModel getModel() throws Exception {
        logger.log(level, "MessageBean.getModel..");
        List<Message> messages = new ArrayList<Message>();
        SingletonNNTP nntp = SingletonNNTP.INSTANCE;
        messages = nntp.getMessages();
        DataModel messagesDataModel = new ListDataModel(messages);
        return messagesDataModel;
    }

    public List<String> getStringHeaders(Message message) throws Exception {
        List<Header> headerListOfHeaders = getHeaders(message);
        List<String> stringListOfHeaders = new ArrayList<String>();
        for (Header h : headerListOfHeaders) {
            stringListOfHeaders.add(h.getName() + " " + h.getValue() + "\n");
        }
        return stringListOfHeaders;
    }

    public URL getUrl(Message message) throws Exception {
        List<Header> headers = getHeaders(message);
        URL url = new URL("http://www.google.com/");
        for (Header h : headers) {
            if ("Archived-at".equals(h.getName())) {
                String s = h.getValue();
                s = s.substring(1, s.length() - 1);
                url = new URL(s);
            }
        }
        return url;
    }

    private List<Header> getHeaders(Message message) throws Exception {
            Enumeration allHeaders = message.getAllHeaders();
            List<Header> headers = new ArrayList<Header>();
            while (allHeaders.hasMoreElements()) {
                Header hdr = (Header) allHeaders.nextElement();
                headers.add(hdr);
            }
            return headers;
        }
}

我想將 getUrl 與 MessageBean 一起使用,但我願意將該方法分解為另一個類。 但是,哪個類,以及如何引用它? 只是像 MyBeanOps 之類的東西?

至於你的第一次嘗試,

<h:outputText value="#{messageBean.foo(m.header("Archived-at"))}" />

這會失敗,因為您過早地結束屬性值,然后以無效的屬性名稱=值語法開始。 注意語法高亮。 對嵌套字符串使用單引號而不是雙引號:

<h:outputText value="#{messageBean.foo(m.header('Archived-at'))}" />

至於你的第二次嘗試,

<h:commandLink action="#{bean.insert(item.id)}" value="insert" />

我不確定為什么這對你來說失敗了,因為它看起來是合法的語法。

至於您沒有顯示任何代碼而只顯示錯誤消息的第三次嘗試,

/foo/client.xhtml @48,61 value="#{messageBean.url(m)}": Method url not found

那是因為您沒有方法url(Message message) 相反,您有一個方法getUrl(Message message) 所以你應該使用

<h:commandLink action="#{messageBean.getUrl(m)}" value="insert" />

但是,這並不能解決問題。 這不是有效的操作方法。 這應該只被視為一個值表達式。 所以,這應該做:

<a href="#{messageBean.getUrl(m)}">insert</a>

這會將URL#toString()的結果打印為href屬性的值,這正是您想要的。 您當然也可以<h:outputLink>使用<h:outputLink>

<h:outputLink value="#{messageBean.getUrl(m)}">insert</h:outputLink>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM