struts(一)——jsp+Servlet講解MVC架構基本原理

來源:互聯網
上載者:User

自從接觸java一來,經常在論壇上看到一些大牛談論架構云云,每每都覺得他們這些懂架構的都是真的大牛啊。羨慕嫉妒恨不能當飯吃,咱也跟隨巨人的步伐,開始研究架構之旅。struts是所有架構中最簡單、最經典的,從struts開始入手,算是一步捷徑。

本篇作為預備篇,先從緣起緣滅開始吧——MVC基本原理。

MVC架構3個部分間的功能協作過程,已經很清楚了,不過這裡可以再簡單提一下:

               

1、終端使用者發出一個請求,該請求到達Controller控制器。

2、控制器接受請求後,會檢查該請求,然後決定使用什麼商務邏輯來處理該請求,這時控制器會將該請求轉寄給一個相應的商務邏輯去處理;

3、模型中包含處理該使用者請求的所有業務組件,並且也執行使用者所需要的全部資料存取,代表終端使用者查詢檢索出的任何資料都被打包返回給控制器。

4、控制器接受從模型返回的資料,並選擇顯示這些資料的相應的視圖,並將視圖返回給使用者。

下面,先來採用一個不靈活的Servlet進行實現:

package com.xxjstgb.servlet;import java.io.IOException;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class TestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String requestURI = request.getRequestURI();                int start=requestURI.indexOf("/",1);                int end=requestURI.indexOf(".");                String path=requestURI.substring(start,end);                System.out.println("path=" + path);String username = request.getParameter("username");UserManager userManager = new UserManager();String forward = "";if ("/servlet/delUser".equals(path)) {userManager.del(username);forward = "/del_success.jsp";}else if ("/servlet/addUser".equals(path)) {userManager.add(username);forward = "/add_success.jsp";}else if ("/servlet/modifyUser".equals(path)) {userManager.modify(username);forward = "/modify_success.jsp";}else if ("/servlet/queryUser".equals(path)) {List userList = userManager.query(username);request.setAttribute("userList", userList);forward = "/query_success.jsp";}else {throw new RuntimeException("請求失敗");}request.getRequestDispatcher(forward).forward(request, response);       }} 

設定檔:

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><servlet><servlet-name>TestServlet</servlet-name><servlet-class>com.xxjstgb.servlet.testServlet</servlet-class></servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping></web-app>

當使用者發出請求時(比如請求為:http://localhost:8080/struts_dispatchaction/servlet/delUser.do),根據使用者請求的具有一定特點的URL(該URL以/servlet/開頭或者是*.do結尾),訪問到相應的Servlet。

根據設定檔可知:這裡配置的是以".do"結尾的請求,都能夠訪問到TestServlet。該Servlet又截取了每個請求中特有的部分"/servlet/delUser",根據這個串兒,調用相應的商務邏輯,並作相應的轉向。

不過這種實現方式,大家一看便會覺得很不妥,這個Servlet的任務太重了。在這裡調用了模型層邏輯,同時也進行了所有的頁面轉向。另外,包含了大量的if…else語句,由於業務的不穩定性,這裡如果經常需要添加或者刪除else語句的話,這將是一個非常糟糕的設計。

下面改良設計,我們將控制器細化為前端控制器TestServlet和業務控制器Action。

前端控制器有兩個任務:1、根據一定規則,截取url;2、根據url分發到相應的Action。

業務控制器負責:1、接受表單資料;2、調用商務邏輯;3、返迴轉向資訊。

Action:

package com.xxjstgb.servlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public interface Action {public String execute(HttpServletRequest request, HttpServletResponse response)throws Exception;}

delUserActiion:

package com.xxjstgb.servlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class DelUserAction implements Action {public String execute(HttpServletRequest request,HttpServletResponse response) throws Exception {                //接收表單參數                String username = request.getParameter("username");//調用商務邏輯UserManager userManager = new UserManager();try {userManager.del(username);}catch(Exception e) {return "del_error.jsp"; //轉向路徑可以通過設定檔讀取}                //轉向資訊                return "/del_success.jsp"; //轉向路徑可以通過設定檔讀取}}

改良設計後的TestServlet:

package com.xxjstgb.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class TestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String requestURI=request.getRequestURI();int start=requestURI.indexOf("/",1);int end=requestURI.indexOf(".");String path=requestURI.substring(start,end);Action action = null;if ("/servlet/delUser".equals(path)) {action = new DelUserAction();}else if ("/servlet/addUser".equals(path)) {action = new AddUserAction();}else if ("/servlet/modifyUser".equals(path)) {action = new ModifyUserAction();}else if ("/servlet/queryUser".equals(path)) {action = new QueryUserAction();}else {throw new RuntimeException("請求失敗");}String forward = null;try {forward = action.execute(request, response);} catch (Exception e) {e.printStackTrace();}request.getRequestDispatcher(forward).forward(request, response);}}

在這個Servlet中,已經將模型層的調用、頁面轉向分離到Action中。在具體的Action中負責調用模型層邏輯以及負責頁面的轉向。這就是MVC基本架構的簡單實現。

時序圖如下:

儘管如此,這裡主要的問題還是沒有解決。這裡仍然存在大量的if…else 結構,修改時,業務變更,仍然需要到這裡來進行刪減。

因此,我們可以在此基礎上,將相應的action配置在設定檔裡面,通過反射去掉if…else,這就是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.