2017-06-13 1 views
0

私はここに似たような質問があることを知っていますが、解決策のどれも私のために働いていません。私がprimefaceデータテーブルを使用する前に、すべてのことが完璧に機能していましたが、私はprimefaceのページ設定が必要でしたので、デフォルトのjsfデータテーブルの代わりにprimefaceのdatatableに切り替えました。問題は、いくつかのボタンが配置されるactionという名前の列があることです。たとえば、ボタンの1つは「購入」です。このボタンをクリックすると、プログラムは製品データベースから取り出してカートデータベースに追加します。これはjsfデータテーブルと完全に連携しています。しかし、データ型のプライム面では、何もしないか、またはヌルポイントの例外を与えます。これは私のxhtmlファイルです。何もしていない他のものをクリックした場合、データテーブルの最初のアイテムの購入ボタンをクリックすると、ヌルポイント例外が発生します。commandButton inside p:datatableが動作していない

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:p="http://primefaces.org/ui"> 
<h:head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

<title>Shopping</title> 
<h:outputStylesheet library="css" name="Product-table.css" /> 
</h:head> 
<body> 

<h:outputLabel value="Welcome #{loginBean.name}"></h:outputLabel> 
<br></br> 
<br></br> 
<div style="width: 100%;"> 
    <div style="width: 75%; float: left;"> 
     <h2>Products</h2> 
     <h:form> 
      <p:dataTable var="product" value="#{databaseBean.products}" 
       filteredValue="#{databaseBean.filteredProducts}" 
       widgetVar="productWidget" paginator="true" rows="10" 
       paginatorTemplate="{CurrentPageReport} {FirstPageLink} 
       {PreviousPageLink} {PageLinks} {NextPageLink} 
       {LastPageLink} {RowsPerPageDropdown}" 
       rowsPerPageTemplate="5,10,15,20,25"> 

       <f:facet name="header"> 
        <p:outputPanel> 
         <h:outputText value="Search:" /> 
         <p:inputText id="globalFilter" 
          onkeyup="PF('productWidget').filter()" style="width:150px" 
          placeholder="Search text" /> 
        </p:outputPanel> 
       </f:facet> 

       <p:column headerText="Id" filterBy="#{product.id}" filterMatchMode="contains"> 
        <h:outputText value="#{product.id}" /> 
       </p:column> 

       <p:column headerText="Name" filterBy="#{product.name}" filterMatchMode="contains" > 
        <h:outputText value="#{product.name}" /> 
       </p:column> 

       <p:column headerText="Price" filterBy="#{product.price}" filterMatchMode="contains"> 
        <h:outputText value="#{product.price}" /> 
       </p:column> 

       <p:column headerText="Quantity" filterBy="#{product.quantity}" filterMatchMode="contains"> 
        <h:outputText value="#{product.quantity}" /> 
       </p:column> 

       <p:column headerText="Category" filterBy="#{product.category}" filterMatchMode="contains" > 
        <h:outputText value="#{product.category}" /> 
       </p:column> 
       <p:column> 
        <f:facet name="header">Action</f:facet> 
        <h:form> 
         <h:commandButton type="submit" value="#{product.id}" 
          name="buyLink" action="#{databaseBean.addtoCart}"> 
          <f:param name="productId" value="#{product.id}" /> 
          <f:param name="userId" value="#{loginBean.name}" /> 
         </h:commandButton> 
        </h:form> 
       </p:column> 
      </p:dataTable> 
     </h:form> 
    </div> 
    <div style="width: 25%; float: right;"> 
     <h2>Cart</h2> 
     <p:dataTable value="#{databaseBean.cart}" var="product" 
      styleClass="product-table" headerClass="product-table-header" 
      rowClasses="product-table-odd-row,product-table-even-row"> 
      <p:column> 
       <f:facet name="header">Product ID</f:facet> 
     #{product.productId} 
      </p:column> 
      <p:column> 
       <f:facet name="header">Quantity</f:facet> 
     #{product.quantity} 
      </p:column> 
     </p:dataTable> 
    </div> 
</div> 

<h:form> 
    <h:commandButton action="#{loginBean.logout}" value="logout"></h:commandButton> 
</h:form> 

これは、ボタンが呼び出す必要があるメソッドです。私はそれがデフォルトのjsfデータテーブルで完全に動作していると言っていたので、何もjavaコードに間違っているとは思わないが、問題はxhtmlファイルにある。

public void addtoCart(){ 
    //userId = getUserID(); 
    ManageCart MC = new ManageCart(); 
    FacesContext fc = FacesContext.getCurrentInstance(); 
    Map<String,String> params = 
      fc.getExternalContext().getRequestParameterMap(); 
    String productIdString = params.get("productId"); 
    int productId = Integer.parseInt(productIdString); 
    MC.addToChart(userId, productId, 1); 
    cart = mc.listCart(userId); 
    products = mp.listProducts(); 
} 

本当にありがとうございます。 ありがとうございます。

答えて

0

解決策が見つかりました。私はアクションブロックのコードブロックからタグ<h:form></h:form>を削除する必要がありました。

+1

jfym:入れ子になったフォームを使用しないでください!他のサイトでネストされたフォームを使用している場合は、そのようなエラーに常につながる可能性があるため、変更する必要があります。 – lastresort

関連する問題