搭建一个简单的MVC框架

article/2025/9/13 2:40:08

背景

为何要用MVC框架?首先我们知道不用框架的话,在javaweb项目中每个请求都要写一个servlet,并且要在web.xml中对每个servlet类的映射作配置,不方便开发,因此引入MVC框架。

工作原理

简单的说MVC框架就是为了简化开发,在service中初始化配置文件获取到请求地址与对应servlet类的映射关系,通过反射和注解等技术动态获取到对应的类和方法,从而对不同的请求作出不同的响应。

看图说话:

根据图中示意介绍一下流程(带源码):

1.首先写一个公共的servlet类:DispatcherServlet,所有请求过来都用它做处理,同时在web.xml中配置它:

2.类继承自HttpServlet,重现两个方法,其中init方法加载配置文件,读取并保存到一个映射池中;service方法获取用户请求地址,并在池中找到对应方法,通过反射机制获取对应类和方法进行相应的处理并返回结果。

@WebServlet(name = "DispatcherServlet", value = "/DispatcherServlet")
public class DispatcherServlet extends javax.servlet.http.HttpServlet  {@Overridepublic void init(ServletConfig config) throws ServletException {//获取配置文件名称并读取配置文件String  path = config.getInitParameter("contentConfigLocation");InputStream is = DispatcherServlet.class.getClassLoader().getResourceAsStream(path);HandlerMapping.load(is);}@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取请求uriString uri = req.getRequestURI();HandlerMapping.MVCMapping mapping=HandlerMapping.get(uri);if (mapping==null){resp.sendError(404,"自定义MVC:映射地址不存在"+uri);return;}Object obj=mapping.getObj();Method method=mapping.getMethod();Object result=null;try {result=method.invoke(obj,req,resp);} catch (IllegalAccessException e){e.printStackTrace();} catch (InvocationTargetException e){e.printStackTrace();}switch (mapping.getType()){case TEXT:resp.getWriter().write((String) result);break;case VIEW:resp.sendRedirect((String) result);}}
}

3.编写映射池对象:HandlerMapping

成员变量data用于保存请求地址和对应的MVCMapping(一个自定义的对象,用于保存每个地址对应的一个类、方法和注解方式);

成员函数get()通过用户输入的地址获取对应的MVCMapping;

成员函数load() 用于加载配置文件,并将其保存到hashmap中;

public class HandlerMapping {private static Map<String,MVCMapping> data=new HashMap<>();public static MVCMapping get(String uri){return data.get(uri);}//根据用户传入的地址获取到对应的方法public static void load(InputStream is){Properties ppt=new Properties();try {ppt.load(is);} catch (IOException e) {e.printStackTrace();}//获取类Collection<Object> values=ppt.values();for (Object obj:values){String  classname=(String) obj;//类名称//通过反射加载类try {//加载每个类Class c=Class.forName(classname);//创建类对象Object cobj=c.getConstructor().newInstance();//获取方法Method[] methods=c.getMethods();for (Method m:methods){//获取该方法中所有注解Annotation[] as=m.getAnnotations();if(as!=null) {for (Annotation ann:as){if (ann instanceof ResponseBody) {//instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回falseMVCMapping mapping=new MVCMapping(cobj,m,ResponseType.TEXT);//生成一个映射器包括类对象、方法和注解类型Object o=data.put(((ResponseBody) ann).value(),mapping);if (o!=null){throw new RuntimeException("请求地址重复:"+((ResponseBody) ann).value());}}else if (ann instanceof ResponseView){MVCMapping mapping=new MVCMapping(cobj,m,ResponseType.VIEW);Object o=data.put(((ResponseView) ann).value(),mapping);if (o!=null){throw new RuntimeException("请求地址重复:"+((ResponseView) ann).value());}}}}}} catch (Exception e) {e.printStackTrace();}}}public static class MVCMapping{private Object obj;//对象:映射器中包含了大量的网址与方法的关系,每个对象封装了一个方法用于处理请求private Method method;//方法private ResponseType type;//枚举:分别处理不同的注解public MVCMapping() {}public MVCMapping(Object obj, Method method, ResponseType type) {this.obj = obj;this.method = method;this.type = type;}public Object getObj() {return obj;}public void setObj(Object obj) {this.obj = obj;}public Method getMethod() {return method;}public void setMethod(Method method) {this.method = method;}public ResponseType getType() {return type;}public void setType(ResponseType type) {this.type = type;}}
}

MVCMaping对象用于保存类、对象和注解方式,分别提供了get和set方法。

4.定义注解:

这里设置两个注解,一个给用户返回处理结果字符串类型,另一个返回页面跳转地址。

ResponseBody.java

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
//返回一个值或数据
public @interface ResponseBody {String value();
}

ResponseView.java 

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
//返回一个跳转的页面
public @interface ResponseView {String value();
}

ResponseType.java 

public enum ResponseType {TEXT,VIEW;
}

5.写处理各种请求的类和方法,例如:

public class UserController {@ResponseBody("/login.do")public String login(HttpServletRequest req, HttpServletResponse resp){return "登陆成功";}@ResponseView("/reg.do")public String reg(HttpServletRequest req, HttpServletResponse resp){return "success.jsp";}
}

6.配置文件:

application.properties:左边自己定义右边写对应的类

a=com.lxj.controller.UserController

7.over

一个最简单的MVC框架写完了。

最后

以上内容是个人自己理解后的总结,如有不对或疑问请大神批评指正。


http://chatgpt.dhexx.cn/article/XCxpc6aC.shtml

相关文章

Android MVC框架

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、MVC是什么&#xff1f;二、写个简单的例子1.bean2.callback3.interfaces4.model5.ui 优缺点总结 前言 提示&#xff1a;很多教程讲解框架感觉都像说天书一…

MVC框架之SpringMVC

简介 Spring MVC 是 Spring 给我们提供的⼀个⽤于简化 Web 开发的框架。在说Spring MVC前&#xff0c;我们需要了解下什么是MVC架构以及三层架构&#xff1f; 1 MVC 体系结构 三层架构 在 JavaEE 开发中&#xff0c;⼏乎全都是基于 B/S 架构的开发。那么在 B/S 架构中&…

MVC架构简单介绍

一&#xff1a;MVC架构简介 MVC是Model&#xff08;模型&#xff09;view&#xff08;视图层&#xff09;controller&#xff08;控制器&#xff09;这三者的缩写。 在百度百科中是这样介绍的&#xff1a;MVC强制性地使应用程序的输入、处理和输出分开。使用MVC应用程序被分成…

MVC框架详解(资源整理)

一、什么是MVC&#xff1f; MVC是三个单词的首字母缩写&#xff0c;它们是Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;和Controller&#xff08;控制&#xff09;。 1、视图 视图(View)代表用户交互界面&#xff0c;对于Web应用来说&#x…

MVC框架

MVC框架 MVC框架——一个理论框架&#xff01;&#xff01;&#xff01;前言——必看1 经典MVC框架2 经典mvc模式就是jspservletJavaBean3 JavaBean4 实际MVC框架应用5 总结 MVC框架——一个理论框架&#xff01;&#xff01;&#xff01; 注意&#xff1a;mvc框架只是理论上的…

dojo介绍

dojo是目前最为强大的js框架&#xff0c;包括ajax,browser,event,widget等跨浏览器API&#xff0c;用dojo写Web OS可谓非常方便。 dojo现在已经4.0了&#xff0c;我自己其实不怎么用dojo&#xff0c;毕竟dojo强大的地方在于界面和特效的封装&#xff0c;可以让开发者快速构建一…

(2)Dojo学习之模块化

引言Dojo之模块化 1定义模块2调用模块3解释dojoConfig的全局变量 总结 1本篇博客代码下载地址Dojo模块化 1.引言 在本篇博客中主要讲解一下如何在dojo中使用模块&#xff0c;如何自定义自己的模块等等&#xff0c;在使用dojo编程的时候&#xff0c;大家一定要转变自己的思想&a…

Dojo 1.6 官方教程: 创建自定义Dojo小部件(Widget)

在这个教程中&#xff0c;我们将会演示如何利用Dojo 和Dijit框架来创建自定义的小部件。 主要会使用到dijit._Widget 和dijit._Templated 基类和mixin。 对dijit框架的基础知识&#xff0c;可以参看前两篇教程 难度&#xff1a;中等 适用Dojo版本&#xff1a; 1.6 作者&#xf…

(3)Dojo学习之Class

引言dojo中的类 1创建一个简单的类2类和模块结合使用3关于类的继承 需求 1需求一2需求二很重要21代码实现22程序出错23程序运行3 需求三 再次介绍require加载模块总结 1本博客代码的下载地址dojo_class 1.引言 说到面向对象&#xff0c;我们就不得不提一下类&#xff0c;在原生…

探索dojo/json

难度&#xff1a;中等 Dojo版本&#xff1a;1.7 原作者&#xff1a;Kris Zyp 译者&#xff1a;Oliver (zhuxw1984gmail.com) 原文链接&#xff1a;http://www.sitepen.com/blog/2012/09/21/exploring-dojojson/ &#xff08;年初翻译过Kris Zyp的另一篇介绍dojo/json的文章&…

dojo是什么?

现在Web端vue、React、Angular大行其道&#xff0c;安卓端js也有React Native等&#xff0c;那么学习dojo有什么意义呢&#xff1f; 有些老的项目还是用的dojo。。。。例如arcgis javascript api等等 https://dojotoolkit.org/documentation/tutorials/1.10/hello_dojo/ 为什…

Dojo入门篇

Dojo是一个JavaScript实现的开源DHTML工具包&#xff0c;Dojo最初的目标是解决开发HTML应用程序中遇到的一些长期存在的问题&#xff0c;然而现在Dojo已经成为了开发RIA应用程序的利器。 Dojo让Web页面具有动态能力&#xff0c;我们可以在其他支持JavaScript的环境中使用Dojo。…

dojo中的类

使用arcgis api for js 4.*进行地图的web前端开发&#xff0c;就不得不与dojo打交道。dojo是一个框架&#xff0c;自成体系&#xff0c;比如它对类的支持&#xff0c;有自己的一套。众所周知&#xff0c;js不是面向对象语言&#xff0c;没有类这一说&#xff0c;都是用函数来模…

dojo学习教程

Dojo 作为最著名的 Ajax 开源项目之一&#xff0c;不仅让 Web 程序员可以免费获得和使用其框架进行 Web 应用的开发&#xff0c;更吸引了大量的开发者对其不断的扩充&#xff0c;开发新的组件。DojoX 就是在这样的开发社区中产生的。DojoX 是一组基于 dojo 的开源项目的集合&am…

Dojo与jQuery综合比较分析

最近Dojo和jQuery双双发布了最新的1.8版本,有着相同版本号的两个Javascript库也有许多核心的相同之处:相同的资源加载机制AMD、相同的选择器 引擎Sizzle等。作为业界知名的Javascript库,Dojo和jQuery在各自领域有着为数众多的拥护者。不过正所谓一把钥匙开一把锁,对一个项目…

Dojo简述

Dojo是一个JavaScript实现的开源DHTML工具包。Dojo的最初目标是解决开发DHTML应用程序时遇到的一些长期存在的历史问题。 【注&#xff1a;DHTML是一种使HTML页面具有动态特性的艺术。DHTML是一种创建动态和交互WEB站点的技术集合。对大多数人来说&#xff0c;DHTML意味着HTML…

ibatis简介

背景 介绍ibatis实现之前&#xff0c;先来看一段jdbc代码: Class.forName("com.mysql.jdbc.Driver"); String url "jdbc:mysql://localhost:3306/learnworld"; Connection con DriverManager.getConnection(url, "root","learnwo…

Ibatis使用

部分参考&#xff1a;https://blog.csdn.net/shixiaoguo90/article/details/49949445 Apache iBatis是当前IT项目中使用很广泛的一个半自动ORM框架&#xff0c;区别于Hibernate之类的全自动框架&#xff0c;iBatis对数据库的操作拥有更加灵活的控制&#xff0c;对于那些经常需…

iBatis-iBatis配置环境(eclipse+mysql)

在使用JAVA框架前要配置其环境&#xff0c;比如使用Hibernate、Struts等都需要对其环境进行配置&#xff0c;当然使用iBatis开发之前&#xff0c;也需要配置iBatis环境。 一、iBatis环境的配置只需三步 1.引入jar包 2.配置sqlMapConfig.xml文件 3.配置SqlMap.xml文件 二、概览i…

什么是IBatis

什么是IBatis 我一直想写一篇关于持久化数据访问的文章&#xff0c;可是我不知道怎么开始介绍&#xff0c;前两天晚上睡觉的时候突然有了一些开始写的想法&#xff0c;所以我决定今天动手开始写一点东西。头一次写这样的文章&#xff0c;希望大家不要见怪。 现在网上很多人学习…