閱讀639 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Spring MVC學習指南(第2版)》——2.4 模型2之Filter分發器

本節書摘來自異步社區《Spring MVC學習指南(第2版)》一書中的第2章,第2.4節,作者:【美】Paul Deck著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看

2.4 模型2之Filter分發器

雖然servlet是模型2應用程序中最常見的控製器,但過濾器也可以充當控製器。但請注意,過濾器沒有作為歡迎頁麵的權限。僅輸入域名時不會調用過濾器分派器。Struts 2使用過濾器作為控製器,是因為該過濾器也用於提供靜態內容。

下麵的例子(appdesign2)是一個采用filter分發器的模型2應用,目錄結構如圖2.5所示。

screenshot

圖2.5 appdesign2目錄結構

JSP頁麵和Product類同appdesign1相同,但沒有采用servlet作為控製器,而是使用了一個名為FilterDispatcher的過濾器(見清單2.7)。

清單2.7 DispatcherFilter類

package appdesign2.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter; 
import javax.servlet.http.HttpServletRequest; 
import appdesign2.action.SaveProductAction; 
import appdesign2.form.ProductForm; 
import appdesign2.model.Product; 
import java.math.BigDecimal; 

@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();
    /* 
     * uri is in this form: /contextName/resourceName, for 
     * example /appdesign2/input-product. However, in the 
     * case of a default context, the context name is empty, 
     * and uri has this form /resourceName, e.g.: 
     * /input-product 
     */
    // action processing
    int lastIndex = uri.lastIndexOf("/");
    String action = uri.substring(lastIndex + 1); 
    String dispatchUrl = null;
    if ("input-product".equals(action)) { 
      // do nothing 
      dispatchUrl = "/jsp/ProductForm.jsp";
    }else if("save-product".equals(action)) {
      // create form
      ProductForm productForm = new ProductForm();
      // populate action properties
      productForm.setName(request.getParameter("name"));
      productForm.setDescription(
          request.getParameter("description"));
      productForm.setPrice(request.getParameter("price"));

      // create model
      Product product = new Product();
      product.setName(productForm.getName());
      product.setDescription(product.getDescription());
      try {
        product.setPrice(new BigDecimal(productForm.getPrice()));
      } catch (NumberFormatException e) {
      }
      // execute action method
      SaveProductAction saveProductAction = 
           new SaveProductAction();
      saveProductAction.save(product); 
      // store model in a scope variable for the view
      request.setAttribute("product", product);
      dispatchUrl = "/jsp/ProductDetails.jsp"; 
    } 
    // forward to a view
    if (dispatchUrl != null) { 
      RequestDispatcher rd = request 
          .getRequestDispatcher(dispatchUrl); 
      rd.forward(request, response);
    } else {
      // let static contents pass 
      filterChain.doFilter(request, response);
    } 
  }
}

doFilter方法的內容同appdesign1中process方法。

由於過濾器的過濾目標是包括靜態內容在內的所有網址,因此,若沒有相應的action則需要調用filterChain.doFilter()。

} else {
      // let static contents pass 
      filterChain.doFilter(request, response);
    }

要測試應用,可以用瀏覽器訪問如下URL:

https://localhost:8080/appdesign2/input-product

最後更新:2017-05-27 13:31:27

  上一篇:go  《Spring MVC學習指南(第2版)》——2.5 校驗器
  下一篇:go  《易學C++(第2版)》——1.5 C語言、C++語言和Visual C++