MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,
它是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码
Model1 jsp+jdbc
Model2 ->MVC
核心思想:各司其职
工作原理:
通过XML对自定义mvc框架进行增强
将子控制器配置到xml中
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- 3 config标签:可以包含0~N个action标签 4 --> 5 <config> 6 <!-- 7 action标签:可以饱含0~N个forward标签 8 path:以/开头的字符串,并且值必须唯一 非空 9 type:字符串,非空 10 --> 11 <action path="/number" type="com.servlet.Number"> 12 <!-- 13 forward标签:没有子标签; 14 name:字符串,同一action标签下的forward标签name值不能相同 ; 15 path:以/开头的字符串 16 redirect:只能是false|true,允许空,默认值为false 17 --> 18 <forward name="failed" path="/rs.jsp" redirect="false" /> 19 <forward name="success" path="/login.jsp" redirect="true" /> 20 </action> 21 22 </config>
中央控制器
1 package com.framework; 2 3 import java.io.IOException; 4 import java.util.HashMap; 5 import java.util.Map; 6 import java.util.Map.Entry; 7 8 import javax.servlet.ServletException; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 13 import com.framework.xml.ActionModel; 14 import com.framework.xml.ConfigModel; 15 import com.framework.xml.ConfigModelFactory; 16 import com.framework.xml.ForwardModel; 17 import com.servlet.*; 18 import com.servlet.Number; 19 20 /** 21 * 中央处理器 Servlet implementation class ActionServlet 22 */ 23 public class ActionServlet extends HttpServlet { 24 private static final long serialVersionUID = 1L; 25 26 /** 27 * @see HttpServlet#HttpServlet() 28 */ 29 public ActionServlet() { 30 super(); 31 // TODO Auto-generated constructor stub 32 } 33 34 ConfigModel configModel = null; 35 36 @Override 37 public void init() throws ServletException { 38 if (configModel == null) { 39 String xmlPath = this.getInitParameter("config"); 40 try { 41 configModel = ConfigModelFactory.newInstance(xmlPath); 42 } catch (Exception e) { 43 // TODO Auto-generated catch block 44 e.printStackTrace(); 45 } 46 47 } 48 super.init(); 49 } 50 51 /** 52 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse 53 * response) 54 */ 55 protected void doGet(HttpServletRequest request, HttpServletResponse response) 56 throws ServletException, IOException { 57 doPost(request, response); 58 } 59 60 /** 61 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse 62 * response) 63 */ 64 protected void doPost(HttpServletRequest request, HttpServletResponse response) 65 throws ServletException, IOException { 66 // TODO Auto-generated method stub 67 68 // 获取请求的路径 69 String actionPath = request.getServletPath(); 70 if (actionPath.indexOf(".action") < 0) { 71 return; 72 } 73 // 截取请求路径字符的字符的前缀 74 actionPath = actionPath.substring(0, actionPath.indexOf(".action")); 75 ActionModel actionModel = configModel.get(actionPath); 76 // 根据当前的actionPath获取对应的action的实现类 77 Action action = createAction(actionPath, actionModel); 78 // 执行方法 79 String code = action.execute(request, response); 80 processCode(code, actionModel, request, response); 81 } 82 private void processMOdelDriver() { 83 84 if (action instanceof ModelDriver) { 85 86 } 87 } 88 89 /** 90 * 根据返回的代码,决定是否需要重定向还是转发 91 * 92 * @param code 93 * @param actionModel 94 * @param request 95 * @param response 96 * @throws ServletException 97 * @throws IOException 98 */ 99 private void processCode(String code, ActionModel actionModel, HttpServletRequest request, 100 HttpServletResponse response) throws ServletException, IOException { 101 if (code == null) { 102 return; 103 } 104 ForwardModel forwardModel = actionModel.get(code); 105 if (forwardModel.isRedirect()) { 106 response.sendRedirect(request.getContextPath() + forwardModel.getPath()); 107 } else { 108 request.getRequestDispatcher(forwardModel.getPath()).forward(request, response); 109 } 110 } 111 112 /** 113 * 根据访问路径的名称,得到具体的实现类 114 * 115 * @param key 116 * @return 117 */ 118 private Action createAction(String key, ActionModel actionModel) { 119 actionModel = configModel.get(key); 120 // 开始反射 121 try { 122 Class clazz = Class.forName(actionModel.getType()); 123 Object object = clazz.newInstance(); 124 return (Action) object; 125 } catch (Exception e) { 126 throw new RuntimeException(e); 127 } 128 } 129 }
子控制器:
1 package com.servlet; 2 3 import java.io.IOException; 4 import java.lang.reflect.Method; 5 import java.util.Map; 6 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 import com.entity.Numberentity; 12 import com.framework.Action; 13 import com.framework.ModelDriver; 14 15 public class Number extends Action implements ModelDriver<Numberentity>{ 16 17 private Numberentity n1=new Numberentity(); 18 19 @Override 20 public Numberentity getModel() { 21 return n1; 22 } 23 @Override 24 public String execute(HttpServletRequest request, HttpServletResponse response) 25 throws ServletException, IOException { 26 // 反射 27 // class对象 28 Class clzz = this.getClass(); 29 try { 30 Object object = clzz.newInstance(); 31 String methodName=methodName(request); 32 Method m = clzz.getDeclaredMethod(methodName,HttpServletRequest.class, HttpServletResponse.class); 33 m.setAccessible(true); 34 m.invoke(object, request, response); 35 } catch (Exception e) { 36 throw new RuntimeException(e); 37 } 38 return "success"; 39 } 40 41 public String methodName(HttpServletRequest request) throws ServletException, IOException { 42 for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) { 43 if (entry.getKey().indexOf("method:") > -1) { 44 return entry.getKey().substring(entry.getKey().indexOf(":") + 1); 45 } 46 } 47 return null; 48 } 49 50 private void add(HttpServletRequest request, HttpServletResponse response) 51 throws ServletException, IOException { 52 request.setAttribute("n3", n1.getN1()+n1.getN2()); 53 // request.getRequestDispatcher("rs.jsp").forward(request, response); 54 } 55 56 private void add2(HttpServletRequest request, HttpServletResponse response) 57 throws ServletException, IOException { 58 request.setAttribute("n3", n1.getN1()-n1.getN2()); 59 request.getRequestDispatcher("rs.jsp").forward(request, response);; 60 } 61 62 private void add3(HttpServletRequest request, HttpServletResponse response) 63 throws ServletException, IOException { 64 request.setAttribute("n3", n1.getN1()*n1.getN2()); 65 request.getRequestDispatcher("rs.jsp").forward(request, response);; 66 } 67 68 private void add4(HttpServletRequest request, HttpServletResponse response) 69 throws ServletException, IOException { 70 request.setAttribute("n3", n1.getN1()/n1.getN2()); 71 request.getRequestDispatcher("rs.jsp").forward(request, response);; 72 } 73 74 75 76 }
解决框架中配置文件的冲突问题
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>T226_mvc</display-name> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>com.huang.framework.DispatcherServlet</servlet-class> <init-param> <param-name>xmlPath</param-name> <param-value>/mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app>
package com.servlet;
import java.io.IOException;import java.lang.reflect.Method;import java.util.Map;
import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;
import com.entity.Numberentity;import com.framework.Action;import com.framework.ModelDriver;
public class Number extends Action implements ModelDriver<Numberentity>{
private Numberentity n1=new Numberentity();@Overridepublic Numberentity getModel() {return n1;}@Overridepublic String execute(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 反射// class对象Class clzz = this.getClass();try {Object object = clzz.newInstance();String methodName=methodName(request);Method m = clzz.getDeclaredMethod(methodName,HttpServletRequest.class, HttpServletResponse.class);m.setAccessible(true);m.invoke(object, request, response);} catch (Exception e) {throw new RuntimeException(e);}return "success";}
public String methodName(HttpServletRequest request) throws ServletException, IOException {for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) {if (entry.getKey().indexOf("method:") > -1) {return entry.getKey().substring(entry.getKey().indexOf(":") + 1);}}return null;}
private void add(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { request.setAttribute("n3", n1.getN1()+n1.getN2());// request.getRequestDispatcher("rs.jsp").forward(request, response);}
private void add2(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { request.setAttribute("n3", n1.getN1()-n1.getN2()); request.getRequestDispatcher("rs.jsp").forward(request, response);;} private void add3(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { request.setAttribute("n3", n1.getN1()*n1.getN2()); request.getRequestDispatcher("rs.jsp").forward(request, response);;}
private void add4(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { request.setAttribute("n3", n1.getN1()/n1.getN2()); request.getRequestDispatcher("rs.jsp").forward(request, response);;}
}