• 自定义MVC


    目录

    一,MVC简介

    二,最初版的曾删改查

    三,反射版的增删改查

    四,自定义mvc后台代码实现


    一,MVC简介

    什么是mvc?

    m:model------模型层

    v:view-------视图层

    c:controller-------控制层

    优点:分工明确,各司其职

    二,最初版的曾删改查

    每一个方法都需要写一个类

    一、以下就拿出一个类的代码来演示

    1. package com.dengxiyan.servlet;
    2. import java.io.IOException;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.annotation.WebServlet;
    5. import javax.servlet.http.HttpServlet;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. @WebServlet("/book/add")
    9. public class AddServlet extends HttpServlet{
    10. @Override
    11. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    12. doPost(req, resp);
    13. }
    14. @Override
    15. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    16. System.out.println("处理书籍的增加业务,调用BookBiz");
    17. }
    18. }

    《jsp界面代码》


    存在问题:
        1.关于单个实体表操作场景越多,需要新建的类越多,造成了项目中类的数量过大
     

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <!DOCTYPE html>
    4. <html>
    5. <head>
    6. <meta charset="UTF-8">
    7. <title>Insert title here</title>
    8. </head>
    9. <body>
    10. <h3>目前的增删改查</h3>
    11. <a href="${pageContext.request.contextPath }/book/add">增加</a>
    12. <a href="${pageContext.request.contextPath }/book/del">删除</a>
    13. <a href="${pageContext.request.contextPath }/book/update">修改</a>
    14. <a href="${pageContext.request.contextPath }/book/select">查看</a>
    15. </body>
    16. </html>

     效果图

    三,反射版的增删改查

    《代码演示》

    1. package com.dengxiyan.servlet;
    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. @WebServlet("/book.action")
    10. public class BookServlet extends HttpServlet {
    11. @Override
    12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. doPost(req, resp);
    14. }
    15. @Override
    16. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    17. //为了区分当前请求的目的,增删改查的目的,就从前台将要调用方法名传递到后台
    18. String methodName = req.getParameter("methodName");
    19. //methodName可能是add/del/...
    20. //前台传递什么方法,就调用当前类对应的方法
    21. try {
    22. Method m = this.getClass()//相当于BookServlet
    23. .getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
    24. m.setAccessible(true);
    25. //调用当前类实例的methodName方法 传什么就掉什么方法
    26. m.invoke(this, req,resp);
    27. } catch (Exception e) {
    28. // TODO Auto-generated catch block
    29. e.printStackTrace();
    30. }
    31. }
    32. /**
    33. 以上代码是对以下代码的优化
    34. */
    35. //如果前台传递后台的是一个新增的请求,那么后台就调用新增的方法
    36. /*if("add".equals(methodName)) {
    37. add(req,resp);
    38. }
    39. else if("del".equals(methodName)) {
    40. del(req,resp);
    41. }
    42. else if("update".equals(methodName)){
    43. update(req,resp);
    44. }
    45. else if("select".equals(methodName)) {
    46. select(req,resp);
    47. }
    48. else if("lod".equals(methodName)) {
    49. lod(req,resp);
    50. }*/
    51. private void lod(HttpServletRequest req, HttpServletResponse resp) {
    52. System.out.println("在同一个servlet中调用 回显");
    53. }
    54. private void select(HttpServletRequest req, HttpServletResponse resp) {
    55. System.out.println("在同一个servlet中调用 增加");
    56. }
    57. private void update(HttpServletRequest req, HttpServletResponse resp) {
    58. System.out.println("在同一个servlet中调用 修改");
    59. }
    60. private void del(HttpServletRequest req, HttpServletResponse resp) {
    61. System.out.println("在同一个servlet中调用 删除");
    62. }
    63. private void add(HttpServletRequest req, HttpServletResponse resp) {
    64. System.out.println("在同一个servlet中调用 查看 ");
    65. }
    66. }

     jsp代码


    存在问题:
        当新增业务,除了要添加一个新的请求
        反射相关的代码,在每一个实体类对应的servlet中都存在

     

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <!DOCTYPE html>
    4. <html>
    5. <head>
    6. <meta charset="UTF-8">
    7. <title>Insert title here</title>
    8. </head>
    9. <body>
    10. <h3>类数量问题过多问题优化</h3>
    11. <a href="${pageContext.request.contextPath }/book.action?methodName=add">增加</a>
    12. <a href="${pageContext.request.contextPath }/book.action?methodName=del">删除</a>
    13. <a href="${pageContext.request.contextPath }/book.action?methodName=update">修改</a>
    14. <a href="${pageContext.request.contextPath }/book.action?methodName=select">查看</a>
    15. <a href="${pageContext.request.contextPath }/book.action?methodName=lod">回显</a>
    16. </body>
    17. </html>

    《效果图》 

    四,自定义mvc后台代码实现

    根据以上逻辑图得知需建立以下类

    DispatcherServlet(中央控制器)

    主要功能:接收浏览器请求,找到对应的处理人。不处理任何业务逻辑,只接受请求

    《代码演示》

    提示:@WebServlet("*.action")这样写的好处在于,只要含有action路径的都能识别,就不用在多个类里写

    1. package com.dengxiyan.framework;
    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.dengxiyan.servlet.BookAction;
    11. /**
    12. * 中央控制器
    13. * @author DXY
    14. *2022年6月24日下午5:39:23
    15. */
    16. @WebServlet("*.action")
    17. public class DispatcherServlet extends HttpServlet{
    18. private Map<String, Action> actions = new HashMap<String, Action>();
    19. //程序启动时值加载一次
    20. @Override
    21. public void init() throws ServletException {
    22. actions.put("/book", new BookAction());
    23. // actions.put("/order", new BookAction());
    24. }
    25. @Override
    26. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    27. doPost(req, resp);
    28. }
    29. @Override
    30. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    31. //http://location:8080/mvc/book.action?me....
    32. String uri = req.getRequestURI();//路径
    33. // 要拿到/book,就是最后一个/到最会一个.的位置
    34. uri = uri.substring(uri.lastIndexOf("/"),
    35. uri.lastIndexOf("."));
    36. Action action = actions.get(uri);
    37. action.execute(req, resp);
    38. }
    39. }

    Action(自控制器)接口类     对应请求处理的人

    《代码演示》

    1. package com.dengxiyan.framework;
    2. import javax.servlet.http.HttpServletRequest;
    3. import javax.servlet.http.HttpServletResponse;
    4. /**
    5. *
    6. * 子控制器
    7. * @author DXY
    8. *2022年6月24日下午5:42:03
    9. */
    10. public interface Action {
    11. //封装继承多态
    12. void execute(HttpServletRequest req, HttpServletResponse resp);
    13. }

    ActionSupport类

    《代码演示》

    此类需要实现子控制器(Action),同时要实现自控制器的方法execute。

    1. package com.dengxiyan.framework;
    2. import java.lang.reflect.Method;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletResponse;
    5. public class ActionSupport implements Action{
    6. @Override
    7. public void execute(HttpServletRequest req, HttpServletResponse resp) {
    8. String methodName = req.getParameter("methodName");
    9. //methodName可能是add/del/...
    10. //前台传递什么方法,就调用当前类对应的方法
    11. try {
    12. Method m = this.getClass()//相当于BookServlet
    13. .getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
    14. m.setAccessible(true);
    15. //调用当前类实例的methodName方法 传什么就掉什么方法
    16. m.invoke(this, req,resp);
    17. } catch (Exception e) {
    18. // TODO Auto-generated catch block
    19. e.printStackTrace();
    20. }
    21. }
    22. }

    BookAction类,需要继承ActionSupport类,不用调用doGet及doPost方法,只需要执行以下方法即可,因为每一个servlet都有doget,dopost方法

    《代码演示》

    1. package com.dengxiyan.servlet;
    2. import javax.servlet.http.HttpServletRequest;
    3. import javax.servlet.http.HttpServletResponse;
    4. import com.dengxiyan.framework.ActionSupport;
    5. public class BookAction extends ActionSupport {
    6. private void lod(HttpServletRequest req, HttpServletResponse resp) {
    7. System.out.println("在同一个servlet中调用 回显");
    8. }
    9. private void select(HttpServletRequest req, HttpServletResponse resp) {
    10. System.out.println("在同一个servlet中调用 增加");
    11. }
    12. private void update(HttpServletRequest req, HttpServletResponse resp) {
    13. System.out.println("在同一个servlet中调用 修改");
    14. }
    15. private void del(HttpServletRequest req, HttpServletResponse resp) {
    16. System.out.println("在同一个servlet中调用 删除");
    17. }
    18. private void add(HttpServletRequest req, HttpServletResponse resp) {
    19. System.out.println("在同一个servlet中调用 查看 ");
    20. }
    21. }

    jsp界面代码

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <!DOCTYPE html>
    4. <html>
    5. <head>
    6. <meta charset="UTF-8">
    7. <title>Insert title here</title>
    8. </head>
    9. <body>
    10. <%-- <h3>目前的增删改查</h3>
    11. <a href="${pageContext.request.contextPath }/book/add">增加</a>
    12. <a href="${pageContext.request.contextPath }/book/del">删除</a>
    13. <a href="${pageContext.request.contextPath }/book/update">修改</a>
    14. <a href="${pageContext.request.contextPath }/book/select">查看</a>
    15. --%>
    16. <!--
    17. 存在问题:
    18. 1.关于单个实体表操作场景越多,需要新建的类越多,造成了项目中类的数量过大
    19. 2.当新增业务,除了要添加一个新的请求
    20. 3.反射相关的代码,在每一个实体类对应的servlet中都存在
    21. 4.每一个servlet都有doget,dopost方法
    22. -->
    23. <!-- 类数量问题过多问题优化 -->
    24. <h3>类数量问题过多问题优化</h3>
    25. <a href="${pageContext.request.contextPath }/book.action?methodName=add">增加</a>
    26. <a href="${pageContext.request.contextPath }/book.action?methodName=del">删除</a>
    27. <a href="${pageContext.request.contextPath }/book.action?methodName=update">修改</a>
    28. <a href="${pageContext.request.contextPath }/book.action?methodName=select">查看</a>
    29. <a href="${pageContext.request.contextPath }/book.action?methodName=lod">回显</a>
    30. </body>
    31. </html>

    效果图 

    效果同上,只是编码方式不

  • 相关阅读:
    微信小程序--云开发
    【机器学习】李宏毅——Unsupervised Learning
    FineBI与DeepBI针对用9行数据分析一篇完整的数据报告的速度对比
    《构建中小企业网络V7.1》实验
    可视化大屏报表的设计与制作 | 附成果图
    1.1 Mediapipe随手简记(一)
    【uniapp】跨端开发问题记录
    管理信息系统期末复习资料
    java中Random的使用
    浅谈设计模式(五)
  • 原文地址:https://blog.csdn.net/weixin_66202611/article/details/125450942