Struts與策略模式那點事

來源:互聯網
上載者:User

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

        前端控制器ActionServlet的職責:

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

                2、根據截取的路徑,執行個體化相應的業務控制器

        業務控制器Action的職責:

                1、擷取參數

                2、調用商務邏輯

                3、完成轉向

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

Action:

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:

public class ActionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//截取訪問的URIString requestURI = request.getRequestURI();//對URI進行截取,例如localhost:8080//test/addUser.do,截取後就是/addUserString 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);}@Overrideprotected 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核心對象在下篇部落格中將會一一闡述。

        使用架構會影響程式的效率,但是以現在硬體的水平,這些效率問題不再是主要問題,規範性開發被奉為最高綱領。軟體開發從最初最少代碼到現在規範性開發,這不得不讚歎電腦發展的速度。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.