1.1配置application.properties文件
scanPackage=com.gupaoedu.demo
1.2 配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>spring5</display-name> <servlet> <servlet-name>gpmvc</servlet-name> <servlet-class>com.gupaoedu.mvcframework.v1.servlet.GPDispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>application.properties</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>gpmvc</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
1.3自定义注解
@GPservice
package com.gupaoedu.mvcframework.annotation; import java.lang.annotation.*; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface GPService { String value() default ""; }
@GPAutowired
package com.gupaoedu.mvcframework.annotation; import java.lang.annotation.*; @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface GPAutowired { String value() default ""; }
@GPController
package com.gupaoedu.mvcframework.annotation; import java.lang.annotation.*; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface GPController { String value() default ""; }
@GPRequestMapping
package com.gupaoedu.mvcframework.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface GPRequestMapping { String value() default ""; }
@RequestParam
package com.gupaoedu.mvcframework.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface GPRequestParam { String value() default ""; }
1.4.配置注解
接口 IDemoService
package com.gupaoedu.demo.service; public interface IDemoService { public String get(String name); }
实现类Demoservice
package com.gupaoedu.demo.service.impl; import com.gupaoedu.demo.service.IDemoService; import com.gupaoedu.mvcframework.annotation.GPService; /** * DemoService * */ @GPService public class DemoService implements IDemoService { @Override public String get(String name) { return "my name is "+name ; } }
配置请求入口类DemoAction
package com.gupaoedu.demo.mvc.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.gupaoedu.demo.service.IDemoService; import com.gupaoedu.mvcframework.annotation.GPAutowired; import com.gupaoedu.mvcframework.annotation.GPController; import com.gupaoedu.mvcframework.annotation.GPRequestMapping; import com.gupaoedu.mvcframework.annotation.GPRequestParam; @GPController @GPRequestMapping("/demo") public class DemoAction { @GPAutowired private IDemoService demoService; @GPRequestMapping("/query") public void query(HttpServletRequest req, HttpServletResponse rsp, @GPRequestParam("name") String name) { String reString = demoService.get(name); try { rsp.getWriter().write(reString); } catch (Exception e) { e.printStackTrace(); } } @GPRequestMapping("/add") public void add(HttpServletRequest req, HttpServletResponse rsp, @GPRequestParam("a") Integer a, @GPRequestParam("b") Integer b) { try { rsp.getWriter().write(a +"+" +b +"="+ (a+b)); } catch (Exception e) { e.printStackTrace(); } } @GPRequestMapping("/remove") private void remove(HttpServletRequest req, HttpServletResponse rsp, @GPRequestParam("id") String id) { } }
2 容器初始化
2.1 实现1.0版本
package com.gupaoedu.mvcframework.v1.servlet; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URL; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.Set; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.gupaoedu.mvcframework.annotation.GPAutowired; import com.gupaoedu.mvcframework.annotation.GPController; import com.gupaoedu.mvcframework.annotation.GPRequestMapping; import com.gupaoedu.mvcframework.annotation.GPService; public class GPDispatcherServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; private Map<String, Object> mapping = new HashMap<String, Object>(); private Map<String, Object> mapping2 = new HashMap<String, Object>(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub try { doDispatch(req, resp); } catch (Exception e) { resp.getWriter().write("500 Exception " + Arrays.toString(e.getStackTrace())); } } private void doDispatch(HttpServletRequest req, HttpServletResponse resp) throws Exception { // TODO Auto-generated method stub String url = req.getRequestURI(); String contextPath = req.getContextPath(); url = url.replace(contextPath, "").replaceAll("/+", "/"); System.out.println("url " + url); for (Object object : mapping.keySet()) { System.out.println("mapping" + object); } if (!this.mapping.containsKey(url)) { resp.getWriter().write("404 NOT FOUND!!"); return; } Method method = (Method) this.mapping.get(url); Map<String, String[]> params = req.getParameterMap(); method.invoke(this.mapping.get(method.getDeclaringClass().getName()), new Object[] { req, resp, params.get("name")[0] }); } @Override public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub InputStream is = null; try { Properties configContext = new Properties(); is = this.getClass().getClassLoader().getResourceAsStream(config.getInitParameter("contextConfigLocation")); configContext.load(is); String scanPackage = configContext.getProperty("scanPackage"); doScanner(scanPackage); System.out.println("1111111111"); Set<String> set = mapping.keySet(); for (String className : set) { if (!className.contains(".")) { continue; } Class<?> clazz = Class.forName(className); if (clazz.isAnnotationPresent(GPController.class)) { mapping2.put(className, clazz.newInstance()); String baseUrl = ""; if (clazz.isAnnotationPresent(GPRequestMapping.class)) { GPRequestMapping requestMappng = clazz.getAnnotation(GPRequestMapping.class); baseUrl = requestMappng.value(); } Method[] methods = clazz.getMethods(); for (Method method : methods) { if (!method.isAnnotationPresent(GPRequestMapping.class)) { continue; } GPRequestMapping requestMappng = method.getAnnotation(GPRequestMapping.class); String url = (baseUrl + "/" + requestMappng.value()).replaceAll("/+", "/"); mapping2.put(url, method); System.out.println("Mapped " + url + "," + method); } } else if (clazz.isAnnotationPresent(GPService.class)) { GPService service = clazz.getAnnotation(GPService.class); String beanName = service.value(); if ("".equals(beanName)) { beanName = clazz.getName(); } Object instance = clazz.newInstance(); mapping2.put(beanName, instance); for (Class<?> i : clazz.getInterfaces()) { mapping2.put(i.getName(), instance); } } else { continue; } } mapping.putAll(mapping2); for (Object object : mapping.values()) { if (object == null) { continue; } Class<?> clazz = object.getClass(); if (clazz.isAnnotationPresent(GPController.class)) { Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (!field.isAnnotationPresent(GPAutowired.class)) { continue; } GPAutowired autowired = field.getAnnotation(GPAutowired.class); String beanName = autowired.value(); if ("".equals(beanName)) { beanName = field.getType().getName(); } field.setAccessible(true); try { field.set(mapping.get(clazz.getName()), mapping.get(beanName)); } catch (IllegalArgumentException e) { // TODO: handle exception e.printStackTrace(); } } } } } catch (Exception e) { } finally { if (is != null) { try { is.close(); } catch (Exception e2) { // TODO: handle exception e2.printStackTrace(); } } } } private void doScanner(String scanPackage) { URL url = this.getClass().getClassLoader().getResource("/" + scanPackage.replaceAll("\\.", "/")); File classDir = new File(url.getFile()); for (File file : classDir.listFiles()) { if (file.isDirectory()) { doScanner(scanPackage + "." + file.getName()); } else { if (!file.getName().endsWith(".class")) { continue; } String clazzName = (scanPackage + "." + file.getName().replace(".class", "")); mapping.put(clazzName, null); } } } }