MVC 表明 Model-View-Controller (模型-視圖-控制器) 模式。框架
Java Web 應用開發中有兩種設計模型,Model 1 和 Model 2。 jsp
Model 1 的中心是 JSP 頁面,由 JSP 調用業務邏輯,顯示頁面,適合於小應用開發。
由 JSP 充當 視圖和控制器,JavaBeans 充當模型。 ide
Model 2 基於 MVC 模式,幾乎全部現代 Web 框架都是 Model 2 的實現。
由 JSP 充當視圖,Servlet 或 Filter 充當控制器,JavaBeans 充當模型。
post
每一個HTTP 請求都發送給控制器,請求中的 URI 標識出對應的 action。action 表明了應用能夠執行的一個操做。
控制器會解析 URI 並調用相應的 action,而後將模型對象放到視圖能夠訪問的區域。
最後,控制器利用 RequestDispatcher 或者 HttpServletResponse.sendRedirect 方法跳轉到視圖。在 JSP 頁面中,用表達式語言以及定製標籤顯示數據。url
@WebServlet(name="ControllerServlet", urlPatterns={"/input-product", "/save-product"}) public class Controllerservlet extends HttpServlet{ private static final long serialVersionUID=1579L; @Override public void doGet(HttpServletRequest request, HttpServletResponse response throws IOException, ServletException { process(request, response); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { process(request, response); } // 經過 process 方法處理全部輸入請求 private void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ // 獲取 action String uri = request.getRequestURI(); // uri = /contextName/resourceName 或 /resourceName int lastIndex = uri.lastIndexOf("/"); String action = uri.substring(lastIndex +1); // 轉發 url String dispatchUrl = null; // 處理 action if("input-product".equals(action)){ dispatchUrl = "/jsp/ProductForm.jsp"; } else if("save-product".equals(action)){ // 建立模型 product = new Product(); product.setName(request.getParameter("name")); product.setDescription(request.getParameter("description")); product.setPrice(Integer.parseInt(request.getParameter("price"))); // 業務邏輯 保存模型等 SaveProductAction saveProductAction = new SaveProductAction(); saveProductAction.save(product); // 將模型添加到 request 屬性中 以便視圖訪問 request.setAttribute("product", product); dispatchUrl = "/jsp/ProductDetails.jsp"; } // 轉發 if(dispatchUrl != null){ RequestDispatcher rd = request.getRequestDispatcher(dispatchUrl); rd.forward(request, response); } } }
<%--ProductForm.jsp--%> <form method="post" action="save-product"> <h1>Add Product</h1> <label> <span>Product Name:</span> <input id="name" type="text" name="name"> </1abel> <label> <span>Description:</span> <input id="description" type="text" name="description"> </label> <label> <span>Price:</label> <input id="price" name="price" type="number" step="any"> </label> <label> <span> :</span> <input type="submit"> </label> </form>
@WebFilter(filterName="DispatcherFilter", urlPatterns={"/*"}) public class DispatcherFilter implements Filter{ @Override public void init(Filterconfig filterconfig) throws ServletException { } @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String uri = req.getRequestURI(); // ... 與 Servlet Controller 一致 if (dispatchUrl! = null){ RequestDispatcher rd = request.getRequestDispatcher(dispatchUrl); rd.forward(request, response); } else { // 過濾器過濾包括靜態目標在內的全部網址 若是沒有 action 則繼續傳遞下去 filterChain.doFilter(request, response); } } }