2011-07-15 20 views
8

Tôi sắp bắt đầu với dự án điện tử sử dụng Struts 1.2. Không có kế hoạch chuyển sang khuôn khổ khác.Struts 1 ActionForms - Quy ước cho các ngày trong biểu mẫu là gì?

Tôi muốn biết quy ước khi xử lý ngày trong biểu mẫu là gì?

  1. Tôi có nên tạo biến ngày và tạo phương thức setDate(String date) nơi chuyển đổi sẽ xảy ra?

  2. Tạo biến ngày, setDate(Date date) và đăng ký công cụ chuyển đổi đặc biệt ở đâu đó trong chuỗi? (không biết nếu có thể)

  3. Tạo biến chuỗi, setDate(String date) và để chuyển đổi/xác thực thành phương pháp validate trong bean ActionForm?

Hoặc cách tiếp cận khác?

Ngoài ra, nếu bạn có bất kỳ lời khuyên nào để bắt kịp tốc độ với khung này, tôi thực sự sẽ đánh giá cao nó.

Trả lời

16

Trước khi tôi trả lời câu hỏi của bạn, hãy để tôi bắt đầu bằng cách nói này: Người ta không hiểu những gì ActionForm là hoặc những gì ActionForm không

Các ActionForm đại diện cho dữ liệu mà người dùng điền vào các hình thức HTML. Struts đọc trong các tham số yêu cầu và kết hợp chúng theo tên với ActionForm được cấu hình cho hành động đích của đệ trình. Đó là dữ liệu được người dùng nhập, đơn giản và đơn giản.

Dữ liệu đi kèm theo yêu cầu luôn là loại java.lang.String. Nhưng mọi người có thể có một trường biểu mẫu có tên là "tuổi" là một int trong dữ liệu Mô hình của họ. Hoặc có thể thay vì "tuổi" họ có một "birthDate" mà tắt khóa học là java.util.Date trong dữ liệu Model của họ. Vì vậy, họ nghĩ rằng đó là một ý tưởng tốt để có kiểu int và Date được đặt trên ActionForm và cho phép Struts chuyển đổi các chuỗi mà đến theo yêu cầu vào ints và Dates.

Một chuyển đổi rất hữu ích của nó và bạn là nhà phát triển không phải xử lý nó, Struts làm. Đó là một chút phép thuật khung.

Nhưng điều này không phải là Harry Potter đáng sợ! Chuyển đổi có thể không thành công và ngày tháng. Tại sao?

int là kiểu nguyên thủy và vì vậy nó phải luôn có giá trị. Khởi tạo mặc định bằng 0. Khi thực hiện các ràng buộc (các tham số yêu cầu đến các thuộc tính của đối tượng ActionForm) Struts thấy một kiểu int trên ActionForm và cố gắng chuyển đổi giá trị String yêu cầu thành int.

Nếu người dùng chèn Chuỗi "5", trường được đặt thành 5. Tốt thôi!

Nhưng nếu người dùng chèn "bla" thì sao? Chúng ta sẽ có ngoại lệ ném vào mặt chúng ta? Không! Chúng tôi lấy lại giá trị bằng không vì chuyển đổi (âm thầm) không thành công. Ups!

Ngày một lần nữa là một vấn đề. Tại sao? Vì giá trị của chúng đến theo yêu cầu dưới dạng Chuỗi. Định dạng của họ có thể là một cái gì đó đơn giản như "12/01/2011" đó là hoàn toàn vô dụng như thông tin. Tại sao?Vì Ngày tháng được biểu diễn dưới dạng Chuỗi phải đi đôi với một số Locale để được chuyển thành phiên bản Date chính xác mà nó đại diện.

"12/01/2011" + Locale.US = 01 December 2011 
"12/01/2011" + Locale.FRENCH = 12 January 2011 

Ups!

Ok, vì vậy đây là phần giới thiệu! Bây giờ, hãy truy cập câu hỏi của bạn.

  1. Tôi có nên tạo biến ngày và tạo phương thức setDate (Chuỗi ngày) nơi chuyển đổi sẽ xảy ra.

Tại một số điểm bạn sẽ phải gửi ngày trở lại quan điểm và Struts html tags thường sẽ phải đi cho một getDate() trả về String. "12/01/2011" bạn nhận được vào đầu vào của người dùng có thể được hiển thị là "ngày 12 tháng 1 năm 2011 00:00:00" nếu getter trả về ngày (Struts sẽ thực hiện một toString() trên giá trị getter). Vì vậy, bạn thực sự cần trường Date với cả một setter/getter của kiểu Date và một setter/getter của kiểu String. Sử dụng kiểu Date trong lớp Action của bạn và sử dụng String để giao tiếp với các thẻ view.

Câu hỏi? Làm thế nào để bạn có được xử lý trên giá trị Locale thích hợp trong ActionForm của bạn?

  1. Tạo một ngày biến, một setDate (ngày ngày) và đăng ký chuyển đổi đặc biệt ở đâu đó trong chuỗi giá trị (không biết nếu nó có thể)

It is possible. Bạn có thể tạo và đăng ký một trình biến đổi tùy chỉnh có thể lấy các biểu diễn chuỗi ngày tháng và chuyển đổi chúng thành Ngày tháng. Nếu bạn sử dụng định dạng ISO 8601, tôi nghĩ bạn sẽ an toàn.

Câu hỏi? Bạn có thể điều chỉnh điều này vào ứng dụng hiện có mà không phá vỡ mã để biến đổi chuỗi thành ngày theo cách riêng của chúng bằng cách sử dụng tất cả các loại định dạng hoặc Locales không?

  1. Tạo một biến String, một setDate (String ngày) và để cho các chuyển đổi/xác nhận với phương thức validate trong đậu ActionForm

won này 't làm việc. Phương thức validate được gọi sau khi kết buộc tham số trên đối tượng ActionForm. Khi bạn đạt đến điểm này đã đến muộn. Struts đã chuyển đổi. Nếu bạn có một trường kiểu int với giá trị 0 thì không có cách nào để biết liệu người dùng có thực sự chèn 0 và chuyển đổi hay không hoặc nếu người dùng chèn "bla" và chuyển đổi không thành công và bạn đã trở về 0 làm giá trị khởi tạo mặc định. Nếu số không là giá trị hợp lệ cho ứng dụng của bạn hơn là bạn đang gặp rắc rối lớn hơn.

Vậy quy ước là gì?

Không có quy ước. Sử dụng thông tin trên và áp dụng ý thức chung cho tình huống của bạn.

Lý tưởng nhất là bạn nên có tất cả các thuộc tính trong ActionForm dưới dạng Strings để bạn không mất thông tin trong quá trình liên kết. Nhưng điều này liên quan đến việc chuyển đổi thủ công các thuộc tính sang kiểu thích hợp trong lớp Hành động, trước khi sử dụng chúng. Bạn có toàn quyền kiểm soát (Struts không còn thực hiện chuyển đổi vì các giá trị nguồn và đích là kiểu String) nhưng bạn cũng có rất nhiều mã đĩa nồi hơi để viết để làm điều đó một cách thích hợp mà tại một số điểm có thể trở nên khó chịu.

P.S. Trước khi tôi kết thúc chuyện này và đi ngủ (đó là 01:00 sáng ở nước tôi: D) Tôi chỉ muốn đề cập đến một điều mà mọi người thường không nhìn thấy. ActionForm không phải là một phần của mô hình, không nên tương tác trực tiếp với mô hình.

Nếu bạn cần dữ liệu từ ActionForm được xử lý trong mô hình, thì hãy ánh xạ dữ liệu đó dưới dạng mối quan hệ một-một với Mô hình DTO (đối tượng truyền dữ liệu). Nếu không, thì bạn tạo một sự kết hợp chặt chẽ giữa khung công tác Mô hình và khung công tác Struts vì các đối tượng ActionForm của bạn không phải là một POJO. Lớp của bạn phải mở rộng lớp ActionForm từ Struts mà chúng ta đã nói đến. Mọi người không làm điều này và gửi ActionForm thẳng đến Mô hình. Điều gì thậm chí còn tồi tệ hơn là họ cũng sử dụng phương pháp validate để thực hiện xác thực kinh doanh thay vì xác thực cơ bản như "là bắt buộc", "là giá trị withing range", v.v.

ActionForms chỉ là một đường dẫn truyền thông giữa Action (controller)) và quan điểm. Hãy đối xử với nó như vậy.

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