zoukankan      html  css  js  c++  java
  • 自定义MVC

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

    }

  • 相关阅读:
    杭电1171 Big Event in HDU(母函数+多重背包解法)
    怎样设计接口?
    未将对象引用设置到对象的实例--可能出现的问题总结
    開始Unity3D的学习之旅
    介绍一款轻量级js控件:easy.js
    Mustache 使用心得总结
    (ArcGIS API For Silverlight )QueryTask 跨层查询,和监控完整的查询!
    非常基本的SQL 内外连接
    Myeclipse它显示了一个目录的结构,而不是包
    Duanxx的Design abroad: C++矩阵运算库Eigen 概要
  • 原文地址:https://www.cnblogs.com/omji0030/p/11086710.html
Copyright © 2011-2022 走看看