在 Java 前端開發(fā)中,過濾器和分發(fā)器是非常重要的概念和工具。過濾器主要用于對請求進行過濾和處理,可以在請求到達 servlet 之前或者之后進行過濾處理。而分發(fā)器也被稱為 Servlet 包含器,主要用于選擇目標 servlet 進行請求的分發(fā)。
過濾器使用 Filter 接口實現(xiàn),可以實現(xiàn)對請求頭、請求參數(shù)、請求體等進行過濾處理。下面是一個簡單的過濾器實現(xiàn)對請求進行編碼轉(zhuǎn)換的例子:
public class EncodingFilter implements Filter { private String encoding; @Override public void init(FilterConfig filterConfig) throws ServletException { encoding = filterConfig.getInitParameter("encoding"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding(encoding); chain.doFilter(request, response); } @Override public void destroy() { encoding = null; } }
而分發(fā)器實現(xiàn)主要是通過調(diào)用 servlet 的 service() 方法來實現(xiàn),根據(jù)請求 URL 的匹配規(guī)則來選擇目標 servlet 進行請求處理。下面是一個簡單的分發(fā)器實現(xiàn):
public class DispatcherServlet extends HttpServlet { private MapservletMapping = new HashMap<>(); @Override public void init(ServletConfig config) throws ServletException { super.init(config); // 初始化 servletMapping servletMapping.put("/doLogin", new LoginServlet()); servletMapping.put("/doLogout", new LogoutServlet()); servletMapping.put("/doRegister", new RegisterServlet()); } @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String uri = req.getRequestURI(); String contextPath = req.getContextPath(); String servletPath = uri.substring(contextPath.length()); HttpServlet servlet = servletMapping.get(servletPath); if (servlet != null) { servlet.service(req, resp); } else { resp.sendError(404, "Servlet Not Found"); } } }
過濾器和分發(fā)器可以組合使用,實現(xiàn)復(fù)雜的請求處理邏輯。同時,在實際開發(fā)中,也可以使用成熟的的框架如 Spring 或 Struts2 來實現(xiàn)過濾器和分發(fā)器的功能。