手写 springmvc
代码下载 : demo
结果测试:
项目结构
0.pom
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <org.slf4j-version>1.7.9</org.slf4j-version> <org.logback-version>1.0.1</org.logback-version> </properties> <dependencies> <!-- servlet 3.0 start --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> <!-- servlet 3.0 end --> <!-- loggger start --> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>${org.slf4j-version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${org.slf4j-version}</version> </dependency> <!-- loggger end --> <!-- json start --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.8</version> </dependency> <!-- json end --> </dependencies>
1. AttributeParams
@Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface AttributeParams { String value() default ""; }
2.
@Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface AutoWrite { String value() default ""; }
3.
@Target({ ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Controller { String value() default ""; }
4.
@Target({ ElementType.METHOD,ElementType.PACKAGE,ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestMapping { String value() default ""; }
5.
@Target({ ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Service { String value() default ""; }
6.
@RequestMapping("/users") @Controller public class UserController { @AutoWrite private UserService userService; @RequestMapping("/user") public User user(@AttributeParams("name") String name ){ User user = userService.getUserByName(name); return user; } }
7.
public class User implements Serializable{ private String name; private String pwd; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }
8.
public interface UserService { public User getUserByName(String name); }
9.
@Service public class UserServiceImpl implements UserService{ @Override public User getUserByName(String name) { User user = new User(); user.setName(name); user.setPwd(name +"123"); return user; } }
10.
public class DispactherServlet extends HttpServlet{ private static final long serialVersionUID = 3077215544607397824L; private final Logger log = Logger.getLogger(DispactherServlet.class); static List<String> packageNames = new ArrayList<String>(); static Map<String, Object> instanceMapping = new ConcurrentHashMap<String, Object>(); static Map<String, ApplicationEntity> haddlerMapping = new ConcurrentHashMap<String, ApplicationEntity>(); @Override public void init() throws ServletException { super.init(); String application = this.getInitParameter("contextConfigLocation"); //this.getServletContext().getClass().getResourceAsStream(application); log.info("=== " +application); String scanPackage="com.curiousby.baoyou.cn.showandshare.customized.mvc"; //1.获取扫描位置 doScan(scanPackage); for (String packageName : packageNames) { System.out.println(""+packageName); } //2.实例化 service 和 controller doInstances(); for (Entry<String,Object> entry : instanceMapping.entrySet()) { System.out.println(entry.getKey() +" \t " + entry.getValue() ); } //3. 建立映射关系 doHaddlerMapping(); for (Entry<String,ApplicationEntity> entry : haddlerMapping.entrySet()) { System.out.println(entry.getKey() +" \t " + entry.getValue() ); } //4.实现注入 doAop(); //5. } private void doAop() { if (instanceMapping.size() <= 0 ) { return; } for (Map.Entry<String, Object> entry : instanceMapping.entrySet()) { Field[] declaredFields = entry.getValue().getClass().getDeclaredFields(); for (Field field : declaredFields) { field.setAccessible(true); if(field.isAnnotationPresent(AutoWrite.class)){ AutoWrite autoWrite = field.getAnnotation(AutoWrite.class); String autoWriteName = autoWrite.value(); if(!UtilValidate.isNotEmpty(autoWrite.value())){ autoWriteName =field.getName(); } autoWriteName = StringUtils.toLowerFirstString(autoWriteName); field.setAccessible(true); try { field.set(entry.getValue(), instanceMapping.get(autoWriteName)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } } private void doHaddlerMapping() { if (instanceMapping.size() <= 0 ) { return; } for (Map.Entry<String, Object> entry : instanceMapping.entrySet()) { if (entry.getValue().getClass().isAnnotationPresent(Controller.class)) { String baseUrl = ""; Controller controller = entry.getValue().getClass().getAnnotation(Controller.class); if(entry.getValue().getClass().isAnnotationPresent(RequestMapping.class)){ RequestMapping requestMapping = (RequestMapping) entry.getValue().getClass().getAnnotation(RequestMapping.class); baseUrl = requestMapping.value(); } Method[] methods = entry.getValue().getClass().getMethods(); for (Method method : methods) { if (method.isAnnotationPresent(RequestMapping.class)) { RequestMapping methodRequestMapping = (RequestMapping) method.getAnnotation(RequestMapping.class); String url = baseUrl + methodRequestMapping.value(); url = StringUtils.splitMultiPathToSimple("/"+url); ApplicationEntity entity = new ApplicationEntity(); entity.method = method; entity.controller = entry.getValue(); haddlerMapping.put(url, entity); }else { continue; } } } } } private void doInstances() { if (packageNames.size() <= 0 ) { return; } for (String packageName : packageNames) { try { Class<?> clazz = Class.forName(packageName.replace(".class", "").trim()); String clazzName = clazz.getSimpleName(); if (clazz.isAnnotationPresent(Controller.class)) { Controller controller = clazz.getAnnotation(Controller.class); if(UtilValidate.isNotEmpty(controller.value())){ clazzName = controller.value(); } Object newInstance = clazz.newInstance(); clazzName = StringUtils.toLowerFirstString(clazzName); instanceMapping.put(clazzName, newInstance); }else if(clazz.isAnnotationPresent(Service.class)){ Service service = clazz.getAnnotation(Service.class); Class<?>[] interfaces = clazz.getInterfaces(); if(UtilValidate.isNotEmpty(service.value())){ clazzName = service.value(); }else{ for (Class<?> interfaceObj : interfaces) { clazzName = interfaceObj.getSimpleName(); Object newInstance = clazz.newInstance(); clazzName = StringUtils.toLowerFirstString(clazzName); instanceMapping.put(clazzName, newInstance); } } }else{ continue; } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } private void doScan(String scanPackage) { URL url = this.getClass().getClassLoader().getResource("/"+StringUtils.splitPathTransfer(scanPackage)); String path= url.getFile(); for ( String file : new File(path).list()) { File one = new File(path , file); if (one.isDirectory()) { doScan(scanPackage +"."+ one.getName()); }else{ packageNames.add(scanPackage+"."+ one.getName()); } } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { RespEntity result = new RespEntity(); String url = req.getRequestURI(); String context = req.getContextPath(); String path = url.replace(context, "").trim(); ApplicationEntity entity = (ApplicationEntity) haddlerMapping.get(path); if(null == entity){ result.setCode(RespEnums.RESP_ERROR_NOT_FOUND.getCode()); result.setMsg(RespEnums.RESP_ERROR_NOT_FOUND.getDesc()); result.setTimestamp(System.currentTimeMillis()); out(resp, FastJsonUtils.toJSONString(result)); return; } List<Object> bulidParameters = bulidParameters(req,resp,entity); try { Object obj = entity.method.invoke( entity.controller,bulidParameters.toArray() ); System.out.println(obj); result = new RespEntity(obj); out(resp, FastJsonUtils.toJSONString(result)); return; } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } private List<Object> bulidParameters(HttpServletRequest req, HttpServletResponse resp, ApplicationEntity entity) { Parameter[] parameters = entity.method.getParameters(); List<Object> values = new ArrayList<Object>(); for (Parameter parameter : parameters) { if (parameter.getParameterizedType().getTypeName().equals("HttpServletRequest")) { values.add(req); }else if (parameter.getParameterizedType().getTypeName().equals("HttpServletResponse")) { values.add(resp); }else if(parameter.isAnnotationPresent(AttributeParams.class)){ String paramName = parameter.getAnnotation(AttributeParams.class).value(); if(!UtilValidate.isNotEmpty(paramName)){ paramName = parameter.getName(); } values.add(req.getParameter(paramName)); }else{ String paramName = parameter.getName(); values.add(req.getParameter(paramName)); } } return values; } private void out(HttpServletResponse response, String str) { try { response.setContentType("application/json;charset=utf-8"); response.getWriter().print(str); } catch (IOException e) { e.printStackTrace(); } } }
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(支持支付宝和微信 以及扣扣群),没钱捧个人场,谢谢各位。
个人主页:http://knight-black-bob.iteye.com/
谢谢您的赞助,我会做的更好!
相关推荐
1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析...
本工程模仿了简易的springMVC的实现, 包含了controller、service、requestParam、autowired、requestMapping注解类的创建 IOC容器的创建及组装原理实现 简易的request请求
在手写SpringMVC的过程中,我们需要构建以下组件: 1. **DispatcherServlet**:这是SpringMVC的前端控制器,它接收所有的HTTP请求,并根据请求信息决定如何分发到相应的处理器。 2. **Model**:模型层通常由...
在基于Servlet 3.0的手写Spring MVC中,我们可以使用注解来定义请求映射,比如`@RequestMapping`。 3. **HandlerAdapter**:处理器适配器,它允许Spring MVC处理各种不同类型的处理器,即使它们有不同的接口或实现...
本文是手写 SpringMVC 笔记的第一部分,主要涉及项目搭建、核心注解和类的创建,以及 DispatcherServlet 的配置与工作原理。 首先,新建一个 SpringMVC 项目,这是构建任何应用的基础。在 IDE 中,可以选择创建一个...
【标题】"手写SpringMVC" 在编程领域,SpringMVC是Spring框架的一个核心组件,主要用于构建Web应用程序。它遵循Model-View-Controller(MVC)设计模式,旨在简化开发,提供更好的分离关注点,并支持松耦合。手写...
在这个“手写springmvc简易版”项目中,我们有机会深入理解Spring MVC的核心概念和工作原理。下面将详细介绍这个简易版Spring MVC实现中的关键知识点。 1. **DispatcherServlet**:作为Spring MVC的前端控制器,...
根据给定的文件信息,我们将围绕“如何手写SpringMVC框架”这一核心主题展开详细的讲解与探讨。本文将从SpringMVC框架的基本概念出发,深入解析其工作原理,并逐步指导如何实现一个简易版本的手写SpringMVC框架。 #...
在这个“手写SpringMVC”的项目中,我们将深入理解SpringMVC的工作原理,并尝试使用纯Java代码来实现其核心功能。 1. **URL映射**:在SpringMVC中,请求URL通过DispatcherServlet被拦截,然后根据`@RequestMapping`...
在本项目 "手写SpringMvc,详细注释" 中,我们将深入理解 Spring MVC 的核心组件,自定义注解的实现以及 DispatcherServlet 的工作原理。 首先,Spring MVC 的核心概念包括: 1. **DispatcherServlet**:它是整个 ...
尝试手写SpringMVC动态调用方法 初步使用反射注解实现动态调用方法 初步了解SpringMVC @Controller、@RequestMapping、@requestParam用法及原理 _φ(❐_❐✧ 人丑就要多读书 不熬夜不追剧~( ̄▽ ̄)~*
这个名为"手写springmvc框架.zip"的压缩包很可能包含了一套自定义实现Spring MVC核心功能的代码示例,旨在帮助开发者深入理解Spring MVC的工作原理。下面,我们将详细探讨Spring MVC框架的主要组成部分和工作流程。 ...
教学视频内容(加QQ群:930254941可免费获取视频资料及更多架构视频教学资料): 1,3分钟读懂Spring核心源码; 2,SpringMVC与Spring框架...4,手写SpringMVC框架实战; 5,Tomcat加载进行测试实战; 6,互动答疑。
T5大师手写SpringMvc框架 一堂课通关优秀开源框架,很不错的资源
《手写SpringMVC底层解析》 在深入探讨SpringMVC框架之前,我们先要理解什么是MVC(Model-View-Controller)模式。这是一种软件设计模式,它将应用程序的业务逻辑、用户界面和数据访问分离开来,提高了代码的可维护...
手写SpringMVC源码是一项深入理解其工作原理的挑战。以下将详细讲解SpringMVC的核心概念、架构和主要组件。 1. **DispatcherServlet**:SpringMVC的核心组件,作为前端控制器,接收所有HTTP请求,并根据配置的映射...
本篇文章将深入解析如何手写Spring MVC框架,以及在这个过程中理解包扫描过程和Spring MVC的运行机制。 首先,我们需要了解Spring MVC的基本架构。它主要包括DispatcherServlet、HandlerMapping、Controller、...
手写简易SpringMVC 附测试demo