⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 requestprocessor.java

📁 easyweb的使用
💻 JAVA
字号:
package com.easyjf.web;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;

import org.apache.log4j.Logger;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.context.Context;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.io.VelocityWriter;
import org.apache.velocity.runtime.RuntimeSingleton;

import com.easyjf.util.CommUtil;
import com.easyjf.util.HtmlUtil;
import com.easyjf.web.config.*;

/**
 * 
 * <p>
 * Title:框架核心处理器
 * </p>
 * <p>
 * Description:EasyJWeb框架的中心处理器,由ActionServlet调用,然后调用相应的Action并返回用户服务
 * </p>
 * <p>
 * Copyright: Copyright (c) 2006
 * </p>
 * <p>
 * Company: www.easyjf.com
 * </p>
 * 
 * @author 蔡世友
 * @version 1.0
 */
public class RequestProcessor {
	private ActionServlet servlet;

	private Module module;

	private static final Map templateCache = new HashMap();

	private static final WebConfig config = WebConfig.getInstance();

	private static final Logger logger = (Logger) Logger
			.getLogger(RequestProcessor.class.getName());

	private RequestProcessor() {
	}

	public RequestProcessor(ActionServlet servlet) {
		this.servlet = servlet;
	}

	public void process(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
		String path = request.getServletPath();
		String moduleName = "";
		String para = "";
		if (path.lastIndexOf(".ejf") > 0) {
			moduleName = path.substring(0, path.lastIndexOf(".ejf"));
		} else {
			path = request.getRequestURI();
			if (path.indexOf("/ejf/") == 0)
				path = path.substring(4);
			int n = path.lastIndexOf('/');
			if (n > 0) {
				para = path.substring(n + 1);
				moduleName = path.substring(0, n);
				if (para.lastIndexOf('.') > 0)
					para = para.substring(0, para.lastIndexOf('.'));
			}
		}
		module = config.findModule(moduleName);
		if (module == null)
			module = FrameworkEngine.findModule(moduleName);
		if (module != null) {
			String formName = module.getForm();
			WebForm form = FrameworkEngine.creatWebForm(request, formName);
			if (para != null && (!para.equals(""))) {
				String[] paras = para.split("_");
				if (paras != null) {
					if (paras.length > 0)
						form.getTextElement().put("easyJWebCommand", paras[0]);
					if (paras.length > 1)
						form.getTextElement().put("easyJWebID", paras[1]);
				}
			}
			IWebAction action = FrameworkEngine.findAction(module);
			if (action == null) {
				servlet.error(request, response, new Exception("没有找到处理模板的类:"
						+ module.getAction()));
				return;
			}
			if (form == null) {
				servlet.error(request, response, new Exception("表单创建错误:"
						+ formName));
				return;
			}
			Page page = getResult(module, form, action);
			if (page != null) {
				if (page.getType().equals(Globals.PAGE_TEMPLATE_TYPE)) {
					// logger.debug("合成模板"+page.getName()+":"+page.getUrl());
					doTemplate(page.getUrl(), form, request, response);
				} else {
					// logger.debug("跳转到指定页面:"+page.getUrl());
					// doForward(page.getUrl(),request,response);
					response.sendRedirect(page.getUrl());
				}
			} else {
				// logger.error("没有任何页面要跳转!"+module.getPath()+module.getDefaultPage());
				// servlet.error(request,response,new Exception("没有设置跳转的页面!"));
			}
		}
	}

	public Page getResult(Module module, WebForm form, IWebAction action)
			throws ServletException {
		form.setEasyJWebResult(new HashMap());
		Page page = null;
		try {
			page = action.execute(form, module);
		} catch (Exception e) {
			servlet.error(ActionContext.getContext().getRequest(),
					ActionContext.getContext().getResponse(), e);
		}
		// 保存表单form中的数据
		// 处理没有定义属性property的表单
		if (form != null && form.getClass() == WebForm.class) {
			form.setProperty(form.getTextElement());// 只保存文本属性
			form.getProperty().putAll(form.getFileElement());
		}
		if (form != null && (form.getProperty() != null)) {
			Iterator it = form.getProperty().keySet().iterator();
			while (it.hasNext()) {
				String name = (String) it.next();
				form.addResult(name, form.get(name));
			}
		}
		// if(form!=null &&
		// (form.getClass()==WebForm.class))form.getProperty().clear();
		// request.setAttribute("easyJWebResult",easyJWebResult);
		return page;
	}

	protected void doForward(String uri, HttpServletRequest request,
			HttpServletResponse response) throws IOException, ServletException {
		RequestDispatcher rd = getServletContext().getRequestDispatcher(uri);
		rd.forward(request, response);
	}

	protected void doTemplate(String uri, WebForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
		Context context = createContext(form);
		try {
			Template template = getTemplate(uri, request.getCharacterEncoding());
			if (context != null && (template != null)) {
				mergeTemplate(template, context, response);
			} else
				servlet.error(request, response, new Exception("模块合成出错!"));
		} catch (ResourceNotFoundException rnfe) {
			logger.error("找不到模板文件!");
			servlet.error(request, response, new Exception("找不到模板!"
					+ WebConfig.getInstance().getTemplateBasePath() + uri));
		} catch (ParseErrorException pee) {
			logger.error("模板语法错误");
			servlet.error(request, response, new Exception(
					"模板文件中存在语法错误,不能正常解析!"
							+ WebConfig.getInstance().getTemplateBasePath()
							+ uri));
		} catch (MethodInvocationException mie) {
			logger.error("模板方法调用错误:");
		} catch (Exception e) {
			logger.error("查找模板错误!" + e);
		}
	}

	protected Template getTemplate(String name, String encoding)
			throws ResourceNotFoundException, ParseErrorException,
			MethodInvocationException, Exception {
		if (WebConfig.getInstance().isDebug())
			return RuntimeSingleton.getTemplate(name, encoding);// 若为Debug状态,则每次都重新载入模板
		Template template = (Template) templateCache.get(name);// 先从Cache中读取模板文件
		// 这里得进一步完善,当用户已经更改模板文件后,需要能够自动加载,同时增加Cache数量的限制
		if (template == null)
			synchronized (templateCache) {
				{
					// System.out.println("重新加载模板文件!");
					template = RuntimeSingleton.getTemplate(name, encoding);// name
					templateCache.put(name, template);
				}
			}
		return template;
	}

	protected Context createContext(WebForm form) {
		Map result = form.getEasyJWebResult();
		Context context = new VelocityContext();
		Iterator it = result.keySet().iterator();
		while (it.hasNext()) {
			String name = (String) it.next();
			context.put(name, result.get(name));			
			createUtilContext(context);
		}
		return context;
	}

	protected void createUtilContext(Context context) {
		context.put("HtmlUtil", HtmlUtil.getInstance());
		context.put("CommUtil", CommUtil.getInstance());
	}

	protected void mergeTemplate(Template template, Context context,
			HttpServletResponse response) {
		VelocityWriter vw = null;
		Writer writer = null;
		try {
			response.setCharacterEncoding(template.getEncoding());
			response.setContentType("text/html;charset=utf-8");
			writer = servlet.getResponseWriter(response);
			vw = (VelocityWriter) ActionServlet.getWriterPool().get();
			if (vw == null) {
				vw = new VelocityWriter(writer, 4 * 1024, true);
			} else {
				vw.recycle(writer);
			}
			template.merge(context, vw);
		} catch (ResourceNotFoundException e) {
			logger.error("ResourceNotFoundException:" + e);
		} catch (ParseErrorException e) {
			logger.error(e);
		} catch (MethodInvocationException e) {
			logger.error(e);
		} catch (UnsupportedEncodingException e) {
			logger.error(e);
		} catch (IOException e) {
			logger.error(e);
		} catch (Exception e) {
			logger.error(e);
		}

		finally {
			if (vw != null) {
				try {
					vw.flush();
					vw.recycle(null);
					ActionServlet.getWriterPool().put(vw);
				} catch (Exception e) {
					logger.error("Trouble releasing VelocityWriter: "
							+ e.getMessage());
				}
			}
		}
	}

	protected ServletContext getServletContext() {
		return (servlet.getServletContext());
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -