📄 defaultrequestprocessor.java.svn-base
字号:
package com.easyjf.web.core;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import com.easyjf.web.ActionContext;
import com.easyjf.web.ActionServlet;
import com.easyjf.web.Globals;
import com.easyjf.web.IPageVender;
import com.easyjf.web.IPathMappingRuler;
import com.easyjf.web.IWebAction;
import com.easyjf.web.Module;
import com.easyjf.web.Page;
import com.easyjf.web.RequestProcessor;
import com.easyjf.web.WebConfig;
import com.easyjf.web.WebForm;
import com.easyjf.web.WebInvocationParam;
import com.easyjf.web.core.support.DefaultPageVender;
import com.easyjf.web.errorhandler.IErrorHandlerManager;
import com.easyjf.web.exception.DefaultExceptionHandle;
import com.easyjf.web.exception.FrameworkException;
import com.easyjf.web.exception.TokenVaildException;
import com.easyjf.web.exception.ValidateException;
import com.easyjf.web.interceptor.AfterInterceptor;
import com.easyjf.web.interceptor.BeforeInterceptor;
import com.easyjf.web.interceptor.ExceptionInterceptor;
import com.easyjf.web.interceptor.Interceptor;
import com.easyjf.web.validate.ValidatorManager;
/**
*
* <p>
* Title:框架默认处理器
* </p>
* <p>
* Description:EasyJWeb框架的中心处理器,由ActionServlet调用,然后调用相应的Action并返回用户服务
* </p>
* <p>
* Copyright: Copyright (c) 2006
* </p>
* <p>
* Company: www.easyjf.com
* </p>
*
* @author 蔡世友,stef,tony
* @version 1.0
* @since 2006/9
*/
public class DefaultRequestProcessor implements RequestProcessor {
private static final long serialVersionUID = -4362786097761398444L;
private ActionServlet servlet;
private IErrorHandlerManager errorHandlerManager;
private WebConfig webConfig;
private static List<IPageVender> pageVenders;
private static final Logger logger = Logger
.getLogger(DefaultRequestProcessor.class);
private TokenProcessor token = TokenProcessor.getInstance();
public DefaultRequestProcessor() {
this(null, null);
}
/**
* Processor只能由ActionServlet来启动
*
* @param servlet
*/
public DefaultRequestProcessor(ActionServlet servlet, WebConfig webConfig) {
this.servlet = servlet;
this.webConfig = webConfig;
}
public void setServlet(ActionServlet servlet) {
this.servlet = servlet;
}
/**
* 异常处理系统还有一定的问题
*
* @param request
* @param response
* @throws IOException
* @throws ServletException
*/
public void process(HttpServletRequest request, HttpServletResponse response)
throws Throwable {
try {
// System.out.println("执行Action");
ValidatorManager vm = FrameworkEngine.getValidateManager();
if (vm != null)
vm.cleanErrors();
IPathMappingRuler mappingRuler = new PathMappingRulerImpl(request);
/**
* 加入国际化环境
*/
I18NResourceCache resource = new I18NResourceCache(FrameworkEngine
.getResourcePath());
resource.setLocale(request.getLocale());
FrameworkEngine.setResourceCache(resource);
int jumpActionTimes = 0;
process(request, response, vm, mappingRuler, null, jumpActionTimes);
} catch (Exception e) {
logger.error("出现了错误:" + e);
doErrorHandler(e, ActionContext.getContext()
.getWebInvocationParam());
}
}
protected void process(HttpServletRequest request,
HttpServletResponse response, ValidatorManager vm,
IPathMappingRuler mappingRuler, WebForm webForm, int jumpTimes)
throws FrameworkException, Throwable, Exception, ValidateException,
IOException, ServletException {
// 模块名称
String moduleName = mappingRuler.getModuleName();
// 取模块
Module module = FrameworkEngine.findModule(moduleName);
Page page = null;
if (module != null) {
String formName = module.getForm();
// 创建WebForm
WebForm form = webForm == null ? FrameworkEngine.creatWebForm(
request, formName, module) : webForm;
form.setUrl(ActionContext.getContext().getRequest().getHeader(
"REFERER"));
// 取得命令 主要用于easyDBO中
if (mappingRuler.getCommand() != null) {
form.getTextElement().put("easyJWebCommand",
mappingRuler.getCommand());
}
// 装载页面参数
if (mappingRuler.getParams() != null) {
form.getTextElement().putAll(mappingRuler.getParams());
}
// 装载action
IWebAction action = FrameworkEngine.findAction(module);
if (action == null) {
throw new FrameworkException("没有找到处理模板的类:" + module.getAction());
}
if (form == null) {
throw new FrameworkException("表单创建错误:" + formName);
}
WebInvocationParam param = new WebInvocationParam(action, form,
module);
param.setUrlType(mappingRuler.getUrlPattern());
ActionContext.getContext().put(ActionContext.WEBINVOCATION, param);// 把调用参数值设置到上下文中
// 开始执行Action中的主体方法,包括全局拦截、Action前置拦截、Action的execute、Action后置拦截等方法
try {
// 执行全局拦截操作,对非法输入进行拦截
invokeGlobalInterceptors(param);
// 执行前拦截操作
invokeActionBeforeInterceptors(module, param);
// 处理自动token
this.processAutoToken(param);
// 处理业务操作并返回form对象
page = getResult(param);
// 执行后拦截
invokeActionAfterInterceptors(module, page, param);
// 如果Action正常执行,根据module中validate属性的配置,以及执行过程中的错误,判断是否使启动自动验证功能。
if (module.isValidate() && vm != null
&& vm.getErrors().hasError()) {
Page tempPage = page;
page = findValidatePage(param); // 查找并返回自动验证页面
if (page == null)
page = tempPage;
}
} catch (ValidateException ve) {
// 执行验证处理
form.getEasyJWebResult().putAll(form.getTextElement());// 把form中填写的数据存入结果集中
page = findValidatePage(param);
if (page == null)
throw ve;// 找不到验证错误页面,把异常交给异常拦截器统一处理
}
if (page != null) {
// 如果配置的是模版则合成模版
if (page.getType().equals(Globals.PAGE_TEMPLATE_TYPE)) {
doVenderPage(page, form, request, response, param);
// 执行回调
if (ActionContext.getContext().getRequestCallback() != null) {
ActionContext.getContext().getRequestCallback()
.doFinish();
}
if (ActionContext.getContext().getUri() != null) {
doForward(ActionContext.getContext().getUri(), request,
response);
}
} else if ("null".equals(page.getType())) {
// 空结果集页面,表示不返回任何结果集,
} else if ("action".equals(page.getType())) {
processActionPage(request, response, vm, page, param,
jumpTimes);
} else if ("forward".equals(page.getType())) {
doForward(page.getUrl(), request, response);
} else {
// 其它类型全部当作html来处理
// logger.debug("跳转到指定页面:"+page.getUrl());
// doForward(page.getUrl(),request,response);
response.sendRedirect(page.getUrl());
}
} else {
logger.debug("没有任何页面要跳转!" + module.getPath()
+ module.getDefaultPage());
// servlet.error(request,response,new
// Exception("没有设置跳转的页面!"));
}
}
}
/**
* 处理模板合成 首先初始化模板合成器链, 然后调用页面合成器完成页面合成。
*
* @param page
* Page对象
* @param form
* WebForm对象
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -