云间录  

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);;}

}

 

posted on 2019-06-25 21:13  云间录  阅读(288)  评论(0编辑  收藏  举报