• 自定义MVC01


    目录

    一、MVC简介

    二、最初增删改查

    三、反射版增删改查

    四、自定义后台代码实现 

    五、自定义MVC工作原理图


    一、MVC简介

     MVC:名字由model(模型层);view (视图层);controller (控制层)三种英文单词缩写,是一种软件设计典范

    分为三层:

    model:模型层

    view :视图层

    controller 控制层

    二、最初增删改查

    <%@ 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>
            <h3>目前增加删除修改查询</h3>
            <a href="${pageContext.request.contextPath }/book/add">增加</a>
            <a href="${pageContext.request.contextPath }/book/edit">修改</a>
            <a href="${pageContext.request.contextPath }/book/del">删除</a>
            <a href="${pageContext.request.contextPath }/book/list">查询</a>

        

        
    </body>
    </html>

    ======================================================增加删除修改查询依次创建专属servlet ===

    package com.lucy.web;

    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    /**
     * Servlet implementation class AddBookServlet
     */
    @WebServlet("/book/add") 
    public class AddBookServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }

        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                System.out.println("处理书籍的增加业务,调用bookbiz");
        
        
        }

    }
     

     效果图如下:

    三、反射版增删改查

     <h3>类数量多问题优化</h3>
            <a href="${pageContext.request.contextPath }/book.action?methodName=add">增加</a>
            <a href="${pageContext.request.contextPath }/book.action?methodName=edit">修改</a>
            <a href="${pageContext.request.contextPath }/book.action?methodName=del">删除</a>
            <a href="${pageContext.request.contextPath }/book.action?methodName=list">查询</a>
            <a href="${pageContext.request.contextPath }/book.action?methodName=load">回显</a>

     ==================================================反射优化代码=========================================

    package com.lucy.web;

    import java.io.IOException;
    import java.lang.reflect.Method;

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    /**
     * Servlet implementation class AddBookServlet
     */
    @WebServlet("/book.action")
    public class BookServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }

        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //            System.out.println("处理书籍的增加业务,调用bookbiz");
    //            为了区分当前请求的目的,增加删除查看修改的目的,就从前台讲要调用的二分法名传递到后台
    //        methodName 可能是load/add/list/del/edit等
            String methodName=request.getParameter("methodName");
    //        前台传递什么方法,就调用当前类的对应方法
                try {
                    //调用方法
                    Method m=this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
                m.setAccessible(true);
                //调用当前类实例的methodName方法
                m.invoke(this, request,response);
                } catch (Exception e) {
                    e.printStackTrace();
                }
           
            

            
            
    //        如果前台传递到后台的是一个新增的请求,那么后台就调用新增方法
                 if("add".equals(methodName)) {
                    add(request,response);
                }
                else if("del".equals(methodName)) {
                    del(request,response);
                }
                else if("edit".equals(methodName)) {
                    edit(request,response);
                }
                else if("list".equals(methodName)) {
                    list(request,response);
                }
                else if("load".equals(methodName)) {
                    load(request,response);
                }
        }

        private void load(HttpServletRequest request, HttpServletResponse response) {
            System.out.println("在同一个servlet中调用load方法");
        }

        private void list(HttpServletRequest request, HttpServletResponse response) {
                System.out.println("在同一个servlet中调用list方法");
        }

        private void edit(HttpServletRequest request, HttpServletResponse response) {
            System.out.println("在同一个servlet中调用edit方法");
            
        }

        private void del(HttpServletRequest request, HttpServletResponse response) {
            System.out.println("在同一个servlet中调用del方法");
            
        }

        private void add(HttpServletRequest request, HttpServletResponse response) {
            System.out.println("在同一个servlet中调用add方法");
            
        }

    }
     

    四、自定义后台代码实现 

    action  :子控制器 interface 接口

    actionSupport  :专门写反射方法的类 implements Action

    bookAction:该实体类所实现具备 的方法类 implements Action

    DispatchServlet:中央控制器 extends HttpServlet

     中央控制器---->

    1. package com.lucy.web;
    2. import java.io.IOException;
    3. import java.util.HashMap;
    4. import java.util.Map;
    5. import javax.servlet.ServletException;
    6. import javax.servlet.annotation.WebServlet;
    7. import javax.servlet.http.HttpServlet;
    8. import javax.servlet.http.HttpServletRequest;
    9. import javax.servlet.http.HttpServletResponse;
    10. import com.lucy.framework.Action;
    11. /**
    12. * 中央控制器:
    13. * 主要接受浏览器,找到对应的处理人---action
    14. * @author lucy
    15. *
    16. */
    17. @WebServlet("*.action")
    18. public class DispatcherServlet extends HttpServlet {
    19. private static final long serialVersionUID = 1L;
    20. // ?
    21. private Map<String, Action> actions=new HashMap<String, Action>();
    22. //处程序启动 会加载一次初始化
    23. @Override
    24. public void init() throws ServletException {
    25. actions.put("/book", new BookAction());
    26. }
    27. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    28. doPost(request, response);
    29. }
    30. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    31. String url=request.getRequestURI();//http://locatio:8080/mvc/book.action?methodName=list
    32. // 要拿到/book 就是最后一个.为止--截取地址
    33. url=url.substring(url.lastIndexOf("/"),url.lastIndexOf("."));
    34. // System.out.println("路径"+url);
    35. Action action=actions.get(url);//路径
    36. action.execute(request, response);//执行反射代码
    37. }
    38. }

     =====================================================子控制器 =========================================

    package com.lucy.framework;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    /**子控制器  --对应处理人 
     * 对应请求的人
     * @author lucy
     *
     */
    public interface Action {
         void execute(HttpServletRequest request, HttpServletResponse response) ;
        
    }
     

     ======================================================= ActionSupport============================

    package com.lucy.framework;

    import java.lang.reflect.Method;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class ActionSupport implements Action{

        @Override
        public void execute(HttpServletRequest request, HttpServletResponse response) {
            String methodName=request.getParameter("methodName");
    //        前台传递什么方法,就调用当前类的对应方法
                try {
                    //调用方法
                    Method m=this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
                m.setAccessible(true);
                //调用当前类实例的methodName方法
                m.invoke(this, request,response);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                
        }
            
    }
     

     ==========================BookAction====================================================

    package com.lucy.web;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import com.lucy.framework.Action;
    import com.lucy.framework.ActionSupport;

    /**具体action ---若实体类改变,则用此类来进行修改实体类
     * @author lucy
     *
     */
    public class BookAction extends ActionSupport {


        private void load(HttpServletRequest request, HttpServletResponse response) {
            System.out.println("在同一个orderservlet中调用load方法");
        }

        private void list(HttpServletRequest request, HttpServletResponse response) {
                System.out.println("在同一个orderservlet中调用list方法");
        }

        private void edit(HttpServletRequest request, HttpServletResponse response) {
            System.out.println("在同一个orderservlet中调用edit方法");
            
        }

        private void del(HttpServletRequest request, HttpServletResponse response) {
            System.out.println("在同一个orderservlet中调用del方法");
            
        }

        private void add(HttpServletRequest request, HttpServletResponse response) {
            System.out.println("在同一个orderservlet中调用add方法");
            
        }
            
    }
     

     ==============================================================boookServlet=================================

    1. package com.lucy.web;
    2. import java.io.IOException;
    3. import java.lang.reflect.Method;
    4. import javax.servlet.ServletException;
    5. import javax.servlet.annotation.WebServlet;
    6. import javax.servlet.http.HttpServlet;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. /**
    10. * Servlet implementation class AddBookServlet
    11. */
    12. @WebServlet("/book.action")
    13. public class BookServlet extends HttpServlet {
    14. private static final long serialVersionUID = 1L;
    15. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    16. doPost(request, response);
    17. }
    18. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    19. // System.out.println("处理书籍的增加业务,调用bookbiz");
    20. // 为了区分当前请求的目的,增加删除查看修改的目的,就从前台讲要调用的二分法名传递到后台
    21. // methodName 可能是load/add/list/del/edit等
    22. String methodName=request.getParameter("methodName");
    23. // 前台传递什么方法,就调用当前类的对应方法
    24. try {
    25. //调用方法
    26. Method m=this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
    27. m.setAccessible(true);
    28. //调用当前类实例的methodName方法
    29. m.invoke(this, request,response);
    30. } catch (Exception e) {
    31. e.printStackTrace();
    32. }
    33. // 如果前台传递到后台的是一个新增的请求,那么后台就调用新增方法
    34. if("add".equals(methodName)) {
    35. add(request,response);
    36. }
    37. else if("del".equals(methodName)) {
    38. del(request,response);
    39. }
    40. else if("edit".equals(methodName)) {
    41. edit(request,response);
    42. }
    43. else if("list".equals(methodName)) {
    44. list(request,response);
    45. }
    46. else if("load".equals(methodName)) {
    47. load(request,response);
    48. }
    49. }
    50. private void load(HttpServletRequest request, HttpServletResponse response) {
    51. System.out.println("在同一个servlet中调用load方法");
    52. }
    53. private void list(HttpServletRequest request, HttpServletResponse response) {
    54. System.out.println("在同一个servlet中调用list方法");
    55. }
    56. private void edit(HttpServletRequest request, HttpServletResponse response) {
    57. System.out.println("在同一个servlet中调用edit方法");
    58. }
    59. private void del(HttpServletRequest request, HttpServletResponse response) {
    60. System.out.println("在同一个servlet中调用del方法");
    61. }
    62. private void add(HttpServletRequest request, HttpServletResponse response) {
    63. System.out.println("在同一个servlet中调用add方法");
    64. }
    65. }

    五、自定义MVC工作原理图

     

  • 相关阅读:
    计算机毕业设计(附源码)python校园疫情防控管理软件
    【c语言】模拟实现字符串函数(上)
    为什么ChatGPT用强化学习而非监督学习?
    vscode中编码错误
    【LeetCode75】第五十四题 咒语和药水的成功对数
    【实践篇】Redis最强Java客户端(四)之Ression分布式集合使用指南
    216. 组合总和 III
    OpenInventor/Coin3D 学习指南
    搭建单机 nacos 负载均衡ribbon 轮询策略 权重2种方式
    SpringBoot整合Thymeleaf
  • 原文地址:https://blog.csdn.net/qq_66924116/article/details/125455883