2012-04-06 53 views
1

如何发送ListDataTable所在的特定行的当前javax.mail.Message返回到支持bean以获取某些内容该特定消息实例的头信息?我认为问题在于这是来自客户端dataTable中的。facelet dataTable:在backing bean中找不到方法,试图将实例发送回bean

如何让ListUrl对getUrl可用?

我已经试过:

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

支持bean:

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什么的?

+0

您没有使用JSP或Servlet。您正在使用JSF和Facelets。请不要在问题上输入错误的标签。 – BalusC 2012-04-06 04:28:20

回答

2

关于你的第一次尝试,

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

因为你太很快结束的属性值,然后用无效的属性名称= value语法开始,就会失败。注意语法突出显示。使用单引号代替双引号的嵌套的字符串:

<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 value="#{messageBean.getUrl(m)}">insert</h:outputLink> 
+0

好的,我仍在阅读你的答案,谢谢。我也发现http://stackoverflow.com/questions/3951263/jsf-command-button-inside-a-jsf-data-table,所以我会在这里尝试你的建议和其他问题。标签已修复。 – Thufir 2012-04-06 04:33:47

+0

该答案针对的是没有EL 2.2的较旧环境。但是,您的支持EL 2.2。这样你可以用更简单的代码结束。更完整的概述可以在http://stackoverflow.com/questions/4994458/how-can-i-pass-a-parameter-toa-a-commandlink-inside-a-datatable找到请注意,这是**不适合**,因为您只是打印URL的特定功能需求。从上到下阅读答案:) – BalusC 2012-04-06 04:38:55

+0

insert 很好。为什么是messageBean.getUrl(m)而不是messageBean.url(m)?那是因为它是一个动作,所以这个bean没有“url”属性?再次感谢。而不是“插入”,我可以做出实际的链接文本? http://等...? – Thufir 2012-04-06 15:39:14