Я новичок в 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>
OK. Спасибо. Метод sendToPageAndPutValue(), который я вызову в auctionList.xhtml .. paramName, paramValue должно быть именем аукциона? .. Я не вижу, как установить связь между именем аукциона и кнопкой команды (я бы не хотел использовать < h: selectOneMenu>, можете ли вы сказать мне другое решение, пожалуйста?) .. и для целевой страницы я сделаю еще один класс («DestinationBean»). Мой вопрос: получить значение GET целевого компонента, это нормально сделать вызов в detail.xhtml (моя страница назначения)? Я, например, что-то вроде:
Параметр: # {destinationbean.paramName}
– DaianaBКоманда commandButton вызывается методом sendToPageAndPutValue(), в рамках метода вы должны указать имя для аукционов, чтобы отправить это другому компоненту, используется имя paramName для восстановления значения, просто так, вы можете отправить любой объект в любое место в других компонентах. Это вернет объект, который будет помещен в запрос с помощью paramName: currentAuction = FacesContext.getCurrentInstance(). GetExternalContext(). GetFlash(). Get ("paramName"); –
Хорошо. Так что не лучше реализовать метод: sendToPageAndPutValue() в классе Auction (и поставить имя аукциона параметра value, объявленного как атрибут), а не создавать класс Your Bean? У меня есть класс под названием Auction.java, а также AuctionManagerImpl.java? – DaianaB