现在web开发基本都是MVC的架构了,struts、springMvc 等等。其中一个重要的功能就是将客户发起的请求,分发至我们定义的Action里面的方法之中。

闲暇之余,我也做了一个类似于spring的方式,在Action中配置注解RequestMapping,将前端的请求分发至action的方法中。实现的过程还是比较简单的。

1. 实现url映射的注解

2. 在servlet容器启动时,解析配置当中所有的模块。解析模块中的所有方法。将对应的URL以及处理方法保存起来。

3. 在servlet处理请求时,取得请求的servlet容器,然后从保存的URL映射中取处理的类和方法。如果没有则404,如果有则调用该方法处理。

4.然后根据方法的返回值,返回响应的jsp页面。

代码非常简陋,只是为了弄懂如何通过注解实现URL映射。源码:YMvc

demo的效果如下:

Action中配置:

/**
 *
 * @author yingzi.zhu
 */
@RequestMapping("/my")
public class MyAction {
    
    @RequestMapping("/sayHello")
    public String add(HttpServletRequest request, HttpServletResponse response){
        request.setAttribute("param", "Hello, everyone");
        return "hello";
    }
        
}

web.xml中的配置如下:

    <servlet>
        <servlet-name>yservlet</servlet-name>
        <servlet-class>org.yz.mvc.action.YServlet</servlet-class>
        <init-param>
            <param-name>entrance</param-name>
            <param-value>org.yz.mvc.MainModule</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>yservlet</servlet-name>
        <url-pattern>*.test</url-pattern>
    </servlet-mapping>

其中 org.yz.mvc.MainModule 为主入口,作用是通过@YMvc注解,标记模块。

/**
*
* @author yingzi.zhu
*/
@YMvc(MyAction.class)
public class MainModule { }

hello.jsp。测试Action中的返回,从Request中取值。在页面显示。

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1><%= request.getAttribute("param") %></h1>
    </body>
</html>

最后的显示结果。

整个映射过程还是比较简单的。只需要在web.xml中进行servlet配置,然后在入口中配置要加载的Action。然后在Action中配置匹配的路径。

实现的思路是:

1. 在servlet类中,获取web.xml中配置的入口模块

2. 在入口模块中解析注解 @YMvc 的内容。

3. 根据解析的内容继续解析 配置了URL映射的模块,分别解析类名的注解以及方法的注解

4. 将注解以及处理类存放在map里面。如 前面demo中的  (/my/sayHello, MyAction, add)

5. 在servlet有请求时,解析请求的路径,从map中取匹配

6. 配置到了,则调用Java类的反射机制,来执行配置的方法。获取方法的返回值

7. 将使用请求转发,将请求转发至 方法的返回值。

MVC框架的实现的更多相关文章

  1. 开源:Taurus.MVC 框架

    为什么要创造Taurus.MVC: 记得被上一家公司忽悠去负责公司电商平台的时候,情况是这样的: 项目原版是外包给第三方的,使用:WebForm+NHibernate,代码不堪入目,Bug无限,经常点 ...

  2. 编写自己的PHP MVC框架笔记

    1.MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). ...

  3. 转 10 个最佳的 Node.js 的 MVC 框架

    10 个最佳的 Node.js 的 MVC 框架 oschina 发布于: 2014年02月24日 (33评) 分享到:    收藏 +322 Node.js 是一个基于Chrome JavaScri ...

  4. 制作自己的MVC框架(一)——简单粗暴的实现

    现在市面上有很多成熟的MVC框架,可以拿来直接用,但自己造一下轮子其实也挺有意思的. 下面先来看个最简单粗暴的MVC实现. 5个文件就能实现最简单的MVC,在Apache中设置一个虚拟目录,配置个简单 ...

  5. 分享一实战性开源MVC框架<Linux、Windows跨平台开发so easy>

    一.引子   开源地址 https://github.com/564064202/Moon.Mvc 欢迎加入开发 .NET Core微软还在发力,但作为商用还有一段距离,很多开发库尚不能用于.NET ...

  6. 产品前端重构(TypeScript、MVC框架设计)

    最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容. 公司期望把某一管理类信息系统从项目代码中抽取.重构为一个可复用的产品.该系统的前端是基于 ExtJs 5 进行构造的, ...

  7. 请求如何进入ASP.NET MVC框架

    一.前言 对于WebForm开发,请求通常是一个以.aspx结尾的url,对应一个物理文件,从代码的角度来说它其实是一个控件(Page).而在MVC中,一个请求对应的是一个Controller里的Ac ...

  8. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

  9. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

  10. MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)

    前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...

随机推荐

  1. STS(spring tool suite)修改默认编码

    安装STS后首先要做的修改默认编码: 1.windows--perferences--general--workspace,Text file encoding设置成utf-8 2.windows-- ...

  2. Python的主要应用领域及应用场景

    参考链接:https://www.cnblogs.com/kaid/p/9016673.html 正文: Python简介 Python(英国发音:/ˈpaɪθən/美国发音:/ˈpaɪθɑːn/), ...

  3. SharePoint 2013 设置 显示详细错误信息 修改位置总结

    以80端口为例—— 1.修改:C:\inetpub\wwwroot\wss\VirtualDirectories\80\web.config文件配置 CallStack="false&quo ...

  4. 毕业设计 python opencv实现车牌识别 形状定位

    主要代码参考https://blog.csdn.net/wzh191920/article/details/79589506 GitHub:https://github.com/yinghualuow ...

  5. springMVC从前端接受boolean类型的属性失败的问题

    springMVC从前端接收到的实体又一个boolean类型的属性,发现不管前端怎么操作,后台接收到的值都是false. 问题出现原因: eclipse在给实体属性生成getter和setter的时候 ...

  6. codeforces之4.1学习记录

    记录一些之前没见过的代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; #define INF ...

  7. 14-----BBS论坛

    BBS论坛(十四) 14.1注册完成跳到上一个页面 (1)front/form.py # front/forms.py __author__ = 'derek' from ..forms import ...

  8. Win 10 Enable .net framework 3.5 error (Error code:0x800F081F )

    在下面页面enable .net frramwork 3.5时,发生0x800F081F错误. 解决方案: 1. 在如下链接下载Win10 版的microsoft-windows-netfx3-ond ...

  9. xml和json互转

    开发过程中有些时候需要把xml和json互转,如某钱X接口入参和出参都是xml格式的,十分蛋疼.特写下面工具类,以留用. 需要引用jar: <!-- https://mvnrepository. ...

  10. Zookeeper---初识

    1.Zookeeper是  Apache开源  的 分布式应用程序   服务治理: 在分布式环境中 协调和管理服务 是一个复杂的过程: ZooKeeper通过其简单的架构和API解决了这个问题: Zo ...