Thứ Năm, 8 tháng 1, 2009

Xử lý Duplicate Submissions Form trong Struts

Duplicate submissions form được chấp nhận trong một số trường hợp. Các tình huống như vậy được gọi là quá trình chuyển đổi idempotent. Khi submissions nhiều dữ liệu quan trọng không đủ để tác động đến hành vi của ứng dụng, Form submissions duplicate không gây ra một mối đe dọa.

Chúng có thể gây ra rất nhiều đau buồn nếu có ví dụ bạn đang mua từ một cửa hàng trực tuyến và vô tình báo chí làm mới trên trang mà bạn đang tính phí. Nếu cửa hàng là đủ thông minh, nó sẽ nhận ra duplicate submission và xử lý nó ân cần mà không tính phí cho bạn hai lần.

Duplicate submissions form có thể xảy ra bằng nhiều cách
  • Sử dụng nút Refresh
  • Sử dụng nút browser Back để đi qua lại và gửi lại form
  • Sử dụng tính năng history của trình duyệt và gửi lại form.
  • Malicious submissions cho bất lợi ảnh hưởng đến máy chủ hoặc lợi ích cá nhân
  • Nhấp vào nhiều hơn một lần trên một giao dịch mà mất nhiều thời gian hơn thường lệ
Tại sao tất cả trên form được submit một lần nữa sau khi nút Refresh được nhấn? Câu trả lời nằm trong những URL được thấy trong thanh địa chỉ của browser của bạn sau khi submission Form. Hãy xem xét một Form như:


Form nêu trên được submit với những URL /example/submitCustomerForm.do và URL tương tự được hiển thị trên thanh URL. Struts lựa chọn ánh xạ action liên kết với submitCustomerForm và thực thi những trường hợp action. Khi bạn bấm refresh, cùng một URL hiện được gửi và những trường hợp cùng một action và thực thi một lần nữa. Các giải pháp dễ dàng cho vấn đề này là sử dụng HTTP chuyển hướng sau khi submission Form. Giả sử rằng những CustomerForm submission kết quả trong việc hiển thị một trang gọi là Success.jsp. Khi chuyển hướng HTTP được sử dụng, những URL trong thanh địa chỉ URL sẽ trở thành /example/Success.jsp thay vì /example/submitCustomerForm.do. Khi refresh trang, là refresh Success.jsp được tải một lần nữa thay vì /example/submitCustomerForm.do. Vì vậy form sẽ không được submit nữa. Để sử dụng tính năng HTTP chuyển hướng, phía trước thiết lập như sau:


Tuy nhiên có một bắt buộc. Với thiết lập ở trên, tên JSP thực tế được hiển thị trong URL. Bất cứ khi nào tên JSP xuất hiện trong thanh địa chỉ URL, nó hiện một ứng cử viên cho ForwardAction. Do đó thay đổi forward nêu trên để được như sau:


Nơi mà GotoSuccess.do là một action bằng cách sử dụng ánh xạ ForwardAction như sau:

       parameter="/Success.jsp" validate="false" />

Bây giờ, bạn đã có được giải quyết những duplicate submission do vô tình refresh của khách hàng.

Struts cung cấp cho bạn với các cấp độ tiếp theo của bảo vệ: Synchronizer Token. Để hiểu làm thế nào các Token Synchronizer làm việc, nền tảng một vài Giới thiệu về xây dựng ở các chức năng trong lớp Action được yêu cầu. Các class Action có phương pháp gọi là saveToken() có logic như sau:

HttpSession session = request.getSession();
String token = generateToken(request);
if (token != null) {
      session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);
}

Phương pháp này tạo ra một session ngẫu nhiên bằng cách sử dụng mã thông báo id, thời gian hiện tại và một MessageDigest và lưu trữ nó ở session sử dụng một tên org.apache.struts.action.TOKEN khóa (Đây là giá trị của biến TRANSACTION_TOKEN_KEY tĩnh trong org.apache.struts Globals class..

Lớp Action đó làm cho Form gọi phương thức là saveToken() để tạo ra một thuộc tính session với các tên nêu trên. Trong JSP, bạn phải sử dụng mã thông báo như là một trường ẩn của Form này như sau:

      name="<%=org.apache.struts.taglib.html.Constants.TOKEN_KEY%>"
      value="">

nhúng tag được hiển thị ở trên, sẽ cho một org.apache.struts.action.TOKEN bean tên (mà là giá trị của Globals TRANSACTION_TOKEN_KEY.) ở phạm vi session và làm cho giá trị của nó là giá trị của thuộc tính ẩn biến đầu vào. Tên của biến đầu vào ẩn là org.apache.struts.taglib.html.TOKEN (Điều này là gì, nhưng giá trị của biến TOKEN_KEY tĩnh trong org.apache.struts.taglib.html.Constants class).

DangTrung.

Thứ Tư, 7 tháng 1, 2009

Chỉnh sửa web.xml trong một ứng dụng Struts

Các tập tin web.xml là nơi mà servlet và các công cụ khác được quy định cho container servlet. Chúng ta sẽ loại bỏ một số việc không cần thiết từ những tập tin web.xml vì vậy nó trông như thế này:


    "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
    "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
    
    
         action
         org.apache.struts.action.ActionServlet
        
             application
             ApplicationResources
        
        
             config
             /WEB-INF/struts-config.xml
        
        
              debug
              2
        
        
              detail
              2
       
       
             validate
             true
       
       2
    
    
    
         action
         *.do
    
    
    
           /WEB-INF/struts-bean.tld
           /WEB-INF/struts-bean.tld
   
   
          /WEB-INF/struts-html.tld
          /WEB-INF/struts-html.tld
   
   
         /WEB-INF/struts-logic.tld
         /WEB-INF/struts-logic.tld
   

Tập tin web.xml - File này có chứa ba phần:
  • Định nghĩa của Struts servlet có tên là "ActionServlet"
  • Lập mapping địa chỉ URL của những cuộc gọi cho servlet này
  • Những định nghĩa trong những thư viện thẻ Struts
Bạn sẽ thấy rằng servlet sẽ được gọi là nếu yêu cầu của chúng ta một trình duyệt tập tin gọi là . do. Vì vậy, khi chúng ta gửi Form trong ứng dụng của một trang của chúng tôichúng ta sẽ quyết định sử dụng những hành động-name "submit.do". Làm thế nào những servlet Struts biết phải làm gì với yêu cầu này chúng ta sẽ khám phá tiếp theo.

DangTrung.

Xử lý nhiều nút trong HTML Form trong Struts

Các tag được sử dụng để gửi Form HTML. Việc sử dụng trong thẻ là như sau:


Nó sẽ tạo một HTML như sau.


Điều này thường làm việc ổn nếu chỉ có một nút có submission Form "real" (có thể là một nút khác là Cancel ). Do đó nó phải để ngay lập tức xử lý yêu cầu trong CustomerAction. Tuy nhiên bạn sẽ thường xuyên phải đối mặt với tình huống mà có nhiều hơn một hoặc hai nút submit form. Bạn sẽ muốn thực thi code khác nhau dựa trên những nút bấm. Nếu bạn đang nghĩ, "Không có vấn đề. Tôi sẽ có ActionMapping khác nhau (và Actions vì thế khác nhau) cho các nút khác nhau ", bạn đang trên may mắn! Nhấp vào bất kỳ nút trong một Form HTML luôn nộp Form giống nhau, có cùng một URL. Các URL Form trình được tìm thấy trong những thuộc tính hành động của thẻ Form như:


và là duy nhất cho Form. Bạn phải sử dụng một biến thể của như hình dưới đây để giải quyết vấn đề này.


     


SubmitTag trên, có một thuộc tính bổ sung tên là tài sản có giá trị bước. Ý nghĩa trong những thuộc tính tài sản là tương tự như trong - Nó đại diện cho một tài sản JavaBeans trong ActionForm và tạo ra tên trong những yếu tố đầu vào Form. Thẻ này sẽ tạo ra một HTML như sau



HTML sinh ra nút gửi có một cái tên gắn liền với nó. Bây giờ bạn cần phải thêm một JavaBeans properties cho ActionForm của bạn có tên trùng với tên nút submit. Nói cách khác một biến có một method getter và setter được yêu cầu.

Trong các ứng dụng Struts, khi sử dụng các nút thường xuyên, đó là tập quán cho tất cả các nút submit có cùng tên (trừ Cancel và nút Reset). Điều này là dành cho mục đích thuận tiện. Trong HTML, khi tạo thành một điểm được gửi, chỉ có một trong các nút submit được nhấn và do đó chỉ có giá trị trong nút đó là được gửi. Các ActionForm đó có thể có một biến trường hợp duy nhất cho tất cả những submit nút trong Form của mình. Điều này làm cho những kiểm tra xem trong class Action dễ dàng hơn. Giả sử rằng những HTML Form khách hàng mà chúng ta hiển thị cho người sử dụng có một nút có nhãn "Spike Me". Các nút trình vẫn có thể có tên "bước" (giống như là nút "Save Me"). Điều này có nghĩa những class CustomerForm có
duy nhất JavaBeans tài sản "bước" cho những trình nút. Trong CustomerAction những bạn có thể có kiểm tra xem những personForm.getStep() là "Save Me" hay "Spike Me". Nếu mỗi người trong những nút có tên gọi khác nhau như button1, button2 vv thì PersonAction sẽ phải thực hiện kiểm tra như sau:

if ("Save Me".equals (personForm.getButton1()) {
       //Save Me
} else if ("Spike Me".equals(
personForm.getButton2()) {
       //Spike Me
}


Sử dụng HTML Button Label để phân biệt những nút làm việc cho hầu hết các trường hợp, trừ khi bạn có một ứng dụng Struts web internationalized. Xem xét kết xuất HTML cho một người sử dụng tiếng Tây Ban Nha. Bởi đức hạnh trong những tin nhắn Resource Gói ( tag), người sử dụng tiếng Tây Ban Nha sẽ nhìn thấy một nhãn hiệu trong "Excepto Mi" thay vì "Save Me". Tuy nhiên những class CustomerAction vẫn còn tìm kiếm những mã hoá "Save Me".

Cấu hình và ý nghĩa của struts-config.xml trong Struts

Controller cấu hình là câu trả lời cho vấn đề Controller Fat. Trong một Controller Fat, những lập trình viên có thể code "if" ngăn chặn trên nền tảng cần thiết. Không nên có các bộ điều khiển cấu hình. Khả năng diễn đạt và cấu hình được giới hạn những gì được xây dựng trong Controller có thể hỗ trợ. Trong Struts, tích hợp Controller hỗ trợ một loạt trong trường hợp có thể phát sinh trong khi phát triển ứng dụng web. Nó thậm chí còn cung cấp điểm cho mở rộng khả năng cấu hình. Những quan điểm này được gọi là điểm mở rộng, đi configurationcapability cho kích thước tới. Trong hướng dẫn này, chúng tôi chỉ sẽ xem xét những phương tiện thông thường được cung cấp bởi struts-config.xml này.

Các file cấu hình Struts tuân thủ các Struts-config_1_1.dtd. Các Struts config dtd có thể được tìm thấy trong phân phối Struts trong thư mục lib. Nó cho thấy mọi phần tử có thể, thuộc tính của họ và mô tả của họ. Bao gồm tất cả chúng cùng một lúc sẽ chỉ dẫn đến tình trạng quá tải thông tin. Do đó chúng tôi sẽ chỉ nhìn vào năm phần quan trọng trong tập tin này liên quan cho cuộc thảo luận của chúng ta và các thuộc tính quan trọng của họ.

Năm phần quan trọng là :
  1. Form bean
  2. Global forward
  3. Action mapping
  4. Controller configuration
  5. Application Resources
Ví dụ dưới đây cho thấy một mẫu file Struts Config hiển thị tất cả năm phần. Các Form định nghĩa mục bean có chứa một hoặc nhiều mục cho mỗi ActionForm. Mỗi Form bean được xác định bởi một tên hợp lý duy nhất. Loại là tên lớp đầy đủ trong ActionForm. Một thú vị là bạn có thể khai báo những class cùng ActionForm bất kỳ số lần cung cấp mỗi mục có một tên duy nhất liên kết với nó. Tính năng này rất hữu ích nếu bạn muốn lưu trữ nhiều form cùng loại trong servlet session .

Thuộc tính quan trọng và các yếu tố trong ActionMapping trong Struts-config.xml

Path : Các đường dẫn URL (có thể ánh xạ hoặc ánh xạ đường hậu tố) mà Action mapping này được sử dụng. Những đường dẫn nên là duy nhất
Type : Tên class đầy đủ của Action
Name : Tên hợp lý trong những bean Form. Các ActionForm thực tế kết hợp với bản đồ Action này được tìm thấy bằng cách tìm kiếm trong phần định nghĩa Form-bean cho một hạt đậu Form với tên phù hợp. Điều này thông báo cho những ứng dụng Struts mà hành động nên sử dụng ánh xạ mà ActionForms.
Scope : Phạm vi của các bean Form - Có thể được session hoặc yêu cầu
Validate : Có thể đúng hoặc sai. Khi đúng, bean Form được xác nhận về trình. Nếu sai, việc xác nhận là bỏ qua.
Input : Trang vật lý (hoặc một ActionMapping) mà kiểm soát nên được chuyển tiếp khi có lỗi tồn tại trong những bean hình thành.
Forward : Trang vật lý (hoặc một ActionMapping) mà kiểm soát nên được chuyển tiếp khi ActionForward với tên này được chọn trong những phương pháp thực hiện trong lớp Action.

Phần ActionMapping chứa ánh xạ từ đường dẫn URL cho một class Action (và cũng có thể liên kết một bean Form có đường dẫn). Các loại thuộc tính là tên lớp đầy đủ trong những Action liên quan. Mỗi nhập hành động trong những-ánh xạ hành động cần phải có một con đường duy nhất. Điều này sau từ thực tế là mỗi đường dẫn URL cần một xử lý độc đáo. Không có cơ sở cho Actions liên kết nhiều có cùng một con đường. Các tên thuộc tính là tên trong những bean Form liên quan đến Action này. Các Form bean thực tế được xác định trong mục Form định nghĩa bean. Bảng trên cho thấy tất cả những thuộc tính liên quan thảo luận cho đến nay cho những nhập hành động trong phần action-mapping.

      "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
      "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
      
      
          
          
      
      
      
           
           
     
     
     
          
                name="PersonForm" scope="request" validate="true"
                input="/PersonDetailForm.jsp">
              
              
        
       
                type="org.apache.struts.action.ForwardAction" />
   
      
      
   

Trong ActionMapping có hai forward. Những forward tại địa phương - có nghĩa là những forward có thể được truy cập trong vòng ActionMapping này. Mặt khác, những forward quy định trong mục Forward Global có thể truy cập từ ActionMapping bất kỳ. Như bạn đã thấy trước đó, về phía trước một có một cái tên và một đường dẫn. Các thuộc tính tên là tên hợp lý được giao. Các thuộc tính đường dẫn là nguồn lực cho kiểm soát sự chuyển tiếp. Điều này có thể là một nguồn tài nguyên trang thực tế như trong

name="logon"

hoặc nó có thể là một ActionMapping như trong

name="logoff"

Các logoff/ (chú ý sự vắng mặt trong "do.") sẽ là một ActionMapping trong Struts-config.xml. Forward hoặc là toàn cầu hoặc địa phương được sử dụng trong execute() của lớp Action cho chuyển điều khiển đến một trang khác về physical hoặc ActionMapping.

Phần tiếp theo trong tập tin cấu hình là bộ điều khiển. Controller là tùy chọn. Trừ trường hợp có quy định, bộ điều khiển mặc định luôn là org.apache.struts.action.RequestProcessor. Có những trường hợp khi bạn muốn thay thế hoặc mở rộng này có bộ xử lý của chuyên ngành của bạn. Ví dụ, khi sử dụng Tiles (một trang JSP mẫu Framework) kết hợp có Struts, bạn sẽ sử dụng TilesRequestProcessor.

Phần cuối cùng sự quan tâm ngay lập tức là những tin nhắn định nghĩa tài nguyên. Trong các cuộc thảo luận ActionErrors, bạn đã thấy một đoạn mã được sử dụng một khóa bí ẩn như là đối số cho ActionError này. Chúng ta đã nói rằng khóa mapping này cho một giá trị trong một tập tin thuộc tính. Vâng, chúng ta tuyên bố rằng các thuộc tính tập tin trong Struts-config.xml trong phần tin nhắn định nghĩa nguyên. Việc kê khai, trong ví dụ ở trên nói rằng những tin nhắn Tài nguyên Bundle cho ứng dụng được gọi là ApplicationResources.properties.

Nếu bạn đang tự hỏi làm thế nào (và tại sao) một tập tin thuộc tính có thể được đặt trong một gói java, nhớ lại rằng bất kỳ tập tin (bao gồm cả file class) là một nguồn tài nguyên và hiện tải bởi bộ nạp class bằng cách chỉ định những gói.

DandTrung.

Thứ Ba, 6 tháng 1, 2009

ActionErrors và ActionError trong Struts

Struts yêu cầu xử lý vòng đời như là một kịch bản ngày hài lòng là - từ quan điểm người dùng gửi một Form html cho đến khi người dùng thấy trang kế tiếp. Trong thực tế, người sử dụng ứng dụng web của bạn có thể gửi dữ liệu không chính xác hoặc đôi khi không có dữ liệu nào cả. Bạn phải nắm bắt những lúc gần với giao diện người dùng càng tốt, thay vì chờ đợi cho các cơ sở dữ liệu cấp hoặc giữa cho cho bạn biết rằng một cột không thể được chèn vào trong cơ sở dữ liệu bởi vì nó đã được mong đợi một giá trị không null. Có hai hậu quả của việc thực hành lập trình như vậy.
  • Máy chủ thời gian và nguồn lực quý giá kể từ khi họ được chia sẻ. Chi tiêu quá nhiều thời gian và tài nguyên của máy chủ yêu cầu một, mà chúng ta biết là sẽ thất bại cuối cùng là một sự lãng phí tài nguyên máy chủ.
  • Nó có một tác động tiêu cực đến chất lượng mã. Kể từ khi người ta phải chuẩn bị cho khả năng có dữ liệu vô giá trị, kiểm tra thích hợp phải được đặt (hoặc NumberFormatExceptions đã bị bắt) ở khắp mọi nơi trong các mã.
Nói chung business logic là code khó khăn nhất của hệ thống và có đủ các khối if-else là như vậy. Các khối khác if-else cho kiểm tra chỉ có thể có nghĩa là null hai việc - code tồi và ác mộng bảo trì. Không phải là một chương trình thanh lịch cho nói rằng ít nhất là vậy. Nếu chỉ có bạn có thể xác minh tính hợp lệ của dữ liệu người dùng càng gần người sử dụng, khi đó phần còn lại trong mã này chỉ có để đối phó với logic business và dữ liệu không hợp lệ.

//validate() method in the CustomerForm
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
{
       // Perform validator framework validations
       ActionErrors errors = super.validate(mapping, request);

       // Only need crossfield validations here
       if (parent == null) {
            errors.add(GLOBAL_ERROR, new ActionError("error.custform"));
       }
       if (firstName == null) {
             errors.add("firstName", new ActionError("error.firstName.null"));
       }
       return errors;
}

Struts cung cấp validate () trong các ActionForm để giải quyết với xác nhận của người dùng. Bây giờ chúng ta nhìn vào cách bạn có thể xác nhận các lỗi người dùng nhập vào và báo cáo framework.

Việc validate() được gọi là sau khi dụ ActionForm là populated với các dữ liệu Form. Một template validate() được hiển thị phía trên. Trong method validate(), bạn sẽ thấy một đối tượng gọi là :

ActionErrors được khởi tạo. Tất cả các kiểm tra lỗi được thực hiện với các khối else if thông thường. Nếu có sai sót, khi đó một đối tượng ActionError cá nhân được tạo ra cho vào trường culprit và thêm vào ActionErrors. Hãy suy nghĩ trong ActionErrors như là một mapping cho các đối tượng ActionError riêng lẻ. Bạn có thể kết hợp một hoặc nhiều ActionError đối tượng cho phím. Tên Form lĩnh vực thường được chọn là khoá và có thể có nhiều đối tượng ActionError liên kết với nó. ActionError là một trong hai lĩnh vực cụ thể cho một trong ActionForm, hoặc nó là toàn cầu toàn bộ mẫu. Khi lỗi là một lĩnh vực cụ thể cho Form, tên trường được sử dụng như là chìa khóa trong ActionErrors. Khi lỗi là toàn cầu để hình thành, tên chính là luôn luôn GLOBAL_ERRORS. Cả hai trường hợp được thể hiện trong các bảng liệt kê ở trên.

Bạn cũng có thể nhận thấy rằng các nhà xây dựng ActionError có một khóa thay vì bí ẩn như là đối số. Khóa này được khai báo trong một tập tin tài sản có giá trị thông báo lỗi thực sự. Các tập tin thuộc tính được chọn dựa trên những người sử dụng lựa chọn Vị trí. Thuật ngữ kỹ thuật cho các thuộc tính tập tin, nơi các tin nhắn được externalized là tin nhắn Resource Bundle. Nó dựa trên Java của khái niệm trong các địa phương sử dụng các java.util.ResourceBundle và có một toàn bộ rất nhiều chuông và whistles. Các tập tin thuộc tính cũng phục vụ một mục đích khác ngoài việc các địa phương. Nó cho phép bạn thay đổi các tin nhắn mà không cần biên dịch lại mã này, và khá tiện dụng trong khi duy trì mã. Một nhập trong tập tin nguồn tin thuộc tính Bundle hình như:

error.firstName.null=First Name cannot be null

RequestProcessor dừng việc xử lý thêm khi nó được các đối tượng ActionErrors với các đối tượng ActionError. Các trường hợp Action không bao giờ được kiểm soát (và không bao giờ được một cơ hội cho trở về ActionForward). Do đó RequestProcessor các tham vấn các đối tượng ActionMapping cho tìm trang được hiển thị. Chú ý rằng ActionMapping có một thuộc tính có tên là "đầu vào". Thuộc tính này quy định các trang vật lý mà yêu cầu phải được gửi về lỗi. Thông thường trang này là trang gốc mà người dùng nhập dữ liệu vì nó là tự nhiên mà người dùng sẽ muốn nhập lại dữ liệu trong cùng một trang về lỗi và gửi lại.

DangTrung.

7 thực tiễn tốt nhất trong Struts

  1. Mở rộng Khi bạn Cần
    1. Struts Framework có thể được kéo dài và tùy biến cho phép tùy chỉnh hành vi.
    2. Cấu hình các lớp học trong framework Struts (nói, Struts cấu hình tập tin, ActionServlet RequestProcessor) có thể được thay thế cho một phiên bản tùy biến.
    3. Xử lý ngoại lệ Declarative cơ chế cũng cho phép tuỳ chỉnh cho xử lý ngoại lệ được sử dụng để đáp ứng tốt hơn lỗi ứng dụng.
    4. Mở rộng cần được thực hiện sáng suốt.
    5. Trước khi mở rộng một khung, chúng tôi luôn luôn phải đảm bảo rằng các chức năng chưa tồn tại ở đâu đó.
  2. Sử dụng các module ứng dụng
    1. Chia nhỏ file của một ứng dụng Struts đơn thành nhiều mô-đun được cho phép.
    2. Điều này giải quyết một trong những khiếu nại lớn nhất mà nhóm phát triển của hơn một vài người đã có một thời gian vì chúng ta có thể tạo riêng biệt Struts file cấu hình cho các ứng dụng cá nhân.
    3. Mỗi module ứng dụng Struts cần phải có tập tin cấu hình riêng của mình. Điều này cho phép chúng ta Actions cấu hình riêng biệt, ActionForms, xử lý ngoại lệ, và nhiều hơn nữa, độc lập của các module ứng dụng khác.
  3. Xử lý ngoại lệ sử dụng Declarative
    1. Struts Framework bao gồm một class được gọi là ExceptionHandler.
    2. Lớp này theo mặc định có trách nhiệm xử lý các trường hợp ngoại lệ xảy ra trong khi thực hiện hành động.
    3. Class này thực tế tạo ra một đối tượng ActionError và lưu trữ nó trong phạm vi đối tượng thích hợp.
    4. Điều này cho phép các trang JSP sử dụng các lỗi cho thông báo cho người sử dụng của một vấn đề.
    5. Tùy chỉnh các lớp ExceptionHandler cũng có thể được sử dụng.
  4. Sử dụng một Action cho các ứng dụng của bạn
    1. Thông thường, Actions trong một ứng dụng sẽ cần phải thực hiện một số nhiệm vụ cơ bản.
    2. Để bảo đảm các nhiệm vụ này được thực hiện nhất quán, tạo ra một Action cơ bản có thể được phân xếp bởi những hành động khác trong ứng dụng.
  5. Kiểm tra thông tin đăng nhập ở cấp Controller
  6. Sử dụng Validator Framework để phê chuẩn của người dùng
  7. Sử dụng thẻ Custom thay vì sử dụng scriplets và mã Java trong các trang JSP
DangTrung.

Chuỗi action trong Struts

Các action có thể được thực hiện đơn giản bằng cách sử dụng các mapping thích hợp trong các mục forward trong file struts-config.xml của bạn. Giả sử bạn có hai loại sau đây:

/* org/ktlt/struts/action/UserAction.java */
public class UserAction extends Action
{
     public ActionForward execute(ActionMapping mapping,  ActionForm form,
         HttpServletRequest request, HttpServletResponse response) throws Exception
         {
              // Do something
              return mapping.findForward("success");
         }
}

/* org/ktlt/struts/action/PersonAction .java */
public class PersonAction extends Action
{
     public ActionForward execute(ActionMapping mapping, ActionForm form,
         HttpServletRequest request, HttpServletResponse response) throws Exception
         {
             // Do something else
             return mapping.findForward("success");
         }
}

Sau đó, bạn có thể chuỗi lại với nhau hai hành động với cấu hình Struts như thể hiện trong các trích đoạn sau đây:

   
        
   
   
         validate="false">
        
   

Ở đây chúng ta giả sử bạn đang sử dụng một hậu tố dựa trên mapping servlet (.do), được đề nghị từ module hỗ trợ đòi hỏi điều đó. Khi bạn gửi trình duyệt của bạn cho ứng dụng web và tên A.do hành động (tức là http://localhost:8080/app/editUser.do) nó sẽ thực hiện UserAction.execute(), mà sau đó sẽ chuyển sang ánh xạ "sussess".

Điều này làm cho việc thực hiện các PersonAction.execute() kể từ khi nhập cảnh cho "sussess" trong file cấu hình sử dụng do hậu tố.

Tất nhiên nó cũng có thể có những chuỗi lập trình action, nhưng sức mạnh và sự dễ dàng của việc có thể "reroute" cho ứng dụng web sử dụng cơ cấu các file cấu hình XML dễ dàng hơn nhằm duy trì.

DangTrung.

Thứ Hai, 5 tháng 1, 2009

Làm thế nào để prepopulate một form trong Struts

Cách đơn giản cho prepopulate một hình thức là phải có một Action có mục đích duy nhất là cho cư trú trong một ActionForm và chuyển tiếp đến servlet hay JSP cho làm cho hình thành lại cho khách hàng. Một Action riêng biệt sau đó sẽ được sử dụng cho xử lý các trường mẫu gửi, bằng cách tuyên bố một cá thể của cùng một tên bean hình thức.

Các ứng dụng ví dụ struts-example là vận chuyển với minh họa mẫu thiết kế độc đáo. Lưu ý các định nghĩa sau đây từ struts-config.xml

    
    

       scope="request" input="mainMenu" roles="admin" parameter="method"
       unknown="false" validate="false" >
      
      
       scope="request" input="list" roles="admin" parameter="method" unknown="false"
       validate="false">
      
      

Lưu ý những tính năng sau đây cách tiếp cận:

Cả hai /editUser/saveUser actions sử dụng bean giống như hình thức.

Khi các hành động /editRegistration được nhập vào, Struts sẽ có tiền tố tạo ra một thể thức bean trống rỗng, và thông qua nó với method execute(). Các hành động thiết lập được tự do preconfigure các giá trị đó sẽ được hiển thị khi form render chỉ đơn giản bằng cách thiết lập các thuộc tính form bean tương ứng.

Khi hoàn thành thiết lập action cấu hình các thuộc tính của form bean, cần trả lại một ActionForm và chỉ vào trang sẽ hiển thị form này. Nếu bạn đang sử dụng các thư viện thẻ JSP Struts, các thuộc tính action tag của bạn sẽ được thiết lập cho /saveUser để form cho submit action xử lý.

Lưu ý rằng các thiết lập action /editUser sẽ tắt validation form đang được thiết lập. Thông thường, bạn sẽ muốn có thuộc tính này trong cấu hình thiết lập action của bạn, bởi vì bạn không phải là tiến trình lập kế hoạch cho kết quả thực sự - bạn chỉ muốn tận dụng lợi thế từ các thực tế là Struts sẽ precreate bean một trường hợp form class chính xác cho bạn.

Các xửa lý action /saveUser, mặt khác, rời khỏi các thuộc tính validate, mặc định là true. Điều này Struts cho thực hiện xác nhận liên kết với bean này hình thành trước khi chưa áp dụng biện pháp xử lý nào cả. Nếu bất kỳ lỗi nào validation có xảy ra, Struts sẽ trở lại trang input của bạn (về mặt kỹ thuật, nó sẽ chuyển lại cho một "đăng ký" ActionForward tên trong trường hợp này, vì webapp ví dụ sử dụng các thuộc tính inputForward trong phần tử - xem tài liệu mô tả struts-config.xml để biết thêm thông tin) thay vì gọi action xử lý của bạn.

DangTrung.

Tìm hiểu các class trong Struts (Phần 2)

Bước tiếp theo là cho gọi các đối tượng Action cho các URL yêu cầu. Các lớp học Action cung cấp các logic nghiệp vụ ứng dụng cụ thể cần thiết cho xử lý yêu cầu. Thông thường bạn sẽ viết một class Action cho mọi hành động khác nhau trong ứng dụng.

Một Action tốt class là nhỏ, tập trung, và dễ hiểu, nó chỉ đơn thuần là chất keo giữa controller và model. Actions không phải là một nơi tốt cho thực hiện logic business phức tạp. Một action nói chung sẽ gọi một hoặc nhiều phương thức business trong mô hình để có được những công việc thực tế thực hiện.

Ví dụ :

public ActionForward add(ActionMapping mapping, ActionForm form,
     HttpServletRequest request, HttpServletResponse response)
     throws Exception {

     if (log.isDebugEnabled()) {
          log.debug("Entering 'add' method");
     }

     User user = new User();
     user.addRole(new Role(Constants.USER_ROLE));

     UserForm userForm = (UserForm) convert(user);
     updateFormBean(mapping, request, userForm);
     
     checkForRememberMeLogin(request);
     
     return mapping.findForward("edit");
}

Sau khi hành động đã được hoàn tất thành công, về phía trước Controller các yêu cầu cho view thành phần. Quan điểm này thường là một trang JSP. Các yêu cầu JSP được chuyển tiếp như cấu hình trong file cấu hình Struts và bạn đoán nó, có khi chạy trong đối tượng ActionMapping. Những điểm đến được đại diện bởi các đối tượng ActionForward.

Struts cho phép bạn thiết lập nhiều điểm đến cho một hành động duy nhất, đó là hữu ích nếu một hành động có thể có nhiều kết quả. Ví dụ, ghi dữ liệu cho cơ sở dữ liệu có thể thành công hoặc có thể thất bại. Có thể bạn sẽ muốn chuyển tiếp cho các trang JSP khác nhau tùy thuộc vào kết quả.

       name="userForm"  scope="request" input="list" roles="admin" parameter="method"
       unknown="false" validate="false" >
      
      

Các trang view JSP có thể truy cập vào Model trực tiếp, sử dụng hoặc các ngôn ngữ biểu thức (EL), hoặc sử dụng các thư viện tag Struts để lấy dữ liệu từ model. Ví dụ, nếu bạn sử dụng các thẻ trong thư viện Struts tag html cho tạo ra các hình thức HTML, các thẻ tự động sẽ cư trú trong các trường mẫu với các giá trị trong ActionForm của bạn.

Trong điều kiện mở rộng, đây là cách xử lý một yêu cầu Struts.

Tìm hiểu các class trong Struts (Phần 1)

Như bạn mong đợi trong một Framework MVC, mọi yêu cầu bắt đầu từ controller Struts, trái tim trong đó là class ActionServlet. Servlet này thường được ánh xạ cho các phần mở rộng *.do . Ví dụ, một yêu cầu process.do sẽ kết thúc với các ActionServlet và nói với nó mà người dùng đã gửi một lệnh:

     action
     org.apache.struts.action.ActionServlet
     2

     action
     *.do

Các servlet Controller đầu tiên xác định những gì cần cho được thực hiện. Đối với mỗi hành động định vị tài nguyên có thể thống nhất (URL), như pizza.do, nó quyết định những gì cần cho xảy ra tiếp theo. Thông tin này được đọc từ tập tin cấu hình Struts trong thời gian chạy vào trường hợp của class ActionMapping. Vì vậy, điều đầu tiên các servlet Controller, không có gì gọi ActionMappings.findMapping() cho tìm thấy những gì các ActionMapping thích hợp dành cho các URL theo yêu cầu (/ process.do trong ví dụ này).

Một trong những điều bạn thường cần phải làm trong các ứng dụng Web là giá trị trường lưu trữ từ một dạng HTML trong một JavaBean. Một trong những điều mapping action có thể làm là chỉ định một ActionForm kết hợp với action. ActionForm An là một JavaBean hình thức cụ thể đại diện cho dữ liệu đầu vào từ một dạng HTML. Các Controller tự động instantiates servlet bean này nếu cần thiết và populates nó với giá trị tham số yêu cầu.

Cứ cho rằng process.do được gọi bằng một trang đặt hàng yêu cầu người dùng cho một lệnh pizza. Các hình thức HTML trên trang này có một trường gọi là kích thước. Nếu bạn cung cấp Struts với một ActionForm rằng có kích thước JavaBean tài sản, nó sẽ tự động cư có tài sản với kích thước được nhập vào bởi người sử dụng.

public ActionForward execute(ActionMapping mapping, ActionForm form,
     HttpServletRequest request,  HttpServletResponse response)
     throws Exception {

     if (isCancelled(request)) {
          try {
                 getMethod("cancel");
                 return dispatchMethod(mapping, form, request, response, "cancel");
           } catch (NoSuchMethodException n) {
                log.warn("No 'cancel' method found, returning null");
                return cancelled(mapping, form, request, response);
           }
     }
     // Check to see if methodName indicated by request parameter
     String actionMethod = getActionMethodWithMapping(request, mapping);

     if (actionMethod != null) {
          return dispatchMethod(mapping, form, request, response, actionMethod);
     } else {
          String[] rules = {"edit", "save", "search", "view"};
          for (int i = 0; i < rules.length; i++) { 
               // apply the rules for automatically appending the method name 
              if (request.getServletPath().indexOf(rules[i]) > -1) {
                   return dispatchMethod(mapping, form, request, response, rules[i]);
              }
         }
    }
    return super.execute(mapping, form, request, response);
}

ActionForms có thể là một phần các các mô hình ứng dụng, hoặc chúng có thể được sử dụng như một cách thuận tiện để di chuyển dữ liệu xung quanh.

Tùy chọn, các servlet Controller có thể yêu cầu ActionForm cho xác nhận các dữ liệu đã được đệ trình bằng cách gọi điện validate() trong form. Nếu ActionForm cho thấy rằng việc validate không thành công, yêu cầu được chuyển trở lại trang đầu vào HTML với một thông báo lỗi.

Ví dụ : ActionForm có thể xác minh rằng một cái tên đã được nhập vào, nếu nó bị mất tích, yêu cầu sẽ được chuyển trở lại dưới hình thức ban đầu với một tin nhắn Xin vui lòng nhập tên của bạn.

errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("errors.existing.user",
        userForm.getUsername(), userForm.getEmail()));
return mapping.findForward("edit");

Chủ Nhật, 4 tháng 1, 2009

Hướng dẫn Struts DispatchAction

DispatchAction cung cấp một cơ chế cho nhóm một tập các chức năng liên quan trong một hành động đơn lẻ, do đó loại trừ sự cần thiết với tạo ra các hành động riêng biệt cho mỗi chức năng. Trong ví dụ này chúng ta sẽ thấy làm thế nào để nhóm một tập hợp các hành động của người sử dụng có liên quan như thêm người dùng, cập nhật, người sử dụng và xóa người dùng vào một action duy nhất gọi là UserAction.

Cấu trúc cho ví dụ này như sau  :


Các class mở rộng UserAction org.apache.struts.actions.DispatchAction. Lớp này không cung cấp một thực hiện của method execute() như là hành động bình thường. DispatchAction sử dụng các phương pháp execute quản lý ủy thác các yêu cầu với các phương pháp cá nhân dựa trên các thông số yêu cầu gửi đến. Ví dụ nếu các tham số đầu vào được "method=Add", sau đó các method bổ sung sẽ được triệu gọi. Những method này cần phải có chữ ký tương tự như mehod execute.

public class UserAction extends DispatchAction {
       private final static String SUCCESS = "success";
       public ActionForward add(ActionMapping mapping, ActionForm form,
               HttpServletRequest request, HttpServletResponse response)
               throws Exception {
               UserForm userForm = (UserForm) form;
               userForm.setMessage("Inside add user method.");
               return mapping.findForward(SUCCESS);
       }

       public ActionForward update(ActionMapping mapping, ActionForm form,
              HttpServletRequest request, HttpServletResponse response)
              throws Exception {
              UserForm userForm = (UserForm) form;
              userForm.setMessage("Inside update user method.");
              return mapping.findForward(SUCCESS);
       }

       public ActionForward delete(ActionMapping mapping, ActionForm form,
             HttpServletRequest request, HttpServletResponse response)
             throws Exception {
             UserForm userForm = (UserForm) form;
             userForm.setMessage("Inside delete user method.");
             return mapping.findForward(SUCCESS);
      }
}

Bước tiếp theo là tạo ra một mapping action để xử lý action này. Tên tham số request được xác định bằng cách sử dụng các thuộc tính. Ở đây, tên tham số request là method.

      
               path="/UserAction" scope="session" type="com.ktlt.struts.UserAction">
              
      

Bây giờ làm thế nào để gọi một DispatchAction từ jsp. Chúng ta có một form đơn giản với ba nút với thêm, cập nhật và xóa một người sử dụng. Khi mỗi nút được nhấp một phương pháp khác nhau trong UserAction class được gọi.

Kết quả run các bạn sẽ nhìn thấy từ log như sau :


Download Source : Here

DangTrung.

Viết ứng dụng đầu tiên với Struts (Phần 3)

9) Tạo phần còn lại của JSP: index.jsp và Success.jsp.

Chú ý rằng index.jsp sử dụng html thường xuyên: liên kết tag mà chỉ chuyển tiếp cho một JSP. Success.jsp sử dụng các mapping MVC hành động phù hợp như là liên kết. Xác định mục trong MessageResource.properties cho từng hạt cà phê: các phím thông báo trong JSP.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
   
         <bean:message key="exercise01.indexpage.title"/>
        
   
   
        
             Go to Customer Form
        
   

Thông báo việc sử dụng các bean: viết thẻ trong Success.jsp. Họ cho phép bạn truy cập nhất định trong phạm vi hạt thích hợp và ghi tài sản của mình cho các / Servlet JSP OutputStream

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
   
         <bean:message key="exercise01.successpage.title"/>
        
   
   
       

            
            
            
      
      

      
       Go Back
   

Viết ứng dụng đầu tiên với Struts (Phần 2)

4. Tạo JSP CustomerForm sử dụng Struts Tags :

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
   
         <bean:message key="exercise01.formpage.title"/>
        
   
   
         

         
         
               :
              
              
               :
              
              
              
                    
              
              
          
    

5. Tạo các class Action :

public class CustomerAction extends Action
{
      public ActionForward execute(ActionMapping mapping, ActionForm form,
           HttpServletRequest request, HttpServletResponse response) throws Exception
           {
           ActionForward nextPage = null;
           if (isCancelled(request)) {
                 System.out.println("Cancel Operation Performed");
                 return mapping.findForward("mainpage");
           }
           CustomerForm custForm = (CustomerForm) form;
           if ("Save".equals(custForm.getStep()))
           {
                  String firstName = custForm.getFirstName();
                  String lastName = custForm.getLastName();
                  System.out.println("Customer First name is " + firstName);
                  System.out.println("Customer Last name is " + lastName);
                  nextPage = mapping.findForward("success");
           }
           return nextPage;
      }
}

6. Thêm properties cho MessageResources.properties :

########################################
# Exercise01 index page strings
########################################
exercise01.indexpage.title=Welcome to Exercise01

########################################
# Exercise01 CustomerForm strings
########################################
exercise01.formpage.title=Please enter your details
prompt.customer.firstname=First Name
prompt.customer.lastname=Last Name
button.save=Save
button.cancel=Cancel

7. Thêm validation cho các bean Form :

public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
       ActionErrors errors = new ActionErrors();

       // Firstname cannot be empty
       if (firstName == null || firstName.trim().equals("")) {
              errors.add("firstName", new ActionError("error.cust.firstname.empty"));
       }

       // Lastname cannot be empty
       if (lastName == null || lastName.trim().equals("")) {
              errors.add("lastName", new ActionError("error.cust.lastname.empty"));
       }
      return errors;
}

8. Thêm các khóa cho ActionError từ Message Resources :


########################################
# Common
########################################
errors.header=

Validation Error

You must correct the following error(s) before proceeding:
errors.footer=
errors.prefix=
  • errors.suffix=

    ########################################
    # Exercise01 CustomerForm ActionErrors
    ########################################
    error.cust.firstname.empty=First Name is Required
    error.cust.lastname.empty=Last Name is Required

    Xem tiếp phần còn lại.

    DangTrung.

    Thứ Bảy, 3 tháng 1, 2009

    Viết ứng dụng đầu tiên với Struts (Phần 1)

    Hãy là bắt đầu với việc phát triển ứng dụng Struts đầu tiên của bạn. Sau đây là các bước liên quan trong việc tạo ra các ứng dụng Struts.
    1. Thêm các mục liên quan vào web.xml
      1. Thêm ActionServlet cấu hình với các tham số khởi tạo
      2. Thêm mapping ActionServlet
      3. Thêm khai báo liên quan taglib
    2. Bắt đầu với một mẫu trống cho các struts-config.xml. Trong struts-config.xml, thêm thông tin sau
      1. Khai báo RequestProcessor
      2. Tạo một file tài sản và công bố đó là Message Resource Bundle
      3. Kê khai các nguồn tin Bundle
      4. Kê khai các form-bean
      5. Khai báo ActionMapping cho form-bean
      6. Thêm các forwards trong ActionMapping
    3. Tạo các class form-bean
    4. Tạo JSP với thẻ Struts
    5. Tạo các class Action
    6. Đối với mỗi thẻ trong JSP, thêm giá trị cặp chìa khóa để các tin nhắn Resource Bundle (các thuộc tính tập tin) được tạo ra trong bước 2b
    7. Thêm Validation trong form-bean
    8. Xác định các thông báo lỗi trong Resource Bundle tin nhắn
    9. Tạo phần còn lại của JSP.

    Tiếp theo, bạn sẽ tìm thấy các bước để xây dựng ứng dụng Struts. Bạn sẽ tìm thấy lời giải thích hợp lý hơn và cho các bước trong cuốn sách Survival Hướng dẫn Struts.


    1. Thêm các mục liên quan vào các web.xml : web.xml cho các ứng dụng Struts
            "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
            "http://java.sun.com/dtd/web-app_2_3.dtd">
          Hello World Struts Application
         
               action
               org.apache.struts.action.ActionServlet
              
                      config
                      /WEB-INF/struts-config.xml
              
              
                      debug
                      3
              
              
                      detail
                      3
              
               1
          
          
                 action
                 *.do
          
          
                  index.jsp
          
          
                 /WEB-INF/struts-html.tld
                 /WEB-INF/struts-html.tld
          
          
                  /WEB-INF/struts-bean.tld
                  /WEB-INF/struts-bean.tld
          

    2. Tạo struts-config.xml :

         "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" 
         "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
          
               
          
          
               
          
          
                 
                         name="CustomerForm" scope="request" validate="true"  
                         input="CustomerForm.jsp">
                        
                 
           
           
           
     

    3. Tạo ActionForm :

    public class CustomerForm extends ActionForm {
          private String firstName;
          private String lastName;

          public CustomerForm() {
                firstName = “”; lastName = “”;
          }
          public String getFirstName() {
                return firstName;
          }
          public void setFirstName(String firstName) {
                this.firstName = firstName;
          }
          public String getLastName() {
                return lastName;
          }
          public void setLastName(String lastName) {
                this.lastName = lastName;
          }
    }

    Xem tiếp phần sau

    DangTrung.

    Giới thiệu về Kiến trúc của Struts

    Hướng dẫn này có vẻ chặt chẽ tại các thuật ngữ Struts cho servlet Controller và đối tượng Handler mà chúng ta đề cập và hiểu với hình dưới đây. Vì đây là cái nhìn đầu tiên của bạn tại Struts, chúng ta sẽ không nhận được từng chi tiết của vòng đời xử lý yêu cầu HTTP Struts Framework. Và bây giờ, chúng ta hãy tập trung vào các vấn đề cơ bản.

    Trong Struts, chỉ có một bộ điều khiển servlet cho toàn bộ ứng dụng web. Điều này được gọi là bộ điều khiển servlet ActionServlet và nằm trong gói org.apache.struts.action. Nó chặn đứng tất cả các yêu cầu khách hàng và populates một ActionForm từ các thông số yêu cầu HTTP. ActionForm là một JavaBeans class bình thường. Nó có một số thuộc tính tương ứng với các thông số yêu cầu HTTP và getter, setter cho những thuộc tính. Bạn phải tạo ActionForm của riêng bạn cho mọi yêu cầu HTTP được xử lý thông qua các Framework Struts bằng cách mở rộng các class org.apache.struts.action.ActionForm. Xem xét các yêu cầu HTTP sau cho ứng dụng web example - http://localhost:8080/example/create.do?firstName=Trung&lastName=Dang. Lớp ActionForm cho yêu cầu HTTP được hiển thị trong danh sách dưới đây. Các MyForm class mở rộng lớp org.apache.struts.action.ActionForm và có hai thuộc tính - firstName và lastName. Nó cũng có các phương thức getter và setter cho các thuộc tính này. Đối với việc thiếu các thuật ngữ tốt hơn, hãy cho chúng ta một thuật ngữ để mô tả các lớp học như ActionForm. View truyền dữ liệu đối tượng là một đối tượng chứa dữ liệu từ các trang html và chuyển nó xung quanh trong Framework web lớp và các lớp ứng dụng.

    public class MyForm extends ActionForm {
         private String firstName;
         private String lastName;
         public MyForm() {
               firstName = "";
               lastName = "";
         }
         public String getFirstName() {
               return firstName;
         }
         public void setFirstName(String s) {
               this.firstName = s;
         }
         public String getLastName() {
               return lastName;
         }
         public void setLastName(String s) {
               this.lastName = s;
         }
    }

    Struts là một Framework trình bày đầy đủ. Trong suốt phát triển của ứng dụng, cả hai tác giả các trang và nhu cầu phát triển để phối hợp và đảm bảo rằng bất kỳ thay đổi cho một khu vực được xử lý thích hợp khác. Nó hỗ trợ sự phát triển nhanh chóng các ứng dụng web bằng cách tách biệt những mối quan tâm trong các dự án. Ví dụ, nó có thẻ tùy chỉnh cho JSP. Tác giả trang có thể tập trung phát triển các JSP sử dụng các thẻ tùy chỉnh mà được quy định bởi framework. Các nhà phát triển ứng dụng các công trình trên tạo ra các đại diện phía máy chủ các dữ liệu và tương tác của nó với một kho dữ liệu phía sau. Hơn nữa nó cung cấp một cách thống nhất xử lý của người dùng và chế biến nó. Nó cũng có các điểm mở rộng cho các tùy biến các Framework và nhiều hơn nữa. Trong phần này, bạn đã xem mắt một con chim các Struts công trình như thế nào. Các chi tiết khác đang chờ đón bạn trong các chương trước. Nhưng bạn phải cài đặt Tomcat và Struts trên máy của bạn để hiểu rõ hơn các chương trước. Do đó chúng tôi sẽ bao gồm một thời gian ngắn cài đặt Tomcat và Struts trong phần ext.

    DangTrung.

    Cấu hình bộ điều khiển với MVC trong Struts

    Khi ứng dụng được nhiều bạn không thể bám vào khung MVC. Bạn có để mở rộng nó bằng cách nào đó để đối phó với những phức tạp. Một cơ chế mở rộng MVC đã thấy áp dụng rộng rãi dựa trên một Servlet điều khiển cấu hình. Các MVC với servlet điều khiển cấu hình được thể hiện trong hình dưới đây.

    Khi yêu cầu HTTP đến từ khách hàng, các Servlet Controller nhìn lên trong một thuộc tính tập tin để quyết định việc class quyền cho các bộ xử lý yêu cầu HTTP. Lớp này handler được gọi là các Handler Yêu cầu. Các Handler Yêu cầu chứa các logic trình bày cho rằng yêu cầu HTTP bao gồm cả gọi logic kinh doanh. Nói cách khác, các Handler Yêu cầu làm mọi thứ cần thiết để xử lý các yêu cầu HTTP. Sự khác biệt duy nhất cho đến nay từ xương trần MVC là các controller servlet nhìn lên trong một thuộc tính tập tin để khởi tạo các bộ xử lý thay vì gọi nó trực tiếp.

    Ví dụ :


    public class MyControllerServlet extends HttpServlet {

           private Properties props;

           public init(ServletConfig config) throws ServletException {
                  try {
                         props = new Properties();
                         props.load(new FileInputStream("C:/file.properties"));
                  } catch (IOException ioe) {
                         throw new ServletException(ioe);
                 }
          }

          public void doGet(HttpServletRequest httpRequest,
                 HttpServletResponse httpResponse) throws ServletException, IOException {
                 String urlPath = httpRequest.getPathInfo();
                 String reqhandlerClassName = (String) props.get(urlPath);
                 HandlerInterface handlerInterface = (HandlerInterface)
                            Class.forName(reqhandlerClassName).newInstance();
                 String nextView = handlerInterface.execute(httpRequest);

                 RequestDispatcher rd = getServletContext().getRequestDispatcher(nextView);
                 rd.forward(httpRequest, httpResponse);
          }
    }

    Trong lúc này, bạn có thể tự hỏi làm thế nào điều khiển servlet sẽ biết để khởi tạo các handler thích hợp. Câu trả lời là đơn giản. Hai HTTP yêu cầu khác nhau không thể có cùng một URL. Do đó bạn có thể chắc chắn rằng URL xác định duy nhất từng yêu cầu HTTP trên phía máy chủ và do đó mỗi URL cần một Handler duy nhất. Trong thuật ngữ đơn giản, có một ánh xạ một-một giữa các URL và lớp Handler. Thông tin này được lưu giữ như là chìa khóa cặp giá trị trong tập tin thuộc tính. Các Controller Servlet tải các thuộc tính tập tin khi khởi động để tìm các yêu cầu thích hợp cho từng yêu cầu Handler URL gửi đến.

    Các bộ điều khiển sử dụng Java servlet Reflection để khởi tạo các yêu cầu Handler. Tuy nhiên phải có một số loại tương đồng giữa người xử lý yêu cầu cho các servlet để chung về khởi sự Handler Yêu cầu. Tính phổ biến là tất cả các yêu cầu Handler các lớp thực hiện một giao diện chung. Cho chúng tôi gọi đây là giao diện phổ biến như Handler giao diện. Trong hình thức đơn giản của nó, các Handler 

    Giao diện là một trong những phương pháp nói, execute(). Các servlet điều khiển đọc các thuộc tính tập tin để khởi tạo các Handler Yêu cầu như thể hiện trong chương trình trên.

    Các Servlet Controller instantiates các Handler Yêu cầu trong doGet() và gọi phương thức các phương pháp execute() phương pháp trên nó bằng cách sử dụng Java Reflection. Việc execute() phương pháp gọi phương thức logic kinh doanh thích hợp từ các lớp giữa và sau đó chọn xem tiếp theo sẽ được trình bày cho người dùng. Các servlet điều khiển chuyển các yêu cầu cho xem JSP chọn. Tất cả điều này xảy ra trong doGet() của servlet controller. Những doGet () phương pháp vòng đời không bao giờ thay đổi. Những thay đổi là phương pháp execute(). Yêu cầu của các Handler. Bạn có thể không nhận ra nó, nhưng bạn chỉ thấy làm thế nào các công trình Struts Tóm lại! Struts là một servlet điều khiển dựa trên cấu hình MVC Framework mà thực hiện được xác định trước phương pháp trong các đối tượng xử lý. Thay vì sử dụng một thuộc tính tập tin như chúng tôi đã làm trong ví dụ này, Struts sử dụng XML để lưu trữ thông tin hữu ích hơn.

    Thứ Sáu, 2 tháng 1, 2009

    Làm thế nào highlight error fields trong Struts

    Trong ví dụ này, chúng tôi sẽ xem làm thế nào để đánh dấu các trường lỗi. Điều này được thực hiện bằng cách tạo ra một phong cách riêng biệt để áp dụng khi lỗi xãy ra. Giá trị này có phong cách được thiết lập để các errorStyleClass thuộc tính của Struts tương ứng tag html. Trong ví dụ của chúng ta các trang login.jsp chứa mã sau đây.


    Và kết quả tôi có :

    Download Source : Here

    Framework Validator trong Struts

    Validator Framework trong Struts bao gồm hai tập tin cấu hình XML. Các đầu tiên được file validator-rules.xml trong đó có các định nghĩa mặc định Struts validator pluggable. Bạn có thể thêm các quy tắc validation mới bằng cách thêm một mục trong tập tin này. Thứ hai là tập tin validation.xml có chứa thông tin chi tiết về các thủ tục validation mà được áp dụng cho các Beans Form khác nhau. Những tập tin hai cấu hình phải đặt ở đâu đó bên trong thư mục WEB-INF / của ứng dụng.

    Để sử dụng các pluggin validator bước đầu tiên là phải thêm vào trong cấu hình Struts tập tin như hình dưới đây. Pluggin này cần được thêm vào sau khi bất kỳ thông báo các yếu tố tài nguyên trong file struts cấu hình như hình dưới đây.

          
                  value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>

    Bây giờ chúng ta cùng làm một ví dụ nho nhỏ với chủ đề Validation. Đây là hình cấu trúc dự án của tôi


    Bước tiếp theo là thêm validations vào các trường form trong file validation.xml. Tên Form của chúng tôi là "LoginForm" và trường tên là "userName" và "password".

    Các file validation.xml chứa mã sau đây.


    Mỗi tag có thể chứa nhiều thẻ . Ghi rõ tên mẫu đơn mà bạn muốn liên kết với Framework Validation là giá trị của thuộc tính tên các thẻ form. Tên các các form quy định ở đây nên được giống như một quy định trong file struts-config.xml.

    Bây giờ bạn có thể kết hợp từng thuộc tính của bean form với một hoặc nhiều quy tắc validation định trước. Các phụ thuộc thuộc tính của thẻ trường có danh sách phân cách bằng dấu phẩy các required liên kết với mỗi property .

    Các property userName được kết hợp với các quy tắc "required" có nghĩa là giá trị không thể để trống. Các thông báo lỗi sẽ được hiển thị khi một quy tắc cụ thể không thỏa mãn là required trong tập tin ApplicationResource.properties.

    Chúng ta thông qua giá trị chính là "LoginForm.userName" trong thẻ đối số. Giá trị cho khoá này sẽ được lấy từ các tập tin ApplicationResource.properties và giá trị này sẽ được sử dụng để tạo ra các tin nhắn errors.required. Trong trường hợp của chúng ta nếu userName không nhập vào, thông báo lỗi sẽ được hiển thị như là "Tên là requierd." Các chỉ mục chúng ta cần phải thực hiện trong tập tin ApplicationResource.properties là "LoginForm.userName Tên người dùng =", mục khác đã được cung cấp do framework.

    Để kết hợp nhiều hơn một nguyên tắc validation đối với tài sản chúng ta có thể chỉ định một danh sách phân cách bằng dấu phẩy các giá trị. Nguyên tắc đầu tiên trong danh sách sẽ được kiểm tra đầu tiên và sau đó là quy luật tiếp theo và như vậy.

    Bây giờ cho phép xem làm thế nào validation công trình. Nhấp vào nút Đăng nhập mà không cần nhập bất kỳ giá trị, các thông báo lỗi sau đây được hiển thị cho người dùng.

    Kết quả sau khi tôi hoàn tất, tôi để trống dữ liệu và nhấn submit :

    Download Source : Here

    DangTrung.

    Tìm hiều mô hình kiến trúc của Struts (Phần 2)

    Các kiến trúc Model 2 thiết kế các trang JSP là trong thực tế, Model View Controller (MVC) áp dụng cho các ứng dụng web. Do đó hai điều khoản có thể được sử dụng thay thế cho nhau trong thế giới web. MVC bắt nguồn từ Smalltalk và từ đó đã được thực hiện theo cách của mình vào cộng đồng Java. Mô hình 2 architecure và dẫn xuất của nó là nền tảng cho tất cả các ứng dụng web nặng và sức mạnh công nghiệp thiết kế trong thế giới thực. Vì vậy nó là cần thiết cho bạn hiểu kỹ mô hình này. Hình 1.2 cho thấy mô hình 2 (MVC) kiến trúc.

    Sự khác biệt chính giữa Model 1 và Model 2 là trong Model 2, điều khiển một xử lý các yêu cầu người dùng thay vì một JSP. Bộ điều khiển được thực hiện như một Servlet. Các bước sau đây được thực hiện khi người dùng gửi yêu cầu.
    • Các Servlet Controller xử lý yêu cầu của người dùng. (Điều này có nghĩa là các siêu liên kết trong JSP nên chỉ tới servlet controller).
    • Các Servlet Controller sau đó instantiates JavaBeans phù hợp dựa trên các thông số yêu cầu (và tùy chọn cũng dựa trên thuộc tính kỳ họp).
    • Các Servlet Controller sau đó tự mình hoặc thông qua một giao tiếp trợ giúp điều khiển với các trung cấp hoặc trực tiếp vào cơ sở dữ liệu để lấy dữ liệu cần thiết.
    • Bộ điều khiển bộ các JavaBeans kết quả (hoặc cùng một hoặc một mới) tại một trong những bối cảnh sau đây - yêu cầu, phiên hoặc ứng dụng.
    • Bộ điều khiển sau đó công văn yêu cầu cho xem tiếp theo dựa vào URL yêu cầu.
    • View sử dụng các JavaBeans kết quả từ Bước 4 để hiển thị dữ liệu. Lưu ý rằng không có logic trình bày trong JSP. Các chức năng duy nhất của JSP trong kiến trúc 2 Model là để hiển thị các dữ liệu từ các JavaBeans thiết lập trong phạm vi yêu cầu, phiên hoặc ứng dụng.

    (Ảnh minh họa được sử dụng từ http://www.java-samples.com/images/model2architecture.jpg)

    Ưu điểm các Model 2 Kiến trúc
    Vì không có logic trình bày trong JSP, không có scriptlets. Điều này có nghĩa là nightmares nhỏ hơn. [Chú ý rằng mặc dù Model 2 là hướng loại bỏ các scriptlets, nó không có kiến trúc khiến bạn thêm scriptlets. Điều này đã dẫn đến lạm dụng rộng rãi các kiến trúc 2 mẫu này.]

    Với MVC bạn có thể có nhiều điều khiển servlet trong ứng dụng web của bạn. Trong thực tế bạn có thể có một Controller Servlet mỗi mô-đun. Tuy nhiên có một số lợi thế của việc có một servlet điều khiển duy nhất cho toàn bộ các ứng dụng web. Một ứng dụng web thông thường, có một số nhiệm vụ mà bạn muốn làm cho mọi yêu cầu gửi đến. Ví dụ, bạn có để kiểm tra xem người dùng yêu cầu một hoạt động được phép làm như vậy. Bạn cũng muốn đăng nhập của người sử dụng và thoát ra từ các ứng dụng web cho mọi yêu cầu. Bạn có thể muốn tập trung các logic để điều phối các yêu cầu tới điểm khác. Danh sách đi. Nếu bạn có một vài điều khiển servlet, cơ hội được rằng bạn phải lặp lại trong logic cho tất cả các nhiệm vụ trên trong tất cả các nơi. Một servlet điều khiển duy nhất cho các ứng dụng web cho phép bạn tập trung tất cả các nhiệm vụ ở một nơi duy nhất. Mã thanh lịch và dễ dàng hơn để duy trì.

    Các ứng dụng Web dựa trên kiến trúc 2 Model được dễ dàng hơn để duy trì và mở rộng từ các quan điểm không tham khảo với nhau và không có logic trình bày trong các quan điểm. Nó cũng cho phép bạn xác định rõ vai trò và trách nhiệm trong dự án lớn do đó cho phép phối hợp tốt hơn giữa các thành viên trong nhóm.

    DangTrung.