All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yuxuan66.core.handler.RequestHandler Maven / Gradle / Ivy

package com.yuxuan66.core.handler;

import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;

import com.yuxuan66.core.constant.Constant;
import com.yuxuan66.core.exception.FlashSysException;
import com.yuxuan66.core.interceptor.IInterceptor;
import com.yuxuan66.core.message.MessageConvert;
import com.yuxuan66.core.message.impl.DefaultMessageConvert;
import com.yuxuan66.core.utils.CacheManager;
import com.yuxuan66.core.utils.web.HandlerUtils;
import com.yuxuan66.core.utils.web.ServletUtils;
import com.yuxuan66.core.utils.web.WebContext;

public class RequestHandler extends AbstractHandler {

	@Override
	public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
		// 所有的拦截器
		List interceptors = CacheManager.getData(Constant.MVC_INTERCEPTORS);
		List messageConverts = CacheManager.getData(Constant.MVC_MESSAGECONVERT);
		WebContext.setRequest(request);
		WebContext.setResponse(response);

		
		// 遍历在Headler获取前需要执行的拦截器
		for (IInterceptor interceptor : interceptors) {
			try {
				if (!interceptor.beforeHandler(request, response)) {
					baseRequest.setHandled(true);
					return;
				}
			} catch (Exception e) {
				throw new FlashSysException("Interceptor execution failed", e);
			}
		}
		MappingHandler mappingHandler = HandlerUtils.getHandler();
		if (mappingHandler == null) {
			return;
		}
		// 给Controller放入req,resp对象
		new ServletUtils(mappingHandler.getController()).set();
		// 本地请求方法
		Method method = mappingHandler.getMappingMethod();
		// 处理参数 暂时仅支持Map类型
		Parameter[] parameters = method.getParameters();
		List params = new ArrayList();
		for (Parameter parameter : parameters) {
			if (parameter.getType() == Map.class) {
				Map map = new HashMap<>();
				Enumeration em = request.getParameterNames();
				while (em.hasMoreElements()) {
					String key = em.nextElement();
					String value = request.getParameter(key);
					map.put(key, value);
				}
				params.add(map);
			}
		}

		if (mappingHandler.isRest()) {
			response.setCharacterEncoding("UTF-8");
			response.setContentType("application/json; charset=utf-8");
			try {
				Object obj;
				if (params != null && !params.isEmpty()) {
					obj = method.invoke(mappingHandler.getController(), params.toArray());
				} else {
					obj = method.invoke(mappingHandler.getController());
				}
				if (messageConverts != null && messageConverts.size() != 0) {
					for (MessageConvert convert : messageConverts) {
						obj = convert.convert(obj);
					}
				} else {
					// 使用默认消息转换器
					obj = new DefaultMessageConvert().convert(obj);
				}
				if (obj != null) {
					PrintWriter out = response.getWriter();
					out.append(obj.toString());
				}
			} catch (Exception e) {
				e.printStackTrace();
				throw new FlashSysException("Method Invoke Error", e);
			}
		} else {
			// 返回页面 暂不支持
		}
		baseRequest.setHandled(true);
	}

}