package com.cheng.zenofdesignpatterns.extension.mvcframework.cheng.controller;
import com.cheng.zenofdesignpatterns.extension.mvcframework.cheng.action.ActionDispather;
import com.cheng.zenofdesignpatterns.extension.mvcframework.cheng.action.IActionDispather;
import com.cheng.zenofdesignpatterns.extension.mvcframework.cheng.valuestack.ValueStack;
import com.cheng.zenofdesignpatterns.extension.mvcframework.cheng.helper.ValueStackHelper;
import com.cheng.zenofdesignpatterns.extension.mvcframework.cheng.view.ViewManager;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
*/
public class FilterDispather implements Filter {
// 定义一个值栈辅助类
private ValueStackHelper valueStackHelper = new ValueStackHelper();
// 应用IActionDispather
IActionDispather actionDispather = new ActionDispather();
// server销毁时要做的事情
public void destroy() {
}
// 过滤器必须实现的
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 转换为HttpServletRequest
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
// 传递到其他过滤器处理
chain.doFilter(req, res);
// 获得从HTTP请求的ACTION名称
String actionName = getActionNameFromURI(req);
// 对ViewManager的应用
ViewManager viewManager = new ViewManager(actionName);
// 所有参数放入值栈
ValueStack valueStack = valueStackHelper.putIntoStack(req);
// 把所有的请求传递给ActionDispatcher处理
String result = actionDispather.actionInvoke(actionName);
String viewPath = viewManager.getViewPath(result);
// 直接转向
RequestDispatcher rd = req.getRequestDispatcher(viewPath);
rd.forward(req, res);
}
public void init(FilterConfig arg0) throws ServletException {
/*
* 1、检查XML配置文件是否正确
* 2、启动监控程序,观察配置文件是否正确
*/
}
// 通过url获得actionName
private String getActionNameFromURI(HttpServletRequest req) {
String path = (String) req.getRequestURI();
String actionName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf("."));
return actionName;
}
}