1

特定のMessageインスタンスのヘッダー情報を取得するために、ListDataTableが特定の行に対してオンになっている現在のjavax.mail.MessageをバッキングBeanに送り返すにはどうすればよいですか?問題は、これがクライアントのdataTable内からのものだと思います。

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 "/>".

私はそれがコマンドリンクの線に沿ったものだと思います、それは次の構文を示唆しています:

<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に送り返すためのアプローチです。

ファセット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のようなものですか?

4

1 に答える 1

3

あなたの最初の試みに関しては、

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

属性値の終了が早すぎて、無効な属性name = value構文で開始しているため、これは失敗します。構文の強調表示に注意してください。ネストされた文字列には、二重引用符ではなく一重引用符を使用します。

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

2回目の試みについては、

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

正当な構文のように見えるので、なぜそれが失敗するのかわかりません。

コードを表示せず、エラーメッセージのみを表示した3回目の試行については、

/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 value="#{messageBean.getUrl(m)}">insert</h:outputLink>
于 2012-04-06T04:27:21.613 に答える