2017-01-27 15 views
0

Я новичок в xhtml, и я пытаюсь использовать href внутри ячейки таблицы через определенное имя (имя аукциона в моем случае). Когда я нажимаю имя аукциона, я хочу отправить его на другую страницу для добавления ставки, видя самую высокую ставку и так далее. Он просто показывает мне последнюю группу Panel со ссылочной страницы (где говорится: «Нет ставок для этого аукциона»).Как использовать href внутри rich: column?

Может кто-нибудь помочь мне, пожалуйста?

код из богатых: колонн составляет auctionList.xhtml:

<composite:implementation> 
    <rich:dataTable id="auctionsTable" rows="6" value="#{cc.attrs.auctions}" var="auct" border="1" styleClass="flat list auctions" rendered="#{cc.attrs.rendered and not empty cc.attrs.auctions}"> 
     <f:facet name="header"> 
      <rich:dataScroller forComponent="auctionsTable" /> 
     </f:facet> 

     <h:link outcome="/destination" value="link" /> 


     <rich:column sortBy="#{auct.name}" sortOrder="ascending" > 
      <a href="detail.xhtml"> 
      #{auct.name} 
      </a>     
     </rich:column> 

и detail.xhml является:

<ui:composition> 

    <h2>Details</h2> 
    <h:panelGroup layout="div" 
     rendered="#{auctionManager.currentAuction != null}"> 
     <a4j:poll interval="3000" render="highestBidOutput, bidHistory" action="#{auctionManager.refreshAuction(currentAuction)}" /> 
     <h3>#{currentAuction.name}</h3> 
     <h:panelGrid> 
     <h:column> 
      <h:outputLabel value="ID:" /> 
      <h:outputText value="#{currentAuction.id}" /> 
      </h:column> 

     <h:column> 
      <h:outputLabel value="Owner:" /> 
      <h:outputText value="#{currentAuction.owner.name}" /> 
     </h:column> 

     <h:column> 
      <h:outputLabel value="Original price:" /> 
      <h:outputText value="#{currentAuction.originalPrice}" /> 
     </h:column> 

     <h:column> 
      <h:outputLabel value="Description:" /> 
      <h:outputText value="#{currentAuction.description}" /> 
     </h:column> 

     <h:column> 
      <h:outputLabel value="Location:" /> 
      <h:outputText value="#{currentAuction.location}" /> 
     </h:column> 

      </h:panelGrid> 
      <h:panelGrid columns="2"> 
      <h:outputLabel value="Highest bid:" 
       rendered="#{not empty currentAuction.highestBid}" /> 
      <h:outputText id="highestBidOutput" 
       value="#{currentAuction.highestBid.amount} (#{currentAuction.highestBid.bidder.name})" 
       rendered="#{not empty currentAuction.highestBid}" /> 

      <h:outputLabel value="Bid" rendered="#{loginManager.logged}" /> 
      <h:form rendered="#{loginManager.logged}"> 
       <h:inputText id="bidAmountInput" value="#{bidAmount}" 
        validator="#{bidValidator.validateBid}" /> 
       <h:commandButton value="Add" 
        action="#{auctionManager.addBid(bidAmount)}" /> 
       <h:messages style="color: red" /> 
      </h:form> 

     </h:panelGrid> 

     <h:panelGroup id="bidHistory" rendered="#{not empty currentAuction.bids}"> 
      <h3>Bids</h3> 
      <h:dataTable var="offer" value="#{currentAuction.bids}" border="1" 
       styleClass="flat"> 
       <h:column>#{offer.bidder.name}</h:column> 
       <h:column>#{offer.amount}</h:column> 
      </h:dataTable> 
     </h:panelGroup> 

    </h:panelGroup> 

    <h:panelGroup layout="div" 
     rendered="#{auctionManager.currentAuction == null}"> 
     <p>No bids for given auction.</p> 
    </h:panelGroup> 

и AuctionManagerImpl.java используются в detail.xhtml:

private static final long serialVersionUID = 1L; 

private Auction currentAuction = null; 

@PersistenceContext(type=PersistenceContextType.EXTENDED) 
private EntityManager em; 

@Inject 
private LoginManager loginManagerBean; 

@Resource SessionContext sessionContext; 

@Produces 
@Named 
@Dependent 
@CurrentAuction 
@PermitAll 
public Auction getCurrentAuction() { 
    if (currentAuction != null && !em.contains(currentAuction)) { 
     currentAuction = em.merge(currentAuction); 
    } 
    return currentAuction; 
} 

@PermitAll 
public Long getCurrentAuctionId() { 
    return (currentAuction == null) ? null : currentAuction.getId(); 
} 

@PermitAll 
public void setCurrentAuctionId(Long currentId) { 
    this.currentAuction = em.find(Auction.class, currentId); 
} 

@PermitAll 
public List<Auction> getAll() { 
    return em.createQuery("SELECT a FROM Auction a", Auction.class) 
      .getResultList(); 
} 

@PermitAll 
public List<Auction> getAuctionsWinningByUser(User user) { 
    String jql = "SELECT auction FROM Auction auction, User user " 
      + "WHERE user=:user AND auction.highestBid member of user.bids " 
      + "ORDER BY auction.id"; 
    TypedQuery<Auction> query = em.createQuery(jql, Auction.class); 
    query.setParameter("user", user); 
    List<Auction> auctions = query.getResultList(); 
    return auctions; 
} 

@PermitAll 
public List<Auction> getAuctionLoosingByUser(User user) { 
    String jql = "SELECT DISTINCT auction FROM User user " 
      + "JOIN user.bids bid JOIN bid.auction auction " 
      + "WHERE user=:user AND auction.highestBid.bidder != user " 
      + "ORDER BY auction.id"; 
    TypedQuery<Auction> query = em.createQuery(jql, Auction.class); 
    query.setParameter("user", user); 
    List<Auction> auctions = query.getResultList(); 
    return auctions; 
} 

@PermitAll 
public void refreshAuction(Auction auction) { 
    em.refresh(auction); 
} 

//@PermitAll 
public void addBid(long bidAmount) { 
    if (sessionContext.getCallerPrincipal() == null) { 
     throw new IllegalStateException(
       "user must be logged in order to add bid"); 
    } 
    if (currentAuction == null) { 
     throw new IllegalStateException(
       "currentAuction have to be selected in order to add bid"); 
    } 

    Bid bid = new Bid(loginManagerBean.getCurrentUser(), currentAuction, bidAmount); 
    em.persist(bid); 
    em.flush(); 
    em.refresh(bid); 
} 

}

также очень важно List.xhtml, где я использую auctionList.xhtml:

<ui:composition template="templates/home.xhtml"> 
<ui:param name="activeTab" value="list" /> 

<ui:define name="content"> 
    <h2>Auction List</h2> 
    <a:auctionList auctions="#{auctionManager.all}" /> 
</ui:define> 

ответ

0

Basicaly вам нужно поставить значение в запросе и перенаправлять на целевую страницу, с помощью JSF, метод, который есть строка, неявно возвращают навигации, вы можете сделать это таким образом:

public String sendToPageAndPutValue(){ 
FacesContext.getCurrentInstance().getExternalContext().getFlash().put(paramName, paramValue); 
    return "pageDestination.xhtml"; 
} 

к г Эковер это значение в пункте назначения Bean вы можете сделать это:

FacesContext.getCurrentInstance().getExternalContext().getFlash().get("paramName") 

чек в вашем бобе .:

@Named -> javax.inject.Named 
@ViewScoped -> org.omnifaces.cdi.ViewScoped 
public class YourBean 

В вашей рубрике, вам нужно вызвать этот метод в ах: CommandButton или a4j: CommandButton с использованием имущество действие

<h:commanButton id="idButton" value="Send" execute="@this" action="#{yourBean.sendToPageAndPutValue()}"/> 
+0

OK. Спасибо. Метод sendToPageAndPutValue(), который я вызову в auctionList.xhtml .. paramName, paramValue должно быть именем аукциона? .. Я не вижу, как установить связь между именем аукциона и кнопкой команды (я бы не хотел использовать < h: selectOneMenu>, можете ли вы сказать мне другое решение, пожалуйста?) .. и для целевой страницы я сделаю еще один класс («DestinationBean»). Мой вопрос: получить значение GET целевого компонента, это нормально сделать вызов в detail.xhtml (моя страница назначения)? Я, например, что-то вроде:

Параметр: # {destinationbean.paramName}

DaianaB

+0

Команда commandButton вызывается методом sendToPageAndPutValue(), в рамках метода вы должны указать имя для аукционов, чтобы отправить это другому компоненту, используется имя paramName для восстановления значения, просто так, вы можете отправить любой объект в любое место в других компонентах. Это вернет объект, который будет помещен в запрос с помощью paramName: currentAuction = FacesContext.getCurrentInstance(). GetExternalContext(). GetFlash(). Get ("paramName"); –

+0

Хорошо. Так что не лучше реализовать метод: sendToPageAndPutValue() в классе Auction (и поставить имя аукциона параметра value, объявленного как атрибут), а не создавать класс Your Bean? У меня есть класс под названием Auction.java, а также AuctionManagerImpl.java? – DaianaB