Thứ Hai, 5 tháng 1, 2009

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

Không có nhận xét nào:

Đăng nhận xét