Phương thức lệnhButton / commandLink / ajax hành động / người nghe không được gọi hoặc giá trị đầu vào không được đặt / cập nhật


345

Đôi khi, khi sử dụng <h:commandLink>, <h:commandButton>hoặc <f:ajax>, sự action, actionListenerhoặc listenerphương pháp liên quan đến thẻ chỉ đơn giản là không được gọi. Hoặc, các thuộc tính bean không được cập nhật với UIInputcác giá trị được gửi .

Các nguyên nhân và giải pháp có thể cho việc này là gì?

Câu trả lời:


687

Giới thiệu

Bất cứ khi nào một UICommandthành phần ( <h:commandXxx>, <p:commandXxx>v.v.) không thể gọi phương thức hành động được liên kết hoặc một UIInputthành phần ( <h:inputXxx>, <p:inputXxxx>v.v.) không xử lý các giá trị được gửi và / hoặc cập nhật các giá trị mô hình, và bạn không thấy bất kỳ trường hợp ngoại lệ nào và / hoặc cảnh báo trong nhật ký máy chủ, cũng không phải khi bạn định cấu hình trình xử lý ngoại lệ ajax theo xử lý Ngoại lệ trong các yêu cầu ajax của JSF , cũng như khi bạn đặt bên dưới tham số ngữ cảnh web.xml,

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

và bạn cũng không thấy bất kỳ lỗi nào và / hoặc cảnh báo trong bảng điều khiển JavaScript của trình duyệt (nhấn F12 trong Chrome / Firefox23 + / IE9 + để mở bộ công cụ dành cho nhà phát triển web và sau đó mở tab Console ), sau đó tìm hiểu danh sách các nguyên nhân có thể bên dưới.

Nguyên nhân có thể

  1. UICommandUIInputcác thành phần phải được đặt bên trong một UIFormthành phần, ví dụ <h:form>(và do đó không phải là HTML đơn giản <form>), nếu không, không có gì có thể được gửi đến máy chủ. UICommandcác thành phần cũng không được có type="button"thuộc tính, nếu không nó sẽ là một nút chết chỉ hữu ích cho JavaScript onclick. Xem thêm Cách gửi các giá trị đầu vào của biểu mẫu và gọi một phương thức trong bean JSF<h: commandButton> không khởi tạo một postback .

  2. Bạn không thể lồng nhiều UIFormthành phần vào nhau. Điều này là bất hợp pháp trong HTML. Các hành vi trình duyệt là không xác định. Xem ra với các tập tin bao gồm! Bạn có thể sử dụng UIFormcác thành phần song song, nhưng chúng sẽ không xử lý lẫn nhau trong khi gửi. Bạn cũng nên coi chừng với antipotype "God Form"; đảm bảo rằng bạn không vô tình xử lý / xác nhận tất cả các đầu vào (vô hình) khác trong cùng một hình thức (ví dụ: có một hộp thoại ẩn với các đầu vào bắt buộc trong cùng một hình thức). Xem thêm Cách sử dụng <h: form> trong trang JSF? Mẫu đơn? Nhiều hình thức? Hình thức lồng nhau? .

  3. Không có UIInputlỗi xác thực / chuyển đổi giá trị đã xảy ra. Bạn có thể sử dụng <h:messages>để hiển thị bất kỳ thông báo nào không được hiển thị bởi bất kỳ <h:message>thành phần cụ thể đầu vào nào . Đừng quên để bao gồm các idsố <h:messages>trong <f:ajax render>, nếu có, để nó sẽ được cập nhật khi tốt trên các yêu cầu ajax. Xem thêm h: tin nhắn không hiển thị tin nhắn khi nhấn p: CommandButton .

  4. Nếu UICommandhoặc UIInputcác thành phần được đặt bên trong một thành phần lặp như <h:dataTable>, <ui:repeat>v.v., thì bạn cần đảm bảo rằng chính xác cùng một valuethành phần lặp được bảo toàn trong giai đoạn giá trị yêu cầu áp dụng của yêu cầu gửi biểu mẫu. JSF sẽ nhắc lại để tìm liên kết / nút được nhấp và gửi các giá trị đầu vào. Đặt bean trong phạm vi khung nhìn và / hoặc đảm bảo rằng bạn tải mô hình dữ liệu trong @PostConstructbean (và do đó không phải trong phương thức getter!) Sẽ sửa nó. Xem thêm Làm thế nào và khi nào tôi nên tải mô hình từ cơ sở dữ liệu cho h: dataTable .

  5. Nếu UICommandhoặc UIInputcác thành phần được bao gồm bởi một nguồn động như <ui:include src="#{bean.include}">, thì bạn cần đảm bảo rằng chính xác cùng một #{bean.include}giá trị được bảo toàn trong thời gian xây dựng chế độ xem của yêu cầu gửi biểu mẫu. JSF sẽ kiểm tra lại nó trong khi xây dựng cây thành phần. Đặt bean trong phạm vi khung nhìn và / hoặc đảm bảo rằng bạn tải mô hình dữ liệu vào @PostConstructbean (và do đó không phải trong phương thức getter!) Sẽ sửa nó. Xem thêm Làm thế nào để ajax-refresh động bao gồm nội dung bằng menu điều hướng? (JSF SPA) .

  6. Các renderedthuộc tính của các thành phần và tất cả các bậc phụ huynh và các testthuộc tính của bất kỳ cha mẹ <c:if>/ <c:when>không nên đánh giá để falsetrong áp dụng yêu cầu giá trị giai đoạn của hình thức gửi yêu cầu. JSF sẽ kiểm tra lại nó như là một phần của biện pháp bảo vệ chống lại các yêu cầu bị can thiệp / hack. Lưu trữ các biến chịu trách nhiệm cho điều kiện trong một @ViewScopedbean hoặc đảm bảo rằng bạn đang chuẩn bị trước một cách chính xác điều kiện trong @PostConstructmột @RequestScopedbean sẽ khắc phục nó. Điều tương tự cũng áp dụng cho disabledthuộc tính của thành phần, không nên đánh giá truetrong giai đoạn áp dụng các giá trị yêu cầu. Xem thêm Hành động CommandButton của JSF không được gọi , Biểu mẫu gửi trong thành phần được hiển thị có điều kiện không được xử lýh: lệnhButton không hoạt động khi tôi gói nó trong <h: panelgroup được kết xuất> .

  7. Các onclickthuộc tính của UICommandthành phần và các onsubmitthuộc tính của các UIFormthành phần không phải trả lại falsehoặc gây ra một lỗi JavaScript. Trong trường hợp nên <h:commandLink>hoặc <f:ajax>không có lỗi JS hiển thị trong bảng điều khiển JS của trình duyệt. Thông thường googling thông báo lỗi chính xác sẽ cung cấp cho bạn câu trả lời. Xem thêm Thủ công thêm / tải jQuery với các kết quả PrimeFaces trong Uncaught TypeErrors .

  8. Nếu bạn đang sử dụng Ajax thông qua JSF 2.x <f:ajax>hoặc ví dụ PrimeFaces <p:commandXxx>, hãy đảm bảo rằng bạn có một <h:head>mẫu chính thay vì <head>. Mặt khác, JSF sẽ không thể tự động bao gồm các tệp JavaScript cần thiết có chứa các hàm Ajax. Điều này sẽ dẫn đến một lỗi JavaScript như "mojarra không được xác định" hoặc "PrimeFaces không được xác định" trong bảng điều khiển JS của trình duyệt. Xem thêm h: CommandLink actionlistener không được gọi khi được sử dụng với f: ajax và ui: repeat .

  9. Nếu bạn đang sử dụng Ajax, và các giá trị nộp kết thúc được null, sau đó hãy chắc chắn rằng UIInputUICommandcác thành phần quan tâm được bao phủ bởi <f:ajax execute>hoặc ví dụ như <p:commandXxx process>, nếu không họ sẽ không được thực hiện / xử lý. Xem thêm Các giá trị biểu mẫu đã gửi không được cập nhật trong mô hình khi thêm <f: ajax> vào <h: commandButton>Tìm hiểu quy trình / cập nhật PrimeFaces và JSF f: ajax thực thi / kết xuất các thuộc tính .

  10. Nếu các giá trị được gửi vẫn kết thúc nullvà bạn đang sử dụng CDI để quản lý các bean, thì hãy đảm bảo rằng bạn nhập chú thích phạm vi từ gói chính xác, CDI khác sẽ mặc định @Dependenttạo lại bean một cách hiệu quả trên mỗi đánh giá EL biểu hiện. Xem thêm @SessionScoped bean mất phạm vi và được tạo lại mọi lúc, các trường trở thành nullPhạm vi Bean được quản lý mặc định trong ứng dụng JSF 2 là gì?

  11. Nếu phụ huynh của <h:form>các UICommandnút được trước được trả lại / cập nhật bởi một yêu cầu ajax đến từ một hình thức trong cùng một trang, sau đó hành động đầu tiên sẽ luôn luôn thất bại trong JSF 2.2 trở lên. Các hành động thứ hai và tiếp theo sẽ hoạt động. Điều này được gây ra bởi một lỗi trong xử lý trạng thái xem được báo cáo là sự cố thông số kỹ thuật JSF 790 và hiện đã được sửa trong JSF 2.3. Đối với phiên bản JSF cũ hơn, bạn cần phải xác định một cách rõ ràng ID của <h:form>trong rendercủa <f:ajax>. Xem thêm h: lệnhButton / h: lệnhLink không hoạt động ở lần nhấp đầu tiên, chỉ hoạt động ở lần nhấp thứ hai .

  12. Nếu <h:form>đã enctype="multipart/form-data"được đặt để hỗ trợ tải lên tệp, thì bạn cần đảm bảo rằng bạn đang sử dụng ít nhất là JSF 2.2 hoặc bộ lọc servlet chịu trách nhiệm phân tích các yêu cầu dữ liệu đa dữ liệu / biểu mẫu được định cấu hình đúng, nếu không thì FacesServletsẽ cuối cùng không nhận được tham số yêu cầu nào và do đó không thể áp dụng các giá trị yêu cầu. Cách định cấu hình bộ lọc như vậy tùy thuộc vào thành phần tải lên tệp đang được sử dụng. Đối với Tomahawk <t:inputFileUpload>, hãy kiểm tra câu trả lời này và cho PrimeFaces <p:fileUpload>, kiểm tra câu trả lời này . Hoặc, nếu bạn thực sự không tải lên một tệp nào, thì hãy xóa thuộc tính hoàn toàn.

  13. Hãy chắc chắn rằng ActionEventđối số actionListenerjavax.faces.event.ActionEventvà do đó không phải java.awt.event.ActionEventlà điều mà hầu hết các IDE đề xuất là tùy chọn tự động hoàn thành thứ nhất. Không có đối số là sai nếu bạn sử dụng actionListener="#{bean.method}". Nếu bạn không muốn một đối số trong phương thức của mình, hãy sử dụng actionListener="#{bean.method()}". Hoặc có lẽ bạn thực sự muốn sử dụng actionthay vì actionListener. Xem thêm Sự khác biệt giữa hành động và actionListener .

  14. Đảm bảo rằng không có PhaseListenerhoặc bất kỳ EventListenerchuỗi nào trong chuỗi phản hồi yêu cầu đã thay đổi vòng đời của JSF để bỏ qua giai đoạn gọi hành động bằng cách gọi FacesContext#renderResponse()hoặc gọi FacesContext#responseComplete().

  15. Đảm bảo rằng không có Filterhoặc Servlettrong cùng chuỗi phản hồi yêu cầu đã chặn yêu cầu đối với một FacesServletcách nào đó. Ví dụ: các bộ lọc đăng nhập / bảo mật như Spring Security. Đặc biệt trong các yêu cầu ajax theo mặc định sẽ không có phản hồi UI nào cả. Xem thêm Xử lý yêu cầu AJAX của Spring Security 4 và PrimeFaces 5 .

  16. Nếu bạn đang sử dụng PrimeFaces <p:dialog>hoặc a <p:overlayPanel>, thì hãy chắc chắn rằng chúng có cái riêng <h:form>. Bởi vì, các thành phần này theo mặc định bởi JavaScript được chuyển đến cuối HTML <body>. Vì vậy, nếu ban đầu họ ngồi bên trong a <form>, thì bây giờ họ sẽ không còn ngồi trong a <form>nữa. Xem thêm p: lệnh hành động không hoạt động trong hộp thoại p:

  17. Lỗi trong khung. Ví dụ: RichFaces có " lỗi chuyển đổi " khi sử dụng rich:calendarphần tử UI có defaultLabelthuộc tính (hoặc trong một số trường hợp là rich:placeholderphần tử phụ). Lỗi này ngăn phương thức bean được gọi khi không có giá trị nào được đặt cho ngày theo lịch. Theo dõi lỗi khung có thể được thực hiện bằng cách bắt đầu với một ví dụ hoạt động đơn giản và xây dựng trang sao lưu cho đến khi lỗi được phát hiện.

Gợi ý gỡ lỗi

Trong trường hợp bạn vẫn còn mắc kẹt, đã đến lúc gỡ lỗi. Ở phía máy khách, nhấn F12 trong webbrowser để mở bộ công cụ phát triển web. Nhấp vào tab Bảng điều khiển để xem tập hợp JavaScript. Nó sẽ không có bất kỳ lỗi JavaScript nào. Ảnh chụp màn hình bên dưới là một ví dụ từ Chrome minh họa trường hợp gửi <f:ajax>nút được bật trong khi chưa <h:head>khai báo (như được mô tả trong điểm 7 ở trên).

bảng điều khiển js

Nhấp vào tab Mạng để xem trình giám sát lưu lượng HTTP. Gửi biểu mẫu và điều tra nếu các tiêu đề yêu cầu và dữ liệu biểu mẫu và cơ quan phản hồi theo mong đợi. Dưới đây ảnh chụp màn hình là một ví dụ từ Chrome thể hiện việc gửi ajax thành công ở dạng đơn giản với một <h:inputText>và một đơn <h:commandButton>với <f:ajax execute="@form" render="@form">.

giám sát mạng

(cảnh báo: khi bạn đăng ảnh chụp màn hình từ các tiêu đề yêu cầu HTTP như ở trên từ môi trường sản xuất, thì hãy đảm bảo bạn tranh giành / làm xáo trộn bất kỳ cookie phiên nào trong ảnh chụp màn hình để tránh các cuộc tấn công chiếm quyền điều khiển phiên!)

Ở phía máy chủ, đảm bảo rằng máy chủ được khởi động ở chế độ gỡ lỗi. Đặt một điểm dừng gỡ lỗi trong một phương thức của thành phần quan tâm JSF mà bạn muốn được gọi trong khi xử lý biểu mẫu gửi. Ví dụ, trong trường hợp UICommandthành phần, đó sẽ là UICommand#queueEvent()và trong trường hợp UIInputthành phần, đó sẽ là UIInput#validate(). Chỉ cần thực hiện từng bước thực thi mã và kiểm tra xem luồng và biến có theo mong đợi hay không. Dưới ảnh chụp màn hình là một ví dụ từ trình gỡ lỗi của Eclipse.

máy chủ gỡ lỗi


1
điểm thứ 2 của bạn làm tôi suy nghĩ - trong một thời gian dài. Tôi mới phát hiện ra rằng thẻ f: view trong tệp chính của tôi là nguyên nhân của hầu hết các vấn đề của tôi. Và có lẽ bởi vì nó làm cho một hình thức, phải không?
Paulo Guedes

2
@pauloguedes Tôi không thể tìm thấy bất cứ điều gì nói rằng f: view biểu hiện một biểu mẫu. Hiểu biết của tôi là nó chỉ là một container. Theo kinh nghiệm của tôi, f: view không hiển thị bất kỳ yếu tố nào.
Lucas

@balusc Một chút làm rõ ở điểm 4, nếu lệnhLink không nằm trong chính dataTable, liệu nó có còn quan trọng không?
Lucas

cảm ơn, vấn đề là điểm: Đặt bean trong phạm vi khung nhìn và / hoặc đảm bảo rằng bạn tải mô hình dữ liệu trong hàm tạo (post) của bean (và do đó không phải trong phương thức getter!) nên sửa nó.
merveotesi

2
@Kukeltje: điều đó sẽ ném ra một ngoại lệ EL (đã được nêu trong đoạn 1 trong câu trả lời)
BalusC

54

Nếu bạn h:commandLinkở trong h:dataTableđó, có một lý do khác khiến h:commandLinknó không hoạt động:

Nguồn dữ liệu cơ bản được ràng buộc với h:dataTablecũng phải có sẵn trong Vòng đời JSF thứ hai được kích hoạt khi nhấp vào liên kết.

Vì vậy, nếu nguồn dữ liệu cơ bản là phạm vi yêu cầu, thì h:commandLinknó không hoạt động!


2
Ok, điều đó không hoàn toàn rõ ràng với tôi. Tôi hy vọng câu trả lời của tôi vẫn hữu ích, vì trong trường hợp của tôi, ít nhất là tôi đã không giao dịch rõ ràng với UICommand / UIData. "Giải pháp" đã thúc đẩy một bean hậu thuẫn từ phạm vi yêu cầu đến phạm vi phiên ...
jbandi

1
Tôi nhận xét lần thứ hai của Jens ... việc đặt bean RequestScoped của tôi thành SessionScoped đã tạo ra sự khác biệt trên dataTable của tôi - cảm ơn
Zack Macomber

28

Mặc dù câu trả lời của tôi không thể áp dụng 100%, nhưng hầu hết các công cụ tìm kiếm đều thấy đây là lần truy cập đầu tiên, tôi quyết định đăng nó không mất thời gian:

Nếu bạn đang sử dụng PrimeFaces (hoặc một số API tương tự) p:commandButtonhoặc p:commandLink, rất có thể bạn đã quên bổ sung rõ ràng process="@this"vào các thành phần lệnh của mình.

Như hướng dẫn PrimeFaces của người sử dụng khẳng định trong phần 3.18, giá trị mặc định cho processupdateđều @form, có khá nhiều phản đối giá trị mặc định bạn có thể mong đợi từ JSF đồng bằng f:ajaxhoặc RichFaces, đó là execute="@this"render="@none"tương ứng.

Chỉ cần tôi mất một thời gian để tìm hiểu. (... và tôi nghĩ rằng việc sử dụng các giá trị mặc định khác với JSF là không rõ ràng!)


6
Mặc định cho PrimeFaces process@form. Vì vậy, nếu hành động không được gọi theo cách này, nhưng khi sử dụng @this, thì rất có thể điểm 3 trong câu trả lời của tôi được áp dụng.
BalusC

3
Điều này là không thể. Tôi đã có một p:commandButtonphương thức không gọi phương thức actionListener cho đến khi tôi thêm vào process="@this". Hơn nữa, Hướng dẫn sử dụng PrimeFaces liệt kê rõ ràng các mặc định tôi đã đề cập trong phần 3.18 và 3.19. Nó ở đây: primefaces.googlecode.com/files/primefaces_usftimeguide_3_4.pdf ... có lẽ các mặc định đã được thay đổi?
Kawu

8
Đây có thể là một lỗi trong tài liệu. Xóa process="@this"và thêm <p:messages autoUpdate="true">(hoặc chỉ đọc nhật ký máy chủ cho các tin nhắn được xếp hàng nhưng không hiển thị) và bạn sẽ thấy rằng thực sự đã xảy ra lỗi chuyển đổi / xác thực.
BalusC

Tại sao bạn xóa câu hỏi này stackoverflow.com/questions/60673695/ từ
Kukeltje

Tôi nghĩ rằng nó có thể không cung cấp nhiều giá trị bây giờ ... Tôi đã hoàn tác nó.
Kawu

9

Tôi sẽ đề cập đến một điều nữa liên quan đến Primefaces p:commandButton!

Khi bạn sử dụng một p:commandButtonhành động cần thực hiện trên máy chủ, bạn không thể sử dụng type="button"vì đó là cho các nút Push được sử dụng để thực thi javascript tùy chỉnh mà không gây ra yêu cầu ajax / non-ajax cho máy chủ.

Với mục đích này, bạn có thể phân phối typethuộc tính (giá trị mặc định là "submit") hoặc bạn có thể sử dụng rõ ràng type="submit".

Hy vọng điều này sẽ giúp được ai đó!


đây là vấn đề chính của tôi trong một trong những trang của chúng tôi, không có điểm nào trong câu trả lời được chấp nhận đưa chúng tôi đến gần hơn, bạn đã tìm thấy thông tin này ở đâu?
Uriel Arvizu

Chà, tôi đã gặp vấn đề đó nhiều lần, và tôi đã nghiên cứu và thấy rằng nó p:commandButtoncó một vài giá trị typethuộc tính, và buttonlà một vấn đề liên quan đến mọi thứ về phía khách hàng. Hơi khó tìm thấy điều này trong Primefacesdoc, nhưng đây là một liên kết: developer.am/primefaces/
mẹo

Gợi ý gửi của bạn đã giải quyết vấn đề của tôi, tôi đã phải đối mặt trong nhiều ngày. Cảm ơn rất nhiều bài viết của bạn!
gpuk360

Cảm ơn bạn, đó là niềm vui của tôi. Tôi cố tình đặt câu trả lời này vì nhiều người trong chúng ta gặp vấn đề như vậy. Tôi đã mất một vài ngày cho đến khi nhận ra những gì về.
akelec

3

Đã bị mắc kẹt với vấn đề này bản thân mình và tìm thấy một nguyên nhân nữa cho vấn đề này. Nếu bạn không có các phương thức setter trong bean hậu thuẫn cho các thuộc tính được sử dụng trong * .xhtml của bạn, thì hành động đơn giản là không được gọi.


5
Nó nên có kết quả trong một tự giải thích khá PropertyNotWritableException. Nếu bạn không nhìn thấy nó, có lẽ bạn đã yêu cầu ajax mà không có trình xử lý ngoại lệ ajax thích hợp, nhưng bạn sẽ thấy nó trong nhật ký máy chủ.
BalusC

3
Nó không thể hiện ngoại lệ đó cho đến khi tôi tạo p: commandButton's ajax = "false".
Dnavir

THANK GOD bạn đã cứu cuộc đời tôi
exrezzo

3

Gần đây tôi đã gặp phải một vấn đề với một UICommand không gọi trong ứng dụng JSF 1.2 bằng cách sử dụng các thành phần mở rộng của IBM.

Tôi đã có một nút lệnh trên một hàng có thể truy cập được (phiên bản mở rộng, vì vậy <hx:datatable>) và UICommand sẽ không bắn từ một số hàng nhất định từ bảng (các hàng không bắn là các hàng lớn hơn kích thước hiển thị hàng mặc định).

Tôi đã có một thành phần thả xuống để chọn số lượng hàng để hiển thị. Giá trị ủng hộ lĩnh vực này là trong RequestScope. Dữ liệu sao lưu chính bảng là một loại ViewScope(trong thực tế, tạm thời SessionScope).

Nếu hiển thị hàng được tăng lên thông qua điều khiển, giá trị nào cũng được liên kết với rowsthuộc tính của dữ liệu, thì không có hàng nào được hiển thị do thay đổi này có thể kích hoạt UICommand khi được nhấp.

Đặt thuộc tính này trong cùng phạm vi với chính dữ liệu bảng đã khắc phục sự cố.

Tôi nghĩ rằng điều này được ám chỉ trong BalusC # 4 ở trên, nhưng không chỉ giá trị bảng cần phải là Chế độ xem hoặc Phiên mà còn thuộc tính kiểm soát số lượng hàng để hiển thị trên bảng đó.


2

Tôi cũng gặp vấn đề này và chỉ thực sự bắt đầu khắc phục nguyên nhân gốc sau khi mở bảng điều khiển web của trình duyệt. Cho đến lúc đó, tôi không thể nhận được bất kỳ thông báo lỗi nào (ngay cả với <p:messages>). Bảng điều khiển web hiển thị mã trạng thái HTTP 405 trở lại từ <h:commandButton type="submit" action="#{myBean.submit}">.

Trong trường hợp của tôi, tôi có một hỗn hợp vanilla httpServlet cung cấp xác thực OAuth thông qua các mặt và Auth0 và JSF thực hiện các quan điểm ứng dụng và logic kinh doanh của tôi.

Khi tôi đã cấu trúc lại tệp web.xml của mình và xóa một người trung gian, nó sẽ hoạt động "một cách kỳ diệu".

Điểm mấu chốt, vấn đề là người trung gian đã sử dụng RequestDispatcher.forward (...) để chuyển hướng từ môi trường HttpServlet sang môi trường JSF trong khi servlet được gọi trước đó đang chuyển hướng với HttpServletResponse.sendRedirect (.. .).

Về cơ bản, việc sử dụng sendRedirect () đã cho phép "vùng chứa" JSF kiểm soát trong khi RequestDispatcher.forward () rõ ràng là không.

Điều tôi không biết là tại sao facelet có thể truy cập vào các thuộc tính của bean nhưng không thể thiết lập chúng, và điều này rõ ràng hét lên vì đã làm mất đi sự pha trộn của các servlet và JSF, nhưng tôi hy vọng điều này sẽ giúp ai đó tránh được nhiều giờ. để bàn đập.


1

Tôi đã có rất nhiều niềm vui để gỡ lỗi một vấn đề trong đó <h:commandLink>hành động của một richfaces datatabletừ chối bắn. Bảng được sử dụng để làm việc tại một số điểm nhưng không có lý do rõ ràng. Tôi không để lại bất kỳ hòn đá nào, chỉ để phát hiện ra rằng tôi rich:datatableđã sử dụng sai rowKeyConvertermà trả về null mà không gian phong phú vui vẻ sử dụng làm khóa hàng. Điều này ngăn <h:commandLink>hành động của tôi được gọi.



-1

Tôi đã khắc phục vấn đề của mình bằng cách đặt:

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

Trong:

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

Đó là số 1 trong> 600 câu trả lời nâng cao. Không cần phải viết nó như một câu trả lời riêng biệt.
Kukeltje

-1

Đây là giải pháp, được làm việc cho tôi.

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

Ở đây, quy trình = "usergroupsetupForm" là bắt buộc đối với lệnh gọi Ajax. actionListener đang gọi một phương thức từ @ViewScope Bean. Đồng thời cập nhật thông báo gầm gừ, Đạt được: usergroupList và Form: 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>

Để giải quyết;

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

Xin lỗi, nhưng đây là ý kiến ​​khiêm tốn của tôi hoàn toàn không đúng sự thật. Bạn nói rõ rằng 2 hộp thoại cần phải ở dạng riêng để hoạt động. Bạn chắc chắn 99% có một vấn đề khác mà bạn đã giải quyết và hiện tại bạn nghĩ đây là giải pháp ...
Kukeltje

Đây là trang bao gồm. Có lẽ điều này có thể gây ra vấn đề. Bạn nên kiểm tra nó trước khi bỏ phiếu.
Kenan Gökbak

Không, bạn nên tạo một ví dụ có thể lặp lại tối thiểu trước khi đăng (và chỉ sau đó tôi có thể kiểm tra) ... Và có bao gồm có thể dẫn đến các vấn đề với hộp thoại và biểu mẫu, nhưng vấn đề vẫn không phải là điều bạn muốn giải quyết ở đây . Ví dụ đầu tiên của bạn là hoàn toàn tốt và thứ hai là chắc chắn 100% không phải là giải pháp cho một vấn đề không tồn tại
Kukeltje

Dù sao. Ứng dụng của tôi hoạt động tốt. Tôi nghĩ nó không quan trọng trong hộp thoại trong mẫu. Tôi phải tạo một hình thức thứ hai để giải quyết vấn đề khác.
Kenan Gökbak

Ứng dụng của bạn có thể đang hoạt động, nhưng điều đó không rõ ràng / có thể nhìn thấy từ một vấn đề ban đầu và giải pháp 'của bạn. Bên cạnh đó, bạn nói _ "Tôi nghĩ việc hộp thoại trong biểu mẫu không quan trọng." _Nhưng trong câu trả lời của bạn, điều đó có vẻ quan trọng ở nơi chúng. Một mâu thuẫn ủng hộ tuyên bố của tôi. Xin lỗi, nhưng câu trả lời của bạn hoàn toàn sai ... (đã có một downvote khác trên đó)
Kukeltje
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.