《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所示。
圖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