Hiển thị các bài đăng có nhãn MVC. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn MVC. Hiển thị tất cả bài đăng

Thứ Hai, 5 tháng 1, 2009

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");

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

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ứ Năm, 1 tháng 1, 2009

Kiến trúc Struts MVC

Struts là một framework mã nguồn mở từ Apache Jakarta cho các ứng dụng xây dựng bằng cách sử dụng Model View Controller (MVC) thiết kế mô hình. Struts cung cấp cơ sở hạ tầng cơ bản để triển khai MVC cho phép các nhà phát triển tập trung vào logic business. framework này cũng linh hoạt và có thể được mở rộng để đáp ứng các yêu cầu cụ thể cho dự án.

Mục tiêu của bài viết này là để giúp người dùng nhanh chóng có được bắt đầu với việc sử dụng Struts trong các ứng dụng của mình. Nó cũng cho thấy sử dụng Struts cho thực hiện (MVC) kiến trúc trong các ứng dụng web của mình.

Kiến trúc MVC

Mục đích của kiến trúc MVC là để tách logic business và dữ liệu của các ứng dụng từ các presentation của dữ liệu cho người dùng. Sau đây là mô tả nhỏ của mỗi thành phần trong kiến trúc MVC:

Model: Mô hình đại diện cho dữ liệu của ứng dụng. Bất cứ điều gì mà một ứng dụng sẽ vẫn tồn tại trở thành một phần của mô hình. Mô hình này cũng xác định các cách truy cập vào dữ liệu (các logic nghiệp vụ của ứng dụng) cho các thao tác. Nó không biết gì về cách thức các dữ liệu sẽ được hiển thị bằng ứng dụng. Nó chỉ cung cấp dịch vụ truy cập dữ liệu và sửa đổi nó.

View: view đại diện trình bày của ứng dụng. View Các truy vấn các mô hình cho nội dung của nó và làm cho nó. Cách mô hình sẽ được đưa ra được định nghĩa bằng cách xem. View không phụ thuộc vào dữ liệu hoặc thay đổi các ứng dụng logic và cùng vẫn còn ngay cả khi trải qua logic kinh doanh sửa đổi.

Controller: Tất cả các yêu cầu người sử dụng các ứng dụng thông qua bộ điều khiển. Bộ điều khiển chặn các yêu cầu từ xem và chuyển nó để các mô hình cho các hành động thích hợp. Căn cứ vào kết quả của hành động trên dữ liệu, điều khiển hướng người dùng đến xem tiếp theo.

Struts MVC Semantics

Các đối tượng Controller
Bộ điều khiển được thực hiện bởi class ActionServlet. Nó cung cấp một địa điểm cho trung tâm xử lý tất cả các yêu cầu khách hàng

      action
      org.apache.struts.action.ActionServlet

Tất cả các URIs yêu cầu với các kiểu *. được thực hiện ánh xạ tới servlet này trong mô tả triển khai như sau.

       action
       *.do

Một yêu cầu URI phù hợp với mô hình này sẽ có các hình thức sau đây.

http://www.my_site_name.com/mycontext/actionName.do

Các mapping trước đó được gọi là mapping mở rộng, tuy nhiên, bạn cũng có thể chỉ định đường dẫn mapping nơi mô hình một kết thúc với /* như hình dưới đây.

       action
       /do/*

Một yêu cầu URI phù hợp với mô hình này sẽ có các hình thức sau đây.

http://www.my_site_name.com/mycontext/do/action_Name

Các mapping hợp lý các nguồn tài nguyên mô tả ở trên cho phép sửa đổi các mappings tài nguyên trong file cấu hình mà không cần phải thay đổi mã ứng dụng, đây là chương trình mapping cũng được gọi là Mapping Resource Mulitplexed. Controller cung cấp một điểm truy cập tập trung cho tất cả các yêu cầu presentationtier. Controller yêu cầu mỗi đại biểu đến với các RequestProcessor.


Các đối tượng dispatcher
Các RequestProcessor chức năng như điều phối và xử lý các yêu cầu của khách hàng bởi instantiating (hoặc tái sử dụng) một bộ xử lý yêu cầu, và tạo thành một bean tương ứng. Các lỗi được tạo ra, hoặc thrown trường hợp ngoại lệ do các bean form và handlers yêu cầu được xử lý bởi các RequestProcessor,trong đó ảnh hưởng đến chức năng quản lý view của các RequestProcessor.Form bean hỗ trợ RequestProcessor để lưu trữ các dữ liệu mẫu/hoặc dàn dựng mô hình dữ liệu trung gian yêu cầu của view. RequestProcessor sử dụng khai báo trong file struts-config.xml, như hình dưới đây, cho instantiating yêu cầu xử lý cụ thể.


       
                  name="customerProfileForm" scope="request"/>


Tất cả yêu cầu đến sẽ được phân cấp của controller cho dispatcher, đó là đối tượng RequestProcessor. RequestProcessor xem xét các yêu cầu URI cho một hành động định danh, tạo ra một trường hợp xử lý yêu cầu sử dụng thông tin trong các đối tượng cấu hình ActionMapping(giải thích trong phần kế tiếp), và gọi requesthandler.execute(…).Các method execute(...) của trình xử lý yêu cầu có trách nhiệm tương tác với các mô hình ứng dụng. Tùy thuộc vào kết quả, trình xử lý yêu cầu sẽ trả về một đối tượng cấu hình ActionForward(ActionForward là đại diện thời gian chạy các phần tử và được giải thích trong phần Danh mục chính sử dụng ActionForward) cho RequestProcessor. Các RequestProcessor sẽ sử dụng các đối tượng ActionForward cho gọi view tiếp bằng cách gọi hoặc là RequestDispatcher.forward(...) hoặc response.sendRedirect (...).

Command Pattern using ActionMapping
Struts cung cấp một cách khai báo các chỉ định ánh xạ giữa các đường dẫn servlet trong URI therequest và yêu cầu xử lý thích hợp bằng cách sử dụng cú pháp XML. Thực hiện này tương tự như lệnh mẫu [GOF]. Đoạn sau đây là từ file struts-config.xml, các khai báo được sử dụng để tạo ra một đối tượng cấu hình ActionMapping, là đại diện thời gian chạy các các phần tử .


       
                name="customerProfileForm" scope="request"/>


Vắn tắt sau đây giải thích các thuộc tính được sử dụng trong việc kê khai trước đó.

Path : path tương đối trong context các yêu cầu HTTP được sử dụng để xác định mapping này action.
Type : tên Class sẽ được sử dụng cho việc tạo một thể hiện của trình xử lý yêu cầu này.
Name : Tên hợp lý các một JavaBean, còn được gọi là bean form, mà sẽ được sử dụng để giữ dữ liệu form. Các form bean sẽ được lưu trong phạm vi quy định cách sử dụng tên này.
Scope : yêu cầu, phạm vi phiên cho việc lưu form bean.

Ngoài ra còn rất nhiều xử lý, kỷ thuật mà Struts MVC đã dùng, nói chung có thể tóm tắt lại như sau :

Những sự kiện sau đây xảy ra khi các browser Client một yêu cầu HTTP.
  • ActionServlet nhận được các yêu cầu.
  • Các file struts-config.xml có các nội dung liên quan đến các hành động, ActionForms, ActionMappings và ActionForwards.
  • Trong thời gian khởi động ActionServelet việc đọc file struts-config.xml và tạo ra một cơ sở dữ liệu các đối tượng cấu hình. Sau khi xử lý các yêu cầu ActionServlet các quyết định theo đề cập với đối tượng này.
Khi ActionServlet nhận được yêu cầu nó những nhiệm vụ sau đây.
  • Bundles tất cả các giá trị yêu cầu vào một class JavaBean trong đó mở rộng Struts class ActionForm.
  • Quyết định trong đó action xử lý yêu cầu.
  • Xác thực dữ liệu nhập vào do người sử dụng.
  • Các class action xử lý yêu cầu với sự giúp đỡ các các thành phần mô hình. Mô hình Các tương tác với các cơ sở dữ liệu và xử lý các yêu cầu.
  • Sau khi hoàn tất các yêu cầu chế biến các class hành động trả về một ActionForward với điều khiển.
  • Căn cứ vào ActionForward bộ điều khiển sẽ gọi view thích hợp.
  • Các phản ứng HTTP được kết xuất trở lại cho người sử dụng do các thành phần view.
DangTrung.