2010-01-18 21 views
5

Jacob Orshalick (tác giả của Seam Khung: Trải nghiệm Sự phát triển của Java EE) cho biết:Loại trừ đường may sẽ bị xóa?

Outjection phép bạn thực hiện các biến sẵn từ bối cảnh hiện nay để tiêm hoặc truy cập thông qua EL. Điều này có thể mang lại lợi ích nếu bạn muốn ghép nối một vài thành phần khác nhau để chèn cùng một biến ngữ cảnh (giống như người dùng hiện tại, khách sạn đang được đặt, vv). Nếu bạn muốn tránh bị từ chối, cách khác là sử dụng phương pháp @Factory hoặc đặt giá trị trực tiếp vào ngữ cảnh thông qua: Contexts.getConversationContext(). Set ("myVarName", myVar)

Lợi ích khác là hiệu suất. Bằng cách đưa ra một giá trị cho ngữ cảnh, bạn có thể bỏ qua việc phải vượt qua thành phần của mình để nhận được giá trị đó. Điều này đặc biệt áp dụng trong trường hợp các bảng dữ liệu với JSF (xem thảo luận này). Nhưng, như bạn sẽ thấy trong cuộc thảo luận, bạn cũng có thể sử dụng @BypassInterceptors để đạt được cùng một lợi ích.

Từ chối thực sự là một sự tiện lợi, nhưng những lợi ích tương tự chắc chắn có thể đạt được thông qua các phương tiện khác. Lưu ý rằng việc loại bỏ không được bao gồm trong Web Beans và sẽ bị phản đối hoặc loại bỏ hoàn toàn trong Seam 3, vì vậy đây là lý do để tránh nó khi có thể.

Chúng tôi có một đơn đăng ký có nhiều đề xuất và chúng tôi đã bắt đầu loại bỏ chúng. Anh ấy nói:

nhưng cùng một lợi ích chắc chắn có thể đạt được thông qua các phương tiện khác.

nhưng các phương tiện khác này là gì? Làm thế nào để loại bỏ các từ tính? Trong ASP.NET ví dụ bạn có các biến phiên. Trong Seam, bạn có thể loại bỏ var trong phiên (một lợi ích trong một số tình huống).

Hoặc phạm vi trang: (ví dụ trong chu kỳ jsf, bean sao lưu được gọi nhiều lần (đôi khi). Bạn có tài khoản được tải từ một tham số trang tài khoảnId. Bạn có thể tải tài khoản, từ chối nó với phạm vi trang OR (để tránh bị từ chối) là có một phương thức loadAccount(), nơi bạn lấy tài khoản từ db bất cứ khi nào bạn cần nó ... WORST!)

Tôi không nghĩ rằng:

Contexts.getConversationContext().set("myVarName", myVar) 

là một phương pháp để tránh bị từ chối.

Điều này chỉ gọi cùng một ngữ cảnh mà biến bị loại bỏ được lưu và sửa đổi nó theo một cách sâu sắc (tôi nghĩ đó chính xác là những gì @Out làm trong nền).

Câu hỏi 1: Bạn nghĩ gì về ý định của họ? Bạn có thông tin cụ thể về cách họ sẽ thay thế nó?

Câu hỏi 2: Làm cách nào để tránh sử dụng tính năng loại bỏ?

Xin cảm ơn trước.

Trả lời

5

Tôi nghĩ cách tốt nhất bạn có thể đạt được "từ chối" là sử dụng @Factory.Ưu điểm của nó:

  • Nó có thể là @ In-jected thành phần khác
  • Nó có thể tạo ra bất kỳ giá trị, không chỉ là thành phần dụ
  • Nó tính giá trị một lần, và chỉ một lần
  • Nó có thể được kích hoạt bởi trang JSF (Tôi không chắc chắn liệu bạn có phải bật Quản lý giao dịch Seam để có được tính năng này) không.

Vì vậy, nếu bạn có trang JSF cần truy cập @Factory nhiều lần, đó là tính toán chỉ onc e. Nếu một giá trị cần phải được tính toán mỗi khi nó được yêu cầu, vì vậy bạn cần một phương pháp @Unwrap. Ví dụ, # {currentDate} built-in thành phần được thực hiện như sau

@Name("org.jboss.seam.faces.facesContext") 
@Scope(ScopeType.STATELESS) // ScopeType.STATELESS is similar to Spring prototype scope 
public class CurrentDate { 
    @Unwrap 
    public Date getCurrentDate() { 
     return new java.sql.Date(System.currentTimeMillis()); 
    } 
} 

regards,

3

Để tránh outjection chỉ cần thêm một getter đến lĩnh vực của bạn trong đậu ủng hộ của bạn, vì vậy thay vì:

@Name("myBean") 
public class MyBean{ 
    @Out 
    private SomeBean someBean; 

} 

bạn sẽ có:

@Name("myBean") 
public class MyBean{ 
    private SomeBean someBean; 

    public SomeBean getSomeBean(){ 
     return someBean; 
    } 
} 

và xhtml của bạn/jsp nộp bạn sẽ phải gọi getter thay vào đó nhưng điều này cũng có một số vấn đề vì mỗi khi bạn gọi getter tất cả các Interceptor Seam sẽ được áp dụng cho cuộc gọi đó, do đó bạn có thể sẽ cần thêm @BypassInterceptors để ngăn chặn điều đó xảy ra.

Và vâng tôi cũng nghĩ rằng

Contexts.getConversationContext().set("myVarName", myVar) 

chỉ là làm những gì outject làm nhưng bằng tay.

+0

hi, bạn có thể cho tôi biết cách đạt được dưới đây trong đường may 3 ?? Contexts.getConversationContext(). Set ("myVarName", myVar) –

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