Java Web 學習(3) —— MVC

MVC 

 

1、 MVC 模式

MVC 表明 Model-View-Controller (模型-視圖-控制器) 模式。框架

  • Model:模型表明 DAO (Data Access Object 數據訪問對象) 或 POJO(Plain Ordinary Java Object 普通 JavaBeans)。是應用程序中用於處理應用程序數據邏輯的部分。
  • View:視圖將數據可視化。
  • Controller:應用程序中處理用戶交互的部分。控制器做用於模型和視圖上。它控制數據流向模型對象,並在數據變化時更新視圖。控制器分離了視圖與模型。

 

2、 Model 2

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

 

 3、 Servlet 控制器

@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>&nbsp:</span>
  <input type="submit">
</label>
</form>

 

3、 Filter 分發器

@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);
    }
  }
}
相關文章
相關標籤/搜索