commandButton / commandLink / ajax วิธีการดำเนินการ / ฟังไม่ได้เรียกหรือค่าการป้อนข้อมูลไม่ได้ตั้ง / ปรับปรุง


345

บางครั้งเมื่อใช้<h:commandLink>, <h:commandButton>หรือ<f:ajax>ที่action, actionListenerหรือlistenerวิธีการที่เกี่ยวข้องกับแท็กจะเป็นเพียงการไม่ได้ถูกเรียก หรือคุณสมบัติ bean จะไม่ถูกอัพเดตด้วยUIInputค่าที่ส่ง

สาเหตุและวิธีแก้ไขที่เป็นไปได้สำหรับสิ่งนี้คืออะไร

คำตอบ:


687

บทนำ

เมื่อใดก็ตามที่UICommandองค์ประกอบ ( <h:commandXxx>, <p:commandXxx>ฯลฯ ) ล้มเหลวในการเรียกใช้วิธีการกระทำที่เกี่ยวข้องหรือUIInputส่วนประกอบ ( <h:inputXxx>, <p:inputXxxx>ฯลฯ ) ล้มเหลวในการประมวลผลค่าที่ส่งและ / หรืออัปเดตค่ารุ่นและคุณไม่เห็นข้อยกเว้น googlable และ / หรือ คำเตือนในบันทึกของเซิร์ฟเวอร์ยังไม่ได้เมื่อคุณกำหนดค่าการจัดการข้อยกเว้นอาแจ็กซ์เป็นต่อในการจัดการ JSF คำขอ Ajax ข้อยกเว้นหรือเมื่อคุณตั้งค่าพารามิเตอร์ด้านล่างบริบทweb.xml,

<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

และคุณยังไม่เห็นข้อผิดพลาดของ googlable และ / หรือคำเตือนในคอนโซล JavaScript ของเบราว์เซอร์ (กด F12 ใน Chrome / Firefox23 + / IE9 + เพื่อเปิดชุดเครื่องมือสำหรับนักพัฒนาเว็บและเปิดแท็บคอนโซล ) จากนั้นทำตามรายการด้านล่าง

สาเหตุที่เป็นไปได้

  1. UICommandและUIInputส่วนประกอบต้องอยู่ภายในUIFormส่วนประกอบเช่น<h:form>(และไม่ใช่ HTML ธรรมดา<form>) มิฉะนั้นจะไม่มีสิ่งใดถูกส่งไปยังเซิร์ฟเวอร์ UICommandส่วนประกอบต้องไม่มีtype="button"แอตทริบิวต์มิฉะนั้นจะเป็นปุ่มตายซึ่งมีประโยชน์สำหรับ JavaScript onclickเท่านั้น ดูเพิ่มเติมวิธีการส่งค่าที่ป้อนเข้ารูปแบบและวิธีการในการเรียก JSF ถั่วและ<H: CommandButton> ไม่ได้เริ่มต้นการ postback

  2. คุณไม่สามารถซ้อนหลายUIFormองค์ประกอบในกันและกัน นี่เป็นสิ่งผิดกฎหมายใน HTML พฤติกรรมของเบราว์เซอร์ไม่ได้ระบุ ระวังด้วยไฟล์รวม! คุณสามารถใช้UIFormส่วนประกอบในแบบคู่ขนาน แต่จะไม่ประมวลผลซึ่งกันและกันระหว่างการส่ง คุณควรระวังด้วย antipattern "God Form" ตรวจสอบให้แน่ใจว่าคุณไม่ได้ดำเนินการโดยไม่ตั้งใจ / ตรวจสอบอินพุตอื่น (มองไม่เห็น) ทั้งหมดในรูปแบบเดียวกัน (เช่นมีกล่องโต้ตอบที่ซ่อนอยู่พร้อมกับอินพุตที่ต้องการในรูปแบบเดียวกันมาก) ดูวิธีใช้ <h: form> ในหน้า JSF ได้อย่างไร แบบฟอร์มเดียว? หลายรูปแบบ? แบบฟอร์มซ้อนกัน? .

  3. ไม่UIInputควรมีข้อผิดพลาดในการตรวจสอบความถูกต้อง / การแปลงค่า คุณสามารถใช้<h:messages>เพื่อแสดงข้อความใด ๆ ที่ไม่ได้แสดงโดย<h:message>ส่วนประกอบเฉพาะอินพุตใด ๆ อย่าลืมที่จะรวมidของ<h:messages>ใน<f:ajax render>กรณีใด ๆ เพื่อที่มันจะได้รับการปรับปรุงเช่นเดียวกับการร้องขอของอาแจ็กซ์ ดูเพิ่มเติมH: ข้อความไม่แสดงข้อความเมื่อ P: CommandButton กด

  4. หากUICommandหรือUIInputส่วนประกอบถูกวางไว้ภายในองค์ประกอบการวนซ้ำเช่น<h:dataTable>, <ui:repeat>ฯลฯ คุณต้องแน่ใจว่าvalueองค์ประกอบการวนซ้ำนั้นถูกเก็บรักษาไว้อย่างแน่นอนในระหว่างขั้นตอนการร้องขอค่าของการใช้แบบฟอร์มส่งคำขอ JSF จะทำซ้ำเพื่อหาลิงก์ / ปุ่มที่คลิกและค่าอินพุตที่ส่ง การวาง bean ในขอบเขตมุมมองและ / หรือตรวจสอบให้แน่ใจว่าคุณโหลดโมเดลข้อมูลใน@PostConstructbean (และไม่ใช่วิธี getter!) ควรแก้ไข ดูเพิ่มเติมอย่างไรและเมื่อฉันควรโหลดรูปแบบจากฐานข้อมูลสำหรับ H:

  5. หากส่วนประกอบUICommandหรือUIInputรวมอยู่ในแหล่งที่มาแบบไดนามิกเช่น<ui:include src="#{bean.include}">นั้นคุณจะต้องให้แน่ใจว่า#{bean.include}ค่าเดียวกันจะถูกเก็บไว้ในช่วงเวลาที่สร้างมุมมองของการร้องขอการส่งแบบฟอร์ม JSF จะดำเนินการอีกครั้งในระหว่างการสร้างแผนภูมิองค์ประกอบ การวาง bean ในขอบเขตมุมมองและ / หรือตรวจสอบให้แน่ใจว่าคุณโหลดโมเดลข้อมูลใน@PostConstructbean (และไม่ใช่วิธี getter!) ควรแก้ไข ดูเพิ่มเติมวิธีการ ajax-refresh dynamic รวมเนื้อหาตามเมนูการนำทาง (JSF สปา)

  6. renderedแอตทริบิวต์ขององค์ประกอบและทั้งหมดของพ่อแม่และtestแอตทริบิวต์ของผู้ปกครอง<c:if>/ <c:when>ไม่ควรประเมินfalseในระหว่างการปรับใช้ค่าการร้องขอขั้นตอนของการส่งแบบฟอร์มคำขอ JSF จะตรวจสอบอีกครั้งว่าเป็นส่วนหนึ่งของการป้องกันการร้องขอดัดแปลง / แฮ็ก การจัดเก็บตัวแปรที่รับผิดชอบต่อเงื่อนไขใน@ViewScopedถั่วหรือตรวจสอบให้แน่ใจว่าคุณกำหนดค่าเริ่มต้นอย่างเหมาะสมในสภาพ@PostConstructของ@RequestScopedถั่วควรแก้ไข เช่นเดียวกับdisabledคุณลักษณะของส่วนประกอบซึ่งไม่ควรประเมินtrueในระหว่างขั้นตอนการใช้ค่าคำขอ ดูเพิ่มเติมกระทำ JSF CommandButton ไม่เรียก , แบบฟอร์มส่งในองค์ประกอบที่แสดงผลตามเงื่อนไขจะไม่ประมวลผลและH: CommandButton ไม่ทำงานเมื่อฉันห่อไว้ใน <H: panelGroup แสดงผล>

  7. onclickแอตทริบิวต์ของUICommandองค์ประกอบและonsubmitแอตทริบิวต์ของUIFormองค์ประกอบที่ไม่ควรจะกลับfalseหรือก่อให้เกิดข้อผิดพลาด JavaScript ในกรณีที่มี<h:commandLink>หรือ<f:ajax>ไม่มีข้อผิดพลาด JS ที่มองเห็นได้ในคอนโซล JS ของเบราว์เซอร์ โดยปกติแล้ว googling ข้อความแสดงข้อผิดพลาดที่แน่นอนจะให้คำตอบแล้ว ดูเพิ่มเติมด้วยตนเองเพิ่ม / โหลด jQuery กับ PrimeFaces ผลลัพธ์ใน TypeErrors

  8. หากคุณกำลังใช้อาแจ็กซ์ผ่าน 2.x JSF <f:ajax>หรือเช่น PrimeFaces <p:commandXxx>ตรวจสอบให้แน่ใจว่าคุณมีในแม่แบบหลักแทน<h:head> <head>มิฉะนั้น JSF จะไม่สามารถรวมไฟล์ JavaScript ที่จำเป็นซึ่งมีฟังก์ชัน Ajax ได้โดยอัตโนมัติ ซึ่งจะส่งผลให้เกิดข้อผิดพลาด JavaScript เช่น "mojarra ไม่ได้ถูกกำหนด" หรือ "PrimeFaces ไม่ได้กำหนด" ในคอนโซล JS ของเบราว์เซอร์ ดูเพิ่มเติมH: commandLink ActionListener ไม่ได้เรียกเมื่อใช้กับ f: อาแจ็กซ์และ UI:

  9. หากคุณกำลังใช้อาแจ็กซ์และค่าส่งจบลงด้วยการnullแล้วให้แน่ใจว่าUIInputและUICommandส่วนประกอบที่สนใจที่ได้รับความคุ้มครองโดย<f:ajax execute>หรือเช่น<p:commandXxx process>มิฉะนั้นพวกเขาจะไม่ได้รับการดำเนินการ / การประมวลผล ดูเพิ่มเติมค่าแบบฟอร์มการส่งไม่ได้ปรับปรุงในรูปแบบเมื่อมีการเพิ่ม <f: อาแจ็กซ์> ไปที่ <H: CommandButton>และPrimeFaces ทำความเข้าใจขั้นตอน / อัปเดตและ JSF f: อาแจ็กซ์รัน / ทำให้คุณลักษณะ

  10. หากค่าที่ส่งยังคงเป็นอยู่nullและคุณใช้ CDI ในการจัดการ beans จากนั้นตรวจสอบให้แน่ใจว่าคุณได้นำเข้าคำอธิบายประกอบขอบเขตจากแพคเกจที่ถูกต้องมิฉะนั้น CDI จะเริ่มต้นที่จะ@Dependentสร้างถั่วขึ้นใหม่ทุกครั้ง การแสดงออก ดูเพิ่มเติมที่@SessionScoped bean จะสูญเสียขอบเขตและได้รับการสร้างใหม่ตลอดเวลาฟิลด์กลายเป็นโมฆะและManaged Bean Scope เริ่มต้นในแอปพลิเคชัน JSF 2 คืออะไร

  11. หากผู้ปกครองของ<h:form>กับUICommandปุ่มรับก่อนการแสดงผล / การปรับปรุงโดยการร้องขอมาจากอาแจ็กซ์ฟอร์มในหน้าเดียวกันอีกแล้วดำเนินการครั้งแรกมักจะล้มเหลวในการ JSF 2.2 หรือมากกว่า การกระทำที่สองและที่ตามมาจะทำงาน ปัญหานี้เกิดจากข้อบกพร่องในการจัดการสถานะมุมมองซึ่งรายงานว่าเป็นปัญหาเฉพาะของ JSF 790และในปัจจุบันได้รับการแก้ไขใน JSF 2.3 สำหรับรุ่นเก่า JSF คุณจะต้องระบุอย่างชัดเจน ID ของ<h:form>ในของrender <f:ajax>ดูเพิ่มเติมที่h: commandButton / h: commandLink ไม่ทำงานเมื่อคลิกครั้งแรกใช้ได้กับการคลิกครั้งที่สองเท่านั้น

  12. หาก<h:form>มีการenctype="multipart/form-data"ตั้งค่าไว้เพื่อรองรับการอัปโหลดไฟล์คุณจะต้องตรวจสอบให้แน่ใจว่าคุณใช้ JSF 2.2 เป็นอย่างน้อยหรือว่าตัวกรองเซิร์ฟเล็ตที่รับผิดชอบในการแยกวิเคราะห์คำขอแบบหลายส่วน / แบบฟอร์มข้อมูลถูกต้องมิฉะนั้นFacesServletจะ ท้ายไม่ได้รับพารามิเตอร์คำขอเลยและไม่สามารถใช้ค่าคำขอได้ วิธีกำหนดค่าตัวกรองดังกล่าวจะขึ้นอยู่กับองค์ประกอบการอัพโหลดไฟล์ที่ใช้ สำหรับ Tomahawk <t:inputFileUpload>ตรวจสอบคำตอบนี้และสำหรับ PrimeFaces <p:fileUpload>ให้ตรวจสอบคำตอบนี้ หรือหากคุณไม่ได้อัปโหลดไฟล์จริงๆให้ลบแอตทริบิวต์ทั้งหมด

  13. ตรวจสอบให้แน่ใจว่าActionEventอาร์กิวเมนต์ของactionListenerเป็น javax.faces.event.ActionEventและไม่ใช่java.awt.event.ActionEventซึ่งเป็นสิ่งที่ IDEs ส่วนใหญ่แนะนำให้เป็นตัวเลือกการเติมข้อความอัตโนมัติครั้งที่ 1 actionListener="#{bean.method}"มีข้อโต้แย้งที่ไม่เป็นธรรมเช่นกันถ้าคุณใช้ actionListener="#{bean.method()}"หากคุณไม่ต้องการข้อโต้แย้งในการที่คุณใช้ หรือบางทีคุณอาจต้องการจริงที่จะใช้แทนaction actionListenerดูเพิ่มเติมความแตกต่างระหว่างการกระทำและ ActionListener

  14. ตรวจสอบให้แน่ใจว่าไม่มีPhaseListenerหรือEventListenerในห่วงโซ่ตอบสนองการร้องขอมีการเปลี่ยนแปลงวงจรชีวิต JSF ที่จะข้ามขั้นตอนการดำเนินการโดยวิงวอนขอยกตัวอย่างเช่นการเรียกหรือFacesContext#renderResponse()FacesContext#responseComplete()

  15. ตรวจสอบให้แน่ใจว่าไม่มีFilterหรือServletในห่วงโซ่การตอบสนองคำขอเดียวกันได้ปิดกั้นการร้องขอFacesServletอย่างใด ตัวอย่างเช่นตัวกรองล็อกอิน / ความปลอดภัยเช่น Spring Security โดยเฉพาะอย่างยิ่งในคำขอ ajax ที่โดยค่าเริ่มต้นจะไม่มีความคิดเห็น UI เลย ดูเพิ่มเติมฤดูใบไม้ผลิการรักษาความปลอดภัยที่ 4 และ PrimeFaces จัดการคำขอ

  16. หากคุณกำลังใช้ PrimeFaces <p:dialog>หรือแล้วให้แน่ใจว่าพวกเขามีของตัวเอง<p:overlayPanel> <h:form>เพราะองค์ประกอบเหล่านี้โดยการเริ่มต้นโดย JavaScript ย้ายไปอยู่ที่ปลาย <body>HTML ดังนั้นหากพวกเขากำลังนั่งอยู่เดิมภายในแล้วพวกเขาก็จะตอนนี้ไม่ได้อีกต่อไปนั่งอยู่ใน<form> <form>ดูเพิ่มเติมที่p: การดำเนินการ commandbutton ไม่ทำงานภายในกล่องโต้ตอบ p:

  17. บั๊กในเฟรมเวิร์ก ตัวอย่างเช่น RichFaces มี " ข้อผิดพลาดในการแปลง " เมื่อใช้rich:calendarองค์ประกอบ UI ที่มีdefaultLabelแอตทริบิวต์ (หรือในบางกรณีเป็นrich:placeholderองค์ประกอบย่อย) ข้อผิดพลาดนี้จะป้องกันไม่ให้เรียกใช้วิธี bean เมื่อไม่มีการตั้งค่าสำหรับวันที่ในปฏิทิน การติดตามข้อบกพร่องของเฟรมเวิร์กสามารถทำได้โดยเริ่มจากตัวอย่างการทำงานที่เรียบง่ายและการสร้างหน้าสำรองจนกว่าจะพบข้อบกพร่อง

การดีบักคำแนะนำ

ในกรณีที่คุณยังคงติดอยู่ก็ถึงเวลาที่จะแก้ไขข้อบกพร่อง ในฝั่งไคลเอ็นต์ให้กด F12 ในเว็บเบราว์เซอร์เพื่อเปิดชุดเครื่องมือสำหรับนักพัฒนาเว็บ คลิกที่แท็บคอนโซลเพื่อดู Conosle JavaScript ควรปราศจากข้อผิดพลาด JavaScript ใด ๆ ภาพหน้าจอด้านล่างเป็นตัวอย่างจาก Chrome ที่แสดงให้เห็นกรณีของการส่ง<f:ajax>ปุ่มเปิดใช้งานในขณะที่ยังไม่ได้<h:head>ประกาศ (ดังที่อธิบายไว้ในข้อ 7 ข้างต้น)

คอนโซล js

คลิกที่แท็บเครือข่ายเพื่อดู HTTP traffic monitor ส่งแบบฟอร์มและตรวจสอบว่าส่วนหัวคำขอและข้อมูลแบบฟอร์มและเนื้อหาการตอบสนองเป็นไปตามความคาดหวัง ภาพหน้าจอด้านล่างเป็นตัวอย่างจาก Chrome ซึ่งแสดงให้เห็นถึงอาแจ็กซ์ประสบความสำเร็จส่งของรูปแบบที่เรียบง่ายมีเพียงหนึ่งเดียว<h:inputText>และเป็นหนึ่งเดียวกับ<h:commandButton><f:ajax execute="@form" render="@form">

ตรวจสอบเครือข่าย

(คำเตือน: เมื่อคุณโพสต์ภาพหน้าจอจากส่วนหัวคำขอ HTTP เช่นด้านบนจากสภาพแวดล้อมการใช้งานจริงจากนั้นตรวจสอบให้แน่ใจว่าคุณได้เบราว์เซอร์ / ทำให้งงงวยคุกกี้เซสชันใด ๆ ในภาพหน้าจอเพื่อหลีกเลี่ยงการโจมตี

ในฝั่งเซิร์ฟเวอร์ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์เริ่มทำงานในโหมดแก้ไขข้อบกพร่อง วางจุดพักการดีบักในวิธีการขององค์ประกอบ JSF ที่น่าสนใจซึ่งคุณคาดว่าจะถูกเรียกในระหว่างการประมวลผลแบบฟอร์มส่ง เช่นในกรณีของUICommandองค์ประกอบที่จะเป็นUICommand#queueEvent()และในกรณีขององค์ประกอบที่จะเป็นUIInput UIInput#validate()เพียงแค่ผ่านการเรียกใช้โค้ดและตรวจสอบว่าโฟลว์และตัวแปรนั้นเป็นไปตามความคาดหวังหรือไม่ ภาพหน้าจอด้านล่างเป็นตัวอย่างจากตัวดีบักของ Eclipse

เซิร์ฟเวอร์ดีบั๊ก


1
ประเด็นที่สองของคุณทำให้ฉันคิดว่า - อีกนาน ฉันเพิ่งพบว่าแท็ก f: view ในไฟล์หลักของฉันเป็นสาเหตุของปัญหาส่วนใหญ่ของฉัน และอาจเป็นเพราะมันทำให้รูปแบบใช่มั้ย
Paulo Guedes

2
@ Pauloguedes ฉันไม่สามารถหาอะไรที่ระบุว่า f: มุมมองทำให้รูปแบบ ความเข้าใจของฉันคือว่ามันเป็นเพียงภาชนะ จากประสบการณ์ของฉัน f: มุมมองไม่ได้แสดงองค์ประกอบใด ๆ
ลูคัส

@balusc การชี้แจงเล็ก ๆ น้อย ๆ ในจุดที่ 4 หาก commandLink ไม่อยู่ใน dataTable เองมันยังคงสำคัญหรือไม่
Lucas

ขอบคุณจุดคือจุด: ใส่ถั่วในขอบเขตมุมมองและ / หรือตรวจสอบให้แน่ใจว่าคุณโหลดแบบจำลองข้อมูลในตัวสร้าง (โพสต์) ของถั่ว (และไม่ได้อยู่ในวิธีการทะเยอทะยาน!) ควรแก้ไข
merveotesi

2
@Kukeltje: ที่จะได้โยนข้อยกเว้น EL (ที่กล่าวมาแล้วโดยวรรค 1 ในคำตอบ)
BalusC

54

หากคุณh:commandLinkอยู่ข้างในh:dataTableมีเหตุผลอื่นที่h:commandLinkอาจไม่ทำงาน:

แหล่งข้อมูลพื้นฐานที่เชื่อมโยงกับh:dataTableต้องมีอยู่ใน JSF-Lifecycle ที่สองที่ถูกทริกเกอร์เมื่อมีการคลิกลิงค์

ดังนั้นหากแหล่งข้อมูลพื้นฐานถูกกำหนดขอบเขตคำขอh:commandLinkไม่ทำงาน!


2
ตกลงนั่นไม่ชัดเจนสำหรับฉัน ฉันหวังว่าคำตอบของฉันจะเป็นประโยชน์ต่อไปเนื่องจากในกรณีของฉันอย่างน้อยฉันก็ไม่ได้ติดต่อกับ UICommand / UIData อย่างชัดเจน "การแก้ปัญหา" ได้รับการส่งเสริมสนับสนุนจากถั่วคำขอขอบเขตขอบเขตเซสชั่น ...
jbandi

1
ฉันสองความคิดเห็น Jens ... การตั้งค่า RequestScoped bean ของฉันให้เป็น SessionScoped สร้างความแตกต่างให้กับ dataTable ของฉัน - ขอบคุณ
Zack Macomber

28

ในขณะที่คำตอบของฉันไม่สามารถใช้งานได้ 100% แต่เครื่องมือค้นหาส่วนใหญ่พบว่านี่เป็นคำตอบแรกที่ฉันตัดสินใจที่จะโพสต์อย่างไรก็ตาม:

หากคุณใช้PrimeFaces (หรือ API ที่คล้ายกัน) p:commandButtonหรือp:commandLinkเป็นไปได้ว่าคุณลืมที่จะเพิ่มลงprocess="@this"ในคอมโพเนนต์คำสั่งของคุณอย่างชัดเจน

ตามที่คู่มือผู้ใช้ PrimeFaces ระบุไว้ในส่วน 3.18 ค่าเริ่มต้นprocessและupdateทั้งคู่@formซึ่งตรงข้ามกับค่าเริ่มต้นที่คุณอาจคาดหวังจาก JSF f:ajaxหรือ RichFaces ซึ่งเป็นexecute="@this"และrender="@none"ตามลำดับ

เพิ่งหาเวลาไปหาฉัน (... และฉันคิดว่ามันค่อนข้างชัดเจนที่จะใช้ค่าเริ่มต้นที่แตกต่างจาก JSF!)


6
ค่าเริ่มต้นสำหรับ PrimeFaces คือprocess @formดังนั้นหากการกระทำไม่ได้ถูกเรียกด้วยวิธีนี้ แต่จะใช้เมื่อใช้@thisดังนั้นคำตอบของฉันจะเป็นไปได้มากที่สุด
BalusC

3
สิ่งนี้เป็นไปไม่ได้ ผมมีp:commandButtonที่ไม่ได้เรียกวิธีการ ActionListener process="@this"จนกว่าฉันจะเพิ่ม นอกจากนี้คู่มือผู้ใช้ PrimeFaces จะแสดงรายการค่าเริ่มต้นที่ฉันกล่าวไว้อย่างชัดเจนในหัวข้อ 3.18 และ 3.19 อยู่ที่นี่: primefaces.googlecode.com/files/primefaces_users_guide_3_4.pdf ... อาจมีการเปลี่ยนแปลงค่าเริ่มต้นหรือไม่
Kawu

8
อาจเป็นข้อผิดพลาดในเอกสารประกอบ ลบprocess="@this"และเพิ่ม<p:messages autoUpdate="true">(หรือเพียงแค่อ่านบันทึกเซิร์ฟเวอร์สำหรับข้อความที่อยู่ในคิว แต่ไม่แสดง) และคุณจะเห็นว่าจริงๆแล้วเกิดข้อผิดพลาดในการแปลง / การตรวจสอบความถูกต้องเกิดขึ้น
BalusC

ทำไมคุณลบคำถามนี้stackoverflow.com/questions/60673695/…
Kukeltje

ฉันคิดว่ามันอาจไม่คุ้มค่ามากตอนนี้ ... ฉันยกเลิกการลบ
Kawu

9

ฉันจะพูดถึงอีกหนึ่งสิ่งที่เกี่ยวข้องกับ Primefaces p:commandButton !

เมื่อคุณใช้ a p:commandButtonสำหรับการกระทำที่ต้องทำบนเซิร์ฟเวอร์คุณไม่สามารถใช้งานได้type="button"เนื่องจากเป็นปุ่มกดที่ใช้ในการเรียกใช้จาวาสคริปต์ที่กำหนดเองโดยไม่ทำให้เกิดคำขอ ajax / non-ajax ไปยังเซิร์ฟเวอร์

สำหรับวัตถุประสงค์นี้คุณสามารถแจกจ่ายtypeแอตทริบิวต์ (ค่าเริ่มต้นคือ"submit") หรือคุณสามารถใช้อย่างชัดเจนtype="submit"หรือคุณสามารถใช้อย่างชัดเจน

หวังว่านี่จะช่วยใครซักคน!


นี่เป็นปัญหาหลักของฉันในหน้าใดหน้าหนึ่งของเราไม่มีประเด็นใดในคำตอบที่ยอมรับได้นำเราเข้ามาใกล้คุณพบข้อมูลนี้ที่ไหน
Uriel Arvizu

ฉันมีปัญหานั้นหลายครั้งและฉันค้นคว้าและพบว่าp:commandButtonมีคุณลักษณะหลายค่าtypeและbuttonเป็นปัญหาที่เกี่ยวข้องกับทุกอย่างเกี่ยวกับฝั่งไคลเอ็นต์ เป็นการยากที่จะหาสิ่งนี้ในPrimefacesdoc แต่นี่เป็นลิงก์เดียว: developer.am/primefaces/ …
akelec

คำแนะนำการส่งของคุณแก้ไขปัญหาที่ฉันเผชิญมาหลายวันแล้ว ขอบคุณมากโพสต์ของคุณ!
gpuk360

ขอบคุณมันเป็นความสุขของฉัน ฉันตั้งใจใส่คำตอบนี้เพราะพวกเราหลายคนมีปัญหาเช่นนี้ ฉันได้สูญเสียสองสามวันไปจนรู้ว่าอะไรเกี่ยวกับ
akelec

3

ติดอยู่กับปัญหานี้ด้วยตนเองและพบอีกสาเหตุหนึ่งสำหรับปัญหานี้ หากคุณไม่มีเมธอด setter ใน backup bean ของคุณสำหรับคุณสมบัติที่ใช้ใน * .xhtml ของคุณการดำเนินการจะไม่ถูกเรียกใช้


5
มันควรจะส่งผลให้ค่อนข้างอธิบายPropertyNotWritableExceptionตนเอง หากคุณไม่เห็นอาจเป็นไปได้ว่าคุณส่งคำขอ ajax โดยไม่มีตัวจัดการข้อยกเว้น ajax ที่เหมาะสม แต่คุณควรเห็นมันในบันทึกเซิร์ฟเวอร์
BalusC

3
มันไม่แสดงข้อยกเว้นนั้นจนกว่าฉันจะทำ p: commandButton's ajax = "false"
Dnavir

ขอบคุณพระเจ้าที่คุณช่วยชีวิตฉันไว้
exrezzo

3

ฉันเพิ่งพบปัญหากับ UICommand ไม่เรียกใช้ในแอ็พพลิเคชัน JSF 1.2 โดยใช้ IBM Extended Faces Components

ฉันมีปุ่มคำสั่งในแถวของ datatable (เวอร์ชันเพิ่มเติมดังนั้น <hx:datatable> ) และ UICommand จะไม่เริ่มทำงานจากแถวที่แน่นอนจากตาราง (แถวที่ไม่สามารถเปิดได้คือแถวที่มีขนาดใหญ่กว่าขนาดแถวเริ่มต้นที่แสดง)

ฉันมีองค์ประกอบแบบเลื่อนลงสำหรับการเลือกจำนวนแถวที่จะแสดง RequestScopeค่าการสำรองข้อมูลนี้อยู่ใน ข้อมูลที่สำรองไว้ในตารางนั้นอยู่ในประเภทViewScope(ในความเป็นจริงชั่วคราวSessionScope)

หากการแสดงแถวเพิ่มขึ้นผ่านการควบคุมค่าที่ถูกผูกไว้กับของ DataTable rowsแอ็ตทริบิวต์ไม่มีแถวใดที่แสดงผลของการเปลี่ยนแปลงนี้ที่สามารถใช้ UICommand ได้เมื่อคลิก

การวางแอ็ตทริบิวต์นี้ในขอบเขตเดียวกับข้อมูลตารางเองช่วยแก้ปัญหา

ฉันคิดว่านี่ถูกกล่าวถึงใน BalusC # 4 ด้านบน แต่ไม่เพียง แต่ค่าของตารางจะต้องมีการดูหรือกำหนดขอบเขต แต่ยังมีคุณลักษณะที่ควบคุมจำนวนแถวที่จะแสดงบนตารางนั้น


2

ฉันมีปัญหานี้เช่นกันและเพิ่งเริ่มต้นที่จะสืบหาสาเหตุที่แท้จริงหลังจากเปิดเว็บคอนโซลของเบราว์เซอร์ ก่อนหน้านั้นฉันไม่สามารถรับข้อความแสดงข้อผิดพลาด (แม้จะเป็น<p:messages>) เว็บคอนโซลแสดงให้เห็นรหัสสถานะ HTTP 405 <h:commandButton type="submit" action="#{myBean.submit}">กลับมาจาก

ในกรณีของฉันฉันมีการผสมผสานของ Vanilla HttpServlet ในการตรวจสอบ OAuth ผ่านทาง Auth0 และ JSF facelets และ beans ที่ใช้มุมมองแอปพลิเคชันและตรรกะทางธุรกิจของฉัน

เมื่อฉัน refactored web.xml ของฉันและลบคนกลาง servlet แล้วมัน "ทำงาน" อย่างน่าอัศจรรย์

บรรทัดล่างปัญหาคือ middle-man-servlet กำลังใช้ RequestDispatcher.forward (... ) เพื่อเปลี่ยนเส้นทางจากสภาพแวดล้อม HttpServlet ไปยังสภาพแวดล้อม JSF ขณะที่ servlet ถูกเรียกก่อนที่จะถูกเปลี่ยนเส้นทางด้วย HttpServletResponse.sendRedirect (.. .)

โดยพื้นฐานแล้วการใช้ sendRedirect () อนุญาตให้ JSF "container" สามารถควบคุมได้ในขณะที่ RequestDispatcher.forward () ไม่ชัดเจน

สิ่งที่ฉันไม่ทราบคือเหตุผลที่ facelet สามารถเข้าถึงคุณสมบัติ bean แต่ไม่สามารถตั้งค่าได้และสิ่งนี้ส่งเสียงร้องอย่างชัดเจนด้วยการผสม servlets และ JSF แต่ฉันหวังว่าสิ่งนี้จะช่วยให้คนหลีกเลี่ยงการใช้เวลาหลายชั่วโมง - เพื่อตารางโผง


1

ฉันสนุกมากในการแก้ไขปัญหาที่การ<h:commandLink>กระทำของrichfaces datatableถูกปฏิเสธที่จะยิง ตารางเคยทำงานในบางจุด แต่หยุดโดยไม่มีเหตุผลชัดเจน ฉันไม่ปล่อยหินทิ้งไว้เพียงเพื่อจะพบว่าฉันrich:datatableใช้ผิดrowKeyConverterซึ่งคืนค่าโมฆะที่คนรวยใช้เป็นกุญแจแถวอย่างมีความสุข สิ่งนี้ทำให้<h:commandLink>การกระทำของฉันถูกเรียก


0

หนึ่งเป็นไปได้มากขึ้นถ้าอาการก็คือว่าการทำงานของการภาวนาแรก แต่คนที่ตามมาทำไม่คุณอาจจะใช้ PrimeFaces 3.x กับ JSF 2.2 ตามรายละเอียดที่นี่: ไม่มี ViewState จะถูกส่ง


-1

ฉันแก้ไขปัญหาด้วยการวาง:

<h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>

ใน:

<h:form>
     <h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>
</h:form>

นั่นคืออันดับที่ 1 ในคำตอบที่มากกว่า 600 คำตอบ ไม่จำเป็นต้องเขียนเป็นคำตอบแยกต่างหาก
Kukeltje

-1

นี่คือทางออกซึ่งใช้ได้สำหรับฉัน

<p:commandButton id="b1" value="Save" process="userGroupSetupForm"
                    actionListener="#{userGroupSetupController.saveData()}" 
                    update="growl userGroupList userGroupSetupForm" />

ที่นี่ process = "userGroupSetupForm" atrribute มีผลบังคับใช้สำหรับการโทร Ajax actionListener กำลังเรียกใช้เมธอดจาก @ViewScope Bean นอกจากนี้ยังปรับปรุงข้อความคำราม, DataTable: userGroupList และแบบฟอร์ม: userGroupSetupForm


-2
<ui:composition>  
  <h:form id="form1">
    <p:dialog id="dialog1">
      <p:commandButton value="Save" action="#{bean.method1}" /> <!--Working-->
    </p:dialog>
  </h:form>

  <h:form id="form2">
    <p:dialog id="dialog2">
      <p:commandButton value="Save" action="#{bean.method2}" /> <!--Not Working-->
    </p:dialog>
  </h:form>
</ui:composition>

เพื่อแก้ปัญหา;

<ui:composition>  
  <h:form id="form1">
    <p:dialog id="dialog1">
      <p:commandButton value="Save" action="#{bean.method1}" />   <!-- Working  -->
    </p:dialog>

    <p:dialog id="dialog2">
      <p:commandButton value="Save" action="#{bean.method2}" />   <!--Working  -->
    </p:dialog>
  </h:form>
  <h:form id="form2">
    <!-- ..........  -->
  </h:form>
</ui:composition>

ขออภัย แต่ในความเห็นต่ำต้อยของฉันไม่เป็นความจริง คุณได้อย่างมีประสิทธิภาพระบุว่า 2 กล่องโต้ตอบจะต้องอยู่ในรูปแบบของตัวเองในการทำงาน คุณที่มีความมั่นใจ 99% มีปัญหาที่แตกต่างกันซึ่งคุณได้แก้ไขแล้วและตอนนี้คุณคิดว่านี่เป็นวิธีแก้ปัญหา ...
Kukeltje

นี่คือหน้ารวม บางทีนี่อาจทำให้เกิดปัญหา คุณควรทดสอบก่อนลงคะแนน
Kenan Gökbak

ไม่คุณควรสร้าง ตัวอย่างที่ทำซ้ำได้เพียงเล็กน้อยก่อนที่จะโพสต์ (และหลังจากนั้นฉันสามารถทดสอบได้) ... และใช่รวมถึงอาจทำให้เกิดปัญหากับกล่องโต้ตอบและแบบฟอร์ม แต่ปัญหาก็ยังไม่ใช่สิ่งที่คุณต้องการแก้ไขที่นี่ . ตัวอย่างแรกของคุณนั้นสมบูรณ์แบบและอย่างที่สองคือความมั่นใจ 100% ไม่ใช่วิธีการแก้ปัญหาที่ไม่มีอยู่จริง
Kukeltje

อย่างไรก็ตาม. แอปพลิเคชันของฉันทำงานได้ดี ฉันคิดว่ามันไม่สำคัญที่กล่องโต้ตอบในแบบฟอร์ม ฉันต้องสร้างแบบฟอร์มที่สองเพื่อแก้ไขปัญหาอื่น
Kenan Gökbak

แอปพลิเคชันของคุณอาจทำงานได้ แต่ไม่ชัดเจน / มองเห็นได้จากปัญหาดั้งเดิมและวิธีแก้ปัญหาของคุณ นอกจากนี้คุณพูดว่า _ "ฉันคิดว่ามันไม่สำคัญที่กล่องโต้ตอบในแบบฟอร์ม" _But แต่ในคำตอบของคุณดูเหมือนว่ามันจะเป็นสิ่งสำคัญที่พวกเขาอยู่ ความขัดแย้งที่สนับสนุนคำสั่งของฉัน ขออภัยคำตอบของคุณชัดเจนผิด ... (มี downvote อีกอันอยู่แล้ว)
Kukeltje
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.