(三)简单工厂模式详解 (三)

2014-11-24 10:41:11 · 作者: · 浏览: 3
.ServletFactory;
//用来分派请求的filter
public class DispatcherFilter implements Filter{

private static final String URL_SEPARATOR = "/";

private static final String SERVLET_PREFIX = "servlet/";

private String servletName;

public void init(FilterConfig filterConfig) throws ServletException {}

public void destroy() {}

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {
parseRequestURI((HttpServletRequest) servletRequest);
//这里为了体现我们本节的重点,我们采用一个工厂来帮我们制造Action
if (servletName != null) {
//这里使用的正是简单工厂模式,创造出一个servlet,然后我们将请求转交给servlet处理
Servlet servlet = ServletFactory.createServlet(servletName);
servlet.service(servletRequest, servletResponse);
}else {
filterChain.doFilter(servletRequest, servletResponse);
}
}

//负责解析请求的URI,我们约定请求的格式必须是/contextPath/servlet/servletName
//不要怀疑约定,因为我一直坚信一句话,约定优于配置
private void parseRequestURI(HttpServletRequest httpServletRequest){
String validURI = httpServletRequest.getRequestURI().replaceFirst(httpServletRequest.getContextPath() + URL_SEPARATOR, "");
if (validURI.startsWith(SERVLET_PREFIX)) {
servletName = validURI.split(URL_SEPARATOR)[1];
}
}

}

package com.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import com.web.factory.ServletFactory;
//用来分派请求的filter
public class DispatcherFilter implements Filter{

private static final String URL_SEPARATOR = "/";

private static final String SERVLET_PREFIX = "servlet/";

private String servletName;

public void init(FilterConfig filterConfig) throws ServletException {}

public void destroy() {}

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {
parseRequestURI((HttpServletRequest) servletRequest);
//这里为了体现我们本节的重点,我们采用一个工厂来帮我们制造Action
if (servletName != null) {
//这里使用的正是简单工厂模式,创造出一个servlet,然后我们将请求转交给servlet处理
Servlet servlet = ServletFactory.createServlet(servletName);
servlet.service(servletRequest, servletResponse);
}else {
filterChain.doFilter(servletRequest, servletResponse);
}
}

//负责解析请求的URI,我们约定请求的格式必须是/contextPath/servlet/servletName
//不要怀疑约定,因为我一直坚信一句话,约定优于配置
private void parseRequestURI(HttpServletRequest httpServletRequest){
String validURI = httpServletRequest.getRequestURI().replaceFirst(httpServletRequest.getContextPath() + URL_SEPARATOR, "");
if (validURI.startsWith(SERVLET_PREFIX)) {
servletName = validURI.split(URL_SEPARATOR)[1];
}
}

}
这个filter需要在web.xml中加入以下配置,这个不多做介绍,直接贴上来。

[html]
filter>
dispatcherFilter
com.web.filter.DispatcherFilter


dispatcherFilter
/servlet/*


dispatcherFilter
com.web.filter.DispatcherF