一个简单的MVC框架的实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个简单的MVC框架的实现相关的知识,希望对你有一定的参考价值。
1、Action接口
package com.togogo.webtoservice; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public interface Action { /** * 默认的执行方法 * @param request 传入处理的请求对象 * @param response 传入处理的响应对象 * @return 返回一个跳转的路径 */ public String execute(HttpServletRequest request, HttpServletResponse response); }
2、BaseAction的父类
package com.togogo.webtoservice; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public abstract class BaseAction implements Action { @Override public String execute(HttpServletRequest request, HttpServletResponse response) { String result = null; String uri = request.getRequestURI(); StringBuilder sb = new StringBuilder(uri); String path = sb.substring(uri.lastIndexOf("!") + 1, uri.lastIndexOf(".")); // 已知,方法与uri的参数的字符串,一样的,那么有没有方法,可以通过方法名(字符串)直接调用方法? // 实现通过方法名,直接调用方法,就类动态技术 try { Method method = this.getClass().getDeclaredMethod(path, HttpServletRequest.class, HttpServletResponse.class); result = (String) method.invoke(this, request, response); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return result; } }
3、配置类
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); } // static { // classNames.put("/user", "com.togogo.action.UserAction"); // classNames.put("/admin", "com.togogo.action.AdminAction"); // } public static void main(String[] args) { // 用于以类的形式来读取properties对象 ResourceBundle bundle = ResourceBundle .getBundle("com.togogo.webtoservice.Action"); System.out.println(bundle.getString("user")); } }
4、DispacherServlet 类
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); Action action = ActionFactory.create(className); String result = action.execute(request, response); 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; public class Factory { public static Action create(String className) { Action action = null; try { action = (Action) Class.forName(className).newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return action; } }
6、测试TestAction类
package com.togogo.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.togogo.webtoservice.BaseAction; public class UserAction extends BaseAction { /** * 用户登录 * * @param request * @param response * @return */ public String login(HttpServletRequest request, HttpServletResponse response) { System.out.println("我在登录"); System.out.println("我在------登录.."); return "main.jsp"; } /** * 用户注册 * * @param request * @param response * @return */ 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"; } }
Action.properties映射文件
user=com.togogo.action.UserAction
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>com.togogo.action.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>
测试页面
<%@ 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!register.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_webtoserive.zip
以上是关于一个简单的MVC框架的实现的主要内容,如果未能解决你的问题,请参考以下文章