/**
 * 
 */
package com.plf.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.plf.context.ContextLoaderListener;
import com.plf.context.WebApplicationContext;
import com.plf.utils.CommonUtis;

/**
 * DispatcherServlet继承HttpServlet,重写init方法、doGet、doPost方法
 * 
 * @author PLF
 * @date 2019年2月13日
 *
 */
public class DispatcherServlet extends HttpServlet{

	private static final long serialVersionUID = 935673787805906127L;

	private WebApplicationContext context;

	@Override
	public void init(ServletConfig config) throws ServletException {

		Object oldCxt = config.getServletContext().getAttribute(ContextLoaderListener.ROOT_CXT_ATTR);
		this.context = oldCxt == null ? new WebApplicationContext() : (WebApplicationContext)oldCxt;

		ServletContext sc = config.getServletContext();
		
        //注册JSP的Servlet,视图才能重定向
        ServletRegistration jspServlet = sc.getServletRegistration("jsp");
        jspServlet.addMapping(CommonUtis.JSP_PATH_PREFIX + "*");
	}

	/**
	 * doGet
	 *
	 * @param req
	 * @param resp
	 * @throws ServletException
	 * @throws IOException
	 */
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 处理请求
		doDispatch(req, resp);
	}
	
	
	/**
	 * @param req
	 * @param resp
	 * @throws Exception
	 */
	private void doDispatch(HttpServletRequest req, HttpServletResponse resp) {

		try {
			
			ServletHandler servletHandler = new ServletHandler(this.context);
			
			//servlet分发处理器
			servletHandler.handle(req, resp);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


}