`
knight_black_bob
  • 浏览: 853052 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

手写 springmvc

阅读更多

 

 

手写 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/



 
 
 谢谢您的赞助,我会做的更好!

 

  • 大小: 24.2 KB
  • 大小: 21.7 KB
2
0
分享到:
评论

相关推荐

    1、手写springmvc框架及分析springmvc源码.zip

    1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析...

    简易的手写springmvc

    本工程模仿了简易的springMVC的实现, 包含了controller、service、requestParam、autowired、requestMapping注解类的创建 IOC容器的创建及组装原理实现 简易的request请求

    java 手写SpringMVC框架

    在手写SpringMVC的过程中,我们需要构建以下组件: 1. **DispatcherServlet**:这是SpringMVC的前端控制器,它接收所有的HTTP请求,并根据请求信息决定如何分发到相应的处理器。 2. **Model**:模型层通常由...

    基于servlet3.0手写springmvc

    在基于Servlet 3.0的手写Spring MVC中,我们可以使用注解来定义请求映射,比如`@RequestMapping`。 3. **HandlerAdapter**:处理器适配器,它允许Spring MVC处理各种不同类型的处理器,即使它们有不同的接口或实现...

    手写springmvc笔记1

    本文是手写 SpringMVC 笔记的第一部分,主要涉及项目搭建、核心注解和类的创建,以及 DispatcherServlet 的配置与工作原理。 首先,新建一个 SpringMVC 项目,这是构建任何应用的基础。在 IDE 中,可以选择创建一个...

    手写springmvc

    【标题】"手写SpringMVC" 在编程领域,SpringMVC是Spring框架的一个核心组件,主要用于构建Web应用程序。它遵循Model-View-Controller(MVC)设计模式,旨在简化开发,提供更好的分离关注点,并支持松耦合。手写...

    手写springmvc 简易版

    在这个“手写springmvc简易版”项目中,我们有机会深入理解Spring MVC的核心概念和工作原理。下面将详细介绍这个简易版Spring MVC实现中的关键知识点。 1. **DispatcherServlet**:作为Spring MVC的前端控制器,...

    阿里P7大牛一对一教你如何手写SpringMVC框架

    根据给定的文件信息,我们将围绕“如何手写SpringMVC框架”这一核心主题展开详细的讲解与探讨。本文将从SpringMVC框架的基本概念出发,深入解析其工作原理,并逐步指导如何实现一个简易版本的手写SpringMVC框架。 #...

    手写SpringMVC

    在这个“手写SpringMVC”的项目中,我们将深入理解SpringMVC的工作原理,并尝试使用纯Java代码来实现其核心功能。 1. **URL映射**:在SpringMVC中,请求URL通过DispatcherServlet被拦截,然后根据`@RequestMapping`...

    手写springMvc,详细注释

    在本项目 "手写SpringMvc,详细注释" 中,我们将深入理解 Spring MVC 的核心组件,自定义注解的实现以及 DispatcherServlet 的工作原理。 首先,Spring MVC 的核心概念包括: 1. **DispatcherServlet**:它是整个 ...

    手写SpringMVC注解动态调用控制器方法.zip

    尝试手写SpringMVC动态调用方法 初步使用反射注解实现动态调用方法 初步了解SpringMVC @Controller、@RequestMapping、@requestParam用法及原理 _φ(❐_❐✧ 人丑就要多读书 不熬夜不追剧~( ̄▽ ̄)~* 

    手写springmvc框架.zip

    这个名为"手写springmvc框架.zip"的压缩包很可能包含了一套自定义实现Spring MVC核心功能的代码示例,旨在帮助开发者深入理解Spring MVC的工作原理。下面,我们将详细探讨Spring MVC框架的主要组成部分和工作流程。 ...

    手写SpringMVC框架视频讲解教学(内含永久下载链接,诚信上传)

    教学视频内容(加QQ群:930254941可免费获取视频资料及更多架构视频教学资料): 1,3分钟读懂Spring核心源码; 2,SpringMVC与Spring框架...4,手写SpringMVC框架实战; 5,Tomcat加载进行测试实战; 6,互动答疑。

    T5大师手写SpringMvc框架 一堂课通关优秀开源框架

    T5大师手写SpringMvc框架 一堂课通关优秀开源框架,很不错的资源

    手写springMvc底层

    《手写SpringMVC底层解析》 在深入探讨SpringMVC框架之前,我们先要理解什么是MVC(Model-View-Controller)模式。这是一种软件设计模式,它将应用程序的业务逻辑、用户界面和数据访问分离开来,提高了代码的可维护...

    手写SpringMVC 源码

    手写SpringMVC源码是一项深入理解其工作原理的挑战。以下将详细讲解SpringMVC的核心概念、架构和主要组件。 1. **DispatcherServlet**:SpringMVC的核心组件,作为前端控制器,接收所有HTTP请求,并根据配置的映射...

    java手写SpringMvc框架

    本篇文章将深入解析如何手写Spring MVC框架,以及在这个过程中理解包扫描过程和Spring MVC的运行机制。 首先,我们需要了解Spring MVC的基本架构。它主要包括DispatcherServlet、HandlerMapping、Controller、...

    手写简单Spring MVC

    手写简易SpringMVC 附测试demo

Global site tag (gtag.js) - Google Analytics