2012-10-01 43 views
7

Tôi đang xây dựng một ứng dụng web bằng cách sử dụng JSF/Primefaces. Tôi cần phải có một lớp "hằng số", tức là một lớp sẽ bao gồm các hằng số. Các hằng số này chủ yếu là các lệnh điều hướng sẽ được sử dụng trong suốt ứng dụng. Lý do tôi làm điều này là để tránh có các chuỗi được tạo ra ngay trên cơ sở đặc biệt.Có một lớp "hằng số" trong JSF

Làm cách nào để đạt được điều này, làm cho các hằng số có thể truy cập từ cả tệp sao lưu và tệp XHTML?

Tôi đã thử sử dụng @ApplicationScoped và sử dụng mẫu Singleton (lớp Singleton) nhưng tôi không thể làm cho nó hoạt động do các vấn đề về phạm vi.

Hoặc có thể tôi chỉ đang sử dụng phương pháp sai. Bất kỳ ý tưởng/đề xuất được chào đón.

+0

Tại sao bạn không có lớp học với 'chuỗi cuối cùng tĩnh công cộng page1 =" page1.xhtml "'. Hãy nhớ rằng lớp này sẽ được sử dụng trong các bean được quản lý của bạn. Nếu bạn định sử dụng bất kỳ giá trị nào trong số các giá trị này trong mã JSF của mình, thì bạn có thể thêm @ApplicationScope vào lớp và getters cho 'String' mà bạn sẽ sử dụng. –

+0

Bạn có thể giải thích bằng một ví dụ không? – javaMS

Trả lời

12

Làm cách nào để đạt được điều này, làm cho các hằng số có thể truy cập từ cả tệp sao lưu và tệp XHTML?

Trong hạt sao lưu, điều này rõ ràng là dễ dàng. Vì chúng chỉ là các lớp Java, nó không khác với cách Java "bình thường". Bạn có thể sử dụng các trường enum s hoặc public static final. Theo quan điểm, đây là một câu chuyện khác. Cho đến phiên bản 3.0 sắp tới, EL không có nghĩa là không hỗ trợ các hằng số theo bất kỳ cách nào.

Tôi khuyên bạn nên sử dụng enums vì EL đã hỗ trợ tiềm ẩn cho chúng trong các so sánh chuỗi. Nó không thực hiện bất kỳ kiểm tra an toàn kiểu nén/thời gian chạy nào, nhưng bạn có thể sử dụng tên enum dưới dạng một chuỗi. Ví dụ.

<h:someComponent ... rendered="#{order.status == 'SHIPPING'}" /> 

Nếu bạn thích nhiều mã tự chủ tài liệu và một tấm séc runtime (không, một tấm séc compiletime là không thể), sau đó bạn có thể xem xét sử dụng OmniFaces<o:importConstants>.

<o:importConstants type="com.example.OrderStatus" /> 
<h:someComponent ... rendered="#{order.status == OrderStatus.SHIPPING}" /> 

Đây là IMO chỉ hơi vụng về hơn một chút. Việc kiểm tra thời gian chạy là tuy nhiên tốt đẹp trong quá trình phát triển. Một lỗi đánh máy dễ dàng được giám sát.

Trong EL 3.0 sắp tới (JSR-341, một phần của Java EE 7), có thể tham chiếu các hằng số theo cùng một cách. Xem thêm How to reference constants in EL? Điều này chỉ yêu cầu nhập có lập trình các hằng số vì không có thẻ JSP/Facelets chuẩn cho điều đó.

+0

Tôi đã sử dụng enums và chúng hoạt động tốt ở cấp độ bean. Tuy nhiên, khi tôi cố gắng sử dụng omnifaces để nhập enum tôi nhận được một ngoại lệ. Quan điểm của tôi có điều này: và sau đó tôi có công cộng String thêm (đối tượng Object, Object lệnh) {(...) NavigationHelper nh = (NavigationHelper) lệnh; trong đậu. Ngoại lệ là java.lang.NullPointerException – javaMS

+0

Ok, tôi đã tìm thấy sự cố. Tôi phải đặt trong kho khóa . Tôi đã đặt nó bên ngoài nó dẫn đến ngoại lệ này. Bạn có thể giải thích những gì bạn có nghĩa là bởi vụng về? – javaMS

+0

Thẻ phải thực sự được đặt bên trong chế độ xem chứ không phải bên ngoài. Nếu bạn đang sử dụng mẫu chính, bạn cũng có thể đặt nó ở đó, để bạn không cần lặp lại nó trên tất cả các ứng dụng mẫu. "Vụng về" có nghĩa là ở đây "không đủ đơn giản". Tôi thích sự đơn giản. – BalusC

Các vấn đề liên quan