• 自定义MVC【第一章】


    一、什么是MVC?
            MVC的全名:Model View Controller,其中Model是(模型层)、View是(视图层)、Controller是(控制层);是一种使用“模型-视图-控制器”设计创建Web应用程序的模式,同时提供了对HTML、CSS和JavaScript的完全控制;它是一种软件设计典范用于业务逻辑处理、数据、界面显示分离

    ●   Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常负责在数据库中存取数据。

    ●   View(视图)是应用程序中处理数据显示的部分。通常是依据模型数据创建的。

    ●   Controller(控制器)是应用程序中处理用户交互的部分。通常负责从视图读取数据,控制用户输入,并向模型发送数据。

    2、为什么要使用MVC?

    主要目的是将 Model 和 View 的实现代码分离,从而使同一个程序可以使用不同的表现形式。

    3、三层架构和MVC的区别?
    三层架构是一个经典的分层思想,将开发模式分为三层,每个人专注自己擅长模块即可;
    MVC是一种设计模式,其目的是让html和业务逻辑分开。

    4、MVC结构?

        V(视图层--View)

        C(控制层--Controller) 
     
        M(模型层--Model)

    注:1)不能跨层调用;
           2)只能由上往下进行调用;View -> Controller -> Model

    5、自定义MVC工作原理图
     

               *.action           调度           截取*(请求路径名) 处理具体业务逻辑
       JSP -----------> Servlet(中央控制器)--------------------->Action(子控制器)--->Model(Dao、DB)


    6、MVC实现
       案例1:
         1)创建抽象类Action,定义抽象方法execute(处理具体逻辑)

    1. package com.zking.mvc.framework;
    2. import java.io.IOException;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. /**
    7. * 子控制类,做具体的核心业务逻辑处理
    8. * @author gss
    9. *
    10. */
    11. public abstract class Action {
    12. public abstract String execute(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException;
    13. }

         2)创建HelloAction并继承抽象类Action(子类继承父类),重写execute方法

    1. package com.zking.mvc.action;
    2. import java.io.IOException;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import com.zking.mvc.framework.Action;
    7. public class HelloAction extends Action {
    8. @Override
    9. public String execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    10. System.out.println("Hello,World!自定义MVC");
    11. return null;
    12. }
    13. }

         3)在ActionServlet中定义私有Map(根据不同请求路径名调用不同逻辑处理Action类)

        4)在ActionServlet中的init方法初始化Map集合
                action.put('请求路径','逻辑处理Action类')
        5)在ActionServlet中的doPost方法中处理请求

        6)  配置web.xml

    1. <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">
    2. <display-name>mvcdisplay-name>
    3. <servlet>
    4. <servlet-name>actionServletservlet-name>
    5. <servlet-class>com.zking.mvc.framework.ActionServletservlet-class>
    6. <init-param>
    7. <param-name>configparam-name>
    8. <param-value>/config.xmlparam-value>
    9. init-param>
    10. servlet>
    11. <servlet-mapping>
    12. <servlet-name>actionServletservlet-name>
    13. <url-pattern>*.actionurl-pattern>
    14. servlet-mapping>
    15. web-app>
    1. package com.zking.mvc.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.http.HttpServlet;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. import org.apache.commons.beanutils.BeanUtils;
    10. import com.zking.mvc.action.AddAction;
    11. import com.zking.mvc.action.HelloAction;
    12. import com.zking.mvc.entity.ActionModel;
    13. import com.zking.mvc.entity.ConfigModel;
    14. import com.zking.mvc.entity.ForwardModel;
    15. import com.zking.mvc.util.ConfigModelFactory;
    16. /**
    17. * ActionServlet:中央控制器,用于接受请求,分发请求,不做具体的核心业务逻辑处理
    18. * @author gss
    19. *
    20. */
    21. public class ActionServlet extends HttpServlet {
    22. //定义全局变量
    23. //该集合用于定义请求路径与子控制器类Action之间的绑定关系
    24. //例如:/hellAction ---> HellAction extends Action
    25. //String代表请求路径名,也就是*(包含/)
    26. //Action代表请求路径所对应的子控制器类Action
    27. private Map actions = new HashMap<>();
    28. @Override
    29. public void init() throws ServletException {
    30. super.init();
    31. //初始化
    32. actions.put("/helloAction", new HelloAction());
    33. try {
    34. String path = this.getInitParameter("config");
    35. configModel= ConfigModelFactory.createConfigModel(path);
    36. } catch (Exception e) {
    37. e.printStackTrace();
    38. }
    39. }
    40. @Override
    41. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    42. this.doPost(req, resp);
    43. }
    44. @Override
    45. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    46. //1.获取请求路径*.action
    47. String requestURL = req.getServletPath();
    48. //2.获取请求路径名 * 例如:/hellAction.action ---> /hellAction
    49. int start = requestURL.indexOf("/");
    50. int end = requestURL.lastIndexOf(".");
    51. //截取
    52. String requestName = requestURL.substring(start, end);
    53. //3.根据请求路径名获取对应的子控制器类Action
    54. Action action = actions.get(requestName);
    55. //4.将请求委托给具体的子看着器类Action去处理
    56. action.execute(req, resp);
    57. }
    58. }

    8)  启动Tomcat,运行helloAction.action 


       案例2:演示完成的MVC流程,form表单提交数据,进行逻辑处理后将结果返回页面显示
         1)在ActionServlet中的init方法中添加             

    action.put('/AddAction',new AddAction());

         2)创建AddAction继承抽象类Action,重写execute方法,处理逻辑后,返回结果,同时创建一个相加页面和结果页面

            add.jsp

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>Insert title heretitle>
    8. head>
    9. <body>
    10. <form action="addAction.action" method="post">
    11. num1:<input type="text" name="num1"/><br/>
    12. num2:<input type="text" name="num2"/><br/>
    13. <input type="submit" value="+"/>
    14. form>
    15. body>
    16. html>

            AddAction.java

    1. package com.zking.mvc.action;
    2. import java.io.IOException;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import com.zking.mvc.framework.Action;
    7. public class AddAction extends Action {
    8. @Override
    9. public String execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    10. Integer num1 = Integer.parseInt(req.getParameter("num1"));
    11. Integer num2 = Integer.parseInt(req.getParameter("num2"));
    12. int rs = num1+num2;
    13. //将结果存储到request作用域中
    14. req.setAttribute("rs", rs);
    15. //跳转路径
    16. req.getRequestDispatcher("/rs.jsp").forward(req, resp);
    17. }
    18. }

             rs.jsp

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>Insert title heretitle>
    8. head>
    9. <body>
    10. 结果:${rs }
    11. body>
    12. html>

     

     

  • 相关阅读:
    C++ STL 序列式容器(二)
    拼多多API_获得搜索词推荐
    MQ通道接收端绑定步骤
    springmvc-controller&视图层配置&SpringMVC处理请求的流程
    [干货满满] 三年经验前端的面试经验分享
    新库上线 | CnOpenData 新三板公司专利及引用被引用数据
    idea常用快捷键
    2022年4月10日--使用C#迈出第一步--使用C#从.NET类库调用方法(没看懂)
    IT廉连看——Uniapp——配置文件pages
    为什么直接用int转换 字符串内为小数类型的变量,会报错?直接转换失败?如何解决?
  • 原文地址:https://blog.csdn.net/m0_61911999/article/details/125992903