一个简单的MVC框架的实现-基于注解的实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个简单的MVC框架的实现-基于注解的实现相关的知识,希望对你有一定的参考价值。
1、@Action注解声明
package com.togogo.webtoservice.annotations; 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(value=ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Action { // String namespace() default ""; }
2、@Path注解声明
package com.togogo.webtoservice.annotations; 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; /** * 如果放在类上面,表示名命空间 * 如果放在方法上面,表示路径 * @author Administrator * */ @Target(value={ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Path { String value(); }
3、ActionExecute类
package com.togogo.webtoservice; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.togogo.webtoservice.annotations.Action; import com.togogo.webtoservice.annotations.Path; /** * 必须的问题 1、判断传进来的类的对象是不是一个Action 2、通过url,直接调用于Action的方法 3、返回转路径 * * @author Administrator * */ public class ActionExecute { private Object action; private Class<? extends Object> actionClass; private HttpServletRequest request; private HttpServletResponse response; ActionExecute(Object o, HttpServletRequest request, HttpServletResponse response) { this.action = o; this.actionClass = this.action.getClass(); this.request = request; this.response = response; } /** * 获得命名空间 * * @return */ private String getNamespace() { Path pathAnnotation = actionClass.getAnnotation(Path.class); if (pathAnnotation != null) { return pathAnnotation.value(); } else { return null; } } /** * 判断是否是一个Action * * @return */ private boolean isAction() { Action actionAnnotation = actionClass.getAnnotation(Action.class); if (actionAnnotation == null) { return false; } else { return true; } } /** * 获得方法 * * @return */ private Method getMethod() { String uri = request.getRequestURI(); Method[] methods = actionClass.getDeclaredMethods(); for (int i = 0; i < methods.length; i++) { Method m = methods[i]; Path path = m.getAnnotation(Path.class); if (this.getNamespace() != null) { if (uri.contains(this.getNamespace())) { if (path != null) { if (uri.contains(path.value())) { return m; } } }else{ System.out.println("--命名空间不匹配--"); return null; } } else { if (path != null) { if (uri.contains(path.value())) { return m; } } } } return null; } String execute() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { if (isAction()) { Method method = this.getMethod(); String rePath = (String) method.invoke(action, request, response); return rePath; } else { System.out.println("--这不是一个Action--"); return null; } } }
4、核心控制器
package com.togogo.webtoservice; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DispacherServlet extends HttpServlet { private static String config=null; private static String enconding="UTF-8"; @Override public void init(ServletConfig config) throws ServletException { String initConfig=config.getInitParameter("config"); String initEnconding=config.getInitParameter("enconding"); if(initConfig!=null){ DispacherServlet.config=initConfig; } //通过web描述符文件web.xml配置 if(initEnconding!=null){ DispacherServlet.enconding=initEnconding; } super.init(config); } /** * 接收任何请求, */ @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { request.setCharacterEncoding(enconding); response.setCharacterEncoding(enconding); String uri = request.getRequestURI(); StringBuilder sb = new StringBuilder(uri); String path = sb.substring(uri.lastIndexOf("/") + 1, uri.lastIndexOf("!")); System.out.println(path); String className = Config.getClassName(path,config); Object action = ActionFactory.create(className); ActionExecute actionExecute =new ActionExecute(action,request, response); String result = actionExecute.execute(); if (result.contains(":")) { StringBuilder resultStr = new StringBuilder(result); String rePath=resultStr.substring(result.indexOf(":")+1, result.length()); if(result.contains("redirect:")){ response.sendRedirect(rePath); }else if(result.contains("forward:")){ request.getRequestDispatcher(rePath).forward(request, response); } } else { request.getRequestDispatcher(result).forward(request, response); } } catch (Exception e) { e.printStackTrace(); } } }
5、Action对象工厂
package com.togogo.webtoservice; /** * 一个创建Action的工厂 * @author Administrator * */ public class ActionFactory { public static Object create(String className){ Object action=null; try { action = (Object)Class.forName(className).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return action; } }
6、配置文件类
package com.togogo.webtoservice; import java.util.HashMap; import java.util.Map; import java.util.ResourceBundle; /** * 路径与类名映身 * * @author Administrator * */ public class Config { // private static Map<String, String> classNames = new HashMap<String, // String>(); /** * 通过key * * @param key * @return */ public static String getClassName(String key, String config) { ResourceBundle bundle = null; if (config == null||"".equals(config)) { bundle = ResourceBundle.getBundle("Action"); } else { bundle = ResourceBundle.getBundle(config); } return bundle.getString(key); } }
--------------------------------------------------------测试框架------------------------------------------------
7、UserAction类
package com.togogo.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.togogo.webtoservice.annotations.Action; import com.togogo.webtoservice.annotations.Path; @Action public class UserAction { /** * 用户登录 * * @param request * @param response * @return */ @Path(value="login.do") public String login(HttpServletRequest request, HttpServletResponse response) { System.out.println("我在登录"); System.out.println("我在登录."); System.out.println("我在登录.."); System.out.println("我在登录."); System.out.println("我在登录.."); System.out.println("我在登录."); System.out.println("我在登录.."); System.out.println("我在------登录.."); System.out.println("我在------登录.."); System.out.println("我在------登录.."); System.out.println("我在------登录.."); return "main.jsp"; } /** * 用户注册 * * @param request * @param response * @return */ @Path(value="register.do") public String register(HttpServletRequest request, HttpServletResponse response) { System.out.println("我在注册"); return "forward:main.jsp"; } /** * 用户注册 * * @param request * @param response * @return */ public String undo(HttpServletRequest request, HttpServletResponse response) { System.out.println("我在撤消"); return "redirect:main.jsp"; } }
8、映射配置文件Action.properties
user=com.togogo.action.UserAction
9、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" 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>web_mvc_webtoservice</display-name> <!-- 这是一个核心控制器 --> <servlet> <servlet-name>dispacherServlet</servlet-name> <servlet-class>com.togogo.webtoservice.DispacherServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>resources.Action</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispacherServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
10、测试页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <a></a> <form action="${pageContext.request.contextPath }/user!login.do" method="post"> <!-- <input name="clasName" value="com.togogo.action.UserAction"> --> <input type="submit"> </form> </body> </html>
源码下载:
http://files.cnblogs.com/files/zhuyuejiu/web_mvc_webtoservice_annotation.zip
以上是关于一个简单的MVC框架的实现-基于注解的实现的主要内容,如果未能解决你的问题,请参考以下文章
Spring : 基于注解的 Spring MVC( 上 )
基于注解实现简单Spring框架:完成IOC容器和声明式事务控制