程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> Struts與策略模式那點事

Struts與策略模式那點事

編輯:關於JSP

     Struts1無疑是一個灰常經典的MVC框架,在Struts有前端控制器和業務控制器的概念。那麼這兩個控制器的本質又是什麼呢?讓我來帶你一步步走進它的世界。

        前端控制器ActionServlet的職責:


                1、通過對訪問路徑的截取


                2、根據截取的路徑,實例化相應的業務控制器


        業務控制器Action的職責:

                1、獲取參數


                2、調用業務邏輯


                3、完成轉向


        下面,給大家看一個比較簡單的struts的MVC框架的實現


Action:


[html]
public interface Action { 
     
    public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception; 

 
 
public class AddUserAction implements Action { 
    public String execute(HttpServletRequest request, 
            HttpServletResponse response) throws Exception { 
        String username = request.getParameter("username"); 
         
        //調用業務邏輯 
        UserManager userManager = new UserManager(); 
        userManager.add(username); 
        return "/add_success.jsp"; //轉向路徑可以通過配置文件讀取 
    } 

public interface Action {
 
 public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception;
}


public class AddUserAction implements Action {
 public String execute(HttpServletRequest request,
   HttpServletResponse response) throws Exception {
  String username = request.getParameter("username");
  
  //調用業務邏輯
  UserManager userManager = new UserManager();
  userManager.add(username);
  return "/add_success.jsp"; //轉向路徑可以通過配置文件讀取
 }
}
ActionServlet:


[html] view plaincopyprint?public class ActionServlet extends HttpServlet { 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
        //截取訪問的URI 
        String requestURI = request.getRequestURI(); 
        //對URI進行截取,例如localhost:8080//test/addUser.do,截取後就是/addUser 
        String path = requestURI.substring(requestURI.indexOf("/", 1), requestURI.indexOf(".")); 
         
        Action action = null; 
        if ("//addUser".equals(path)) { 
            action = new AddUserAction(); 
        }else { 
            throw new RuntimeException("請求失敗"); 
        } 
        String forward = null; 
        try { 
            forward = action.execute(request, response); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        request.getRequestDispatcher(forward).forward(request, response); 
    } 
 
    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
        doGet(request, response); 
    } 

public class ActionServlet extends HttpServlet {
 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  //截取訪問的URI
  String requestURI = request.getRequestURI();
  //對URI進行截取,例如localhost:8080//test/addUser.do,截取後就是/addUser
  String path = requestURI.substring(requestURI.indexOf("/", 1), requestURI.indexOf("."));
  
  Action action = null;
  if ("//addUser".equals(path)) {
   action = new AddUserAction();
  }else {
   throw new RuntimeException("請求失敗");
  }
  String forward = null;
  try {
   forward = action.execute(request, response);
  } catch (Exception e) {
   e.printStackTrace();
  }
  request.getRequestDispatcher(forward).forward(request, response);
 }

 @Override
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doGet(request, response);
 }
}

 

        但是現在還有一些問題,就是當增加一個業務邏輯的時候,我們就不得不修改ActionServlet,違背了設計模式中的開閉原則。在設計模式中有這樣一句話,凡是有if...else...和switch..case...語句的地方,就可以通過反射來消除。
        struts正是通過一個struts-config.xml來消除了ActionServlet中的if...else...語句,使得ActionServlet更加具有通用性,從而開發人員只需要編寫Action,然後配置到xml文件中即可。

        靜下心來想,實質上不就是一個策略模式的調用麼?回頭之前做過的系統,要想系統變的靈活,其實就是一個又一個策略模式的應用。策略加反射的結合通常是一個框架的核心組成。

        至此,對於策略模式的理解便不得不深入一下了。

        最最開始接觸策略模式的時候,是這樣理解的:對於一件事的不同做法。而這一件事當初的理解是具體的事情,例如付款可以由用信用卡,現金,支票等。而對於付款和吃飯這兩件事,就不會想到這是一件事。其實這只是粒度大小的不同而已。

        如果提升到這都是人的一個活動層次上呢?二者是不是就可以說是一件事,不同的處理方法了呢?


        struts就是這樣做的,把所有的請求抽取一個接口Action,需要修改的方法為execute(),這些就是Struts的核心思想,其他的Struts核心對象在下篇博客中將會一一闡述。


        使用框架會影響程序的效率,但是以現在硬件的水平,這些效率問題不再是主要問題,規范性開發被奉為最高綱領。軟件開發從最初最少代碼到現在規范性開發,這不得不贊歎計算機發展的速度。


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved