package com.mySpring.it.servlet;
import com.sun.xml.internal.ws.util.StringUtils;
import javax.print.DocFlavor;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.plaf.basic.BasicSeparatorUI;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class DisptacherServlet extends HttpServlet {
private static final String LOCATION = "contextConfigLocation";
private Properties properties = new Properties();
private List<String> className = new ArrayList<>();
private Map<String, Object> ioc = new ConcurrentHashMap<>();
private Map<String, Method> handlerMapping = new ConcurrentHashMap();
public DisptacherServlet() {
super();
}
@Override
public void init(ServletConfig config) throws ServletException {
doLoadConfig(config);
doScanner(properties.getProperty("scanPackage"));
doInstance();
doAutowired();
initHandlerMapping();
System.out.println("gupaoedu mvcframework is init...");
}
private void doLoadConfig(ServletConfig config) {
InputStream is = null;
try {
is = this.getClass().getClassLoader().getResourceAsStream(LOCATION);
properties.load(is);
} catch (IOException e) {
System.out.println(e);
} finally {
if (null == is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private void doScanner(String scanPackage) {
URL url = this.getClass().getClassLoader().getResource(scanPackage.replaceAll("\\.", "/"));
File file = new File(url.getFile());
for (File listFile : file.listFiles()) {
if (listFile.isDirectory()) {
doScanner(scanPackage + "." + listFile.getName());
} else {
className.add(scanPackage + "." + listFile.getName().replace(".class", "").trim());
}
}
}
private void doInstance() {
if (className.isEmpty()) {
return;
}
try {
for (String fileName : className) {
Class<?> instance = Class.forName(fileName);
if (instance.isAnnotationPresent(Controller.class)) {
char[] chars = instance.getSimpleName().toCharArray();
chars[0] += 32;
String beanName = new String(chars);
ioc.put(beanName, instance);
}
if (instance.isAnnotationPresent(Service.class)) {
String value = instance.getDeclaredAnnotation(Service.class).value();
if (!"".equals(value.trim())) {
ioc.put(value, instance);
continue;
}
//如果自已没设,就按接口类创建一个实例
Class<?>[] interfaces = instance.getInterfaces();
for (Class<?> anInterface : interfaces) {
ioc.put(anInterface.getName(), instance.newInstance());
}
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
System.out.println(e);
}
}
private void doAutowired() {
if (ioc.isEmpty()) {
return;
}
for (Map.Entry<String, Object> entry : ioc.entrySet()) {
Field[] fields = entry.getValue().getClass().getFields();
for (Field field : fields) {
if (field.isAnnotationPresent(Autowired.class)) {
String autowiredBeanName = field.getDeclaredAnnotation(Autowired.class).value();
if ("".equals(autowiredBeanName.trim())) {
autowiredBeanName = field.getType().getName();
}
field.setAccessible(true);
try {
field.set(entry.getValue(), ioc.get(autowiredBeanName));
} catch (IllegalAccessException e) {
System.out.println(e);
}
}
}
}
}
private void initHandlerMapping() {
if (ioc.isEmpty()) {
return;
}
for (Map.Entry<String, Object> entry : ioc.entrySet()) {
Class<?> clazz = entry.getValue().getClass();
if (!clazz.isAnnotationPresent(Controller.class)) {
continue;
}
String baseUri = "";
if (clazz.isAnnotationPresent(RequestMapping.class)) {
baseUri = clazz.getDeclaredAnnotation(RequestMapping.class).value();
}
Method[] methods = clazz.getMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(RequestMapping.class)) {
String methodUri = method.getDeclaredAnnotation(RequestMapping.class).value();
String uri = ("/" + baseUri + "/" + methodUri).replaceAll("/+", "/");
handlerMapping.put(uri, method);
System.out.println("mapper " + uri + "," + method);
}
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
doDispatch(req, resp);
} catch (Exception e) {
resp.getWriter().write("500 Execption, Details rn" + Arrays.toString(e.getStackTrace())
.replaceAll("\\[|\\]", "\\").replaceAll("\\s", "\r\n"));
}
}
private void doDispatch(HttpServletRequest req, HttpServletResponse resp) throws IOException {
if (handlerMapping.isEmpty()) {
return;
}
String uri = req.getRequestURI();
String contextPath = req.getContextPath();
uri = uri.replaceAll(contextPath, "").replaceAll("/+", "/");
if (!handlerMapping.containsKey(uri)) {
resp.getWriter().write("404 Not Found!");
return;
}
Map<String, String[]> parameterMap = req.getParameterMap();
Method method = handlerMapping.get(uri);
Class<?>[] parameterTypes = method.getParameterTypes();
Object[] paramValue = new Object[parameterTypes.length];
for (int i = 0; i < parameterTypes.length; i++) {
Class<?> parameterType = parameterTypes[i];
if (parameterType == HttpServletRequest.class) {
paramValue[i] = req;
continue;
}
if (parameterType == HttpServletResponse.class) {
paramValue[i] = resp;
continue;
}
if (parameterType == String.class) {
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
String value = Arrays.toString(entry.getValue());
value = value.replaceAll("\\[|\\]", "").replaceAll(",\\s", ",");
paramValue[i] = value;
}
}
}
//
try {
String simpleName = method.getDeclaringClass().getSimpleName();
char[] chars = simpleName.toCharArray();
chars[0] += 32;
String beanName = String.valueOf(chars);
method.invoke(ioc.get(beanName), paramValue);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
版权声明:本文为wenwentana原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。