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核心對象在下篇博客中將會一一闡述。
使用框架會影響程序的效率,但是以現在硬件的水平,這些效率問題不再是主要問題,規范性開發被奉為最高綱領。軟件開發從最初最少代碼到現在規范性開發,這不得不贊歎計算機發展的速度。