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.
UICommand
và UIInput
các thành phần phải được đặt bên trong một UIForm
thà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ủ. UICommand
cá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 và <h: commandButton> không khởi tạo một postback .
Bạn không thể lồng nhiều UIForm
thà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 UIForm
cá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? .
Không có UIInput
lỗ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 id
số <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 .
Nếu UICommand
hoặc UIInput
cá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 value
thà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 @PostConstruct
bean (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 .
Nếu UICommand
hoặc UIInput
cá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 @PostConstruct
bean (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) .
Các rendered
thuộc tính của các thành phần và tất cả các bậc phụ huynh và các test
thuộc tính của bất kỳ cha mẹ <c:if>
/ <c:when>
không nên đánh giá để false
trong á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 @ViewScoped
bean 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 @PostConstruct
một @RequestScoped
bean sẽ khắc phục nó. Điều tương tự cũng áp dụng cho disabled
thuộc tính của thành phần, không nên đánh giá true
trong 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ý vàh: lệnhButton không hoạt động khi tôi gói nó trong <h: panelgroup được kết xuất> .
Các onclick
thuộc tính của UICommand
thành phần và các onsubmit
thuộc tính của các UIForm
thành phần không phải trả lại false
hoặ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 .
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 .
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 UIInput
và UICommand
cá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> và 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 .
Nếu các giá trị được gửi vẫn kết thúc null
và 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 @Dependent
tạ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 null và Phạm vi Bean được quản lý mặc định trong ứng dụng JSF 2 là gì?
Nếu phụ huynh của <h:form>
các UICommand
nú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 render
củ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 .
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ì FacesServlet
sẽ 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.
Hãy chắc chắn rằng ActionEvent
đối số actionListener
là javax.faces.event.ActionEvent
và do đó không phải java.awt.event.ActionEvent
là đ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 action
thay vì actionListener
. Xem thêm Sự khác biệt giữa hành động và actionListener .
Đảm bảo rằng không có PhaseListener
hoặc bất kỳ EventListener
chuỗ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()
.
Đảm bảo rằng không có Filter
hoặc Servlet
trong cùng chuỗi phản hồi yêu cầu đã chặn yêu cầu đối với một FacesServlet
cá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 .
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:
Lỗi trong khung. Ví dụ: RichFaces có " lỗi chuyển đổi " khi sử dụng rich:calendar
phần tử UI có defaultLabel
thuộc tính (hoặc trong một số trường hợp là rich:placeholder
phầ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.
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).
Ở 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 UICommand
thành phần, đó sẽ là UICommand#queueEvent()
và trong trường hợp UIInput
thà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.