_

写一个通用控制器,在开发的时候只用写模型和视图。

注:请求路径和模型的对应关系

step1.添加一个注解@RequestMapping

/**

自定义注解:用于配置请求路径和处理器的对应关系。

*/

@Retention(RetentionPolicy.RUNTIME)

//保留至运行时。所以我们可以通过反射去获取注解信息。

public @interface RequestMapping( ){//自定义注解

        public String value( );

}

step2:写一个java类(HelloController),即处理器。

/*

处理器:负责处理业务逻辑。

*/

public class HelloController{

   @RequestMapping(“/hello.do”)

    public String hello(){

        System.out.println(“HelloController的方法”);

      /*返回视图名:viewResolver会将视图名映射成对应的jsp。*/

        return  “hello”;

    }

step3:添加smartmvc.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans>

<!-- 

    配置处理器:

        class属性用于指定处理器的类名。

 -->

 <bean class="demo.HelloController"/>

</beans>

step4.写DispatcherServlet

public class DispatcherServlet extends HttpServlet {

//读取Http请求的内容?

private static final long serialVersionUID = 1L;

private HandlerMapping handlerMapping;

@Override

/**

 * 读取配置文件(smartmvc.xml),将处理器实例化,

 * 然后将这些处理器交给HandlerMapping(映射处理器)

 * 来处理。

 * 注:

 *   HandlerMapping读取处理器中的路径信息,建立

 * 请求路径与处理器的对应关系。

 */

public void init() throws ServletException{

     //利用dom4j解析配置文件

      SAXReader sax=new SAXReader();

      InputStream in=getClass().getClassLoader().

                     getResourceAsStream(“smartmvc.xml”);

      try{

         //解析配置文件

               Document doc=sax.read(in);

               //获取根元素下面的所有子元素

               List<Element> elements=root.elements( );//??

               List beans=new ArrayList( );

               for(Element ele:elements){

                      //获得处理器类名

                        String className=ele.attribute(“class”);

                        System.out.println(“className:”+className);

                        //将处理器实例化

                         Object bean=Class.forName( ).newInstance( );

                        //将处理器实例添加到集合里面

                        bean.add(bean);

                    }

                  System.out.println(“beans:”+beans);

                  }catch(Exception e){

                       e.printStackTrace();

                       throw new ServletException(e);

         //由于重写,所以重写的方法的异常不可以大于父类的异常,但这样就可以了

        //吗?这是什么处理?异常的该如何抛出来?这种用法何时用怎么用?

        //为什么这样用?

        }

     }

}

step5.写HandlerMapping


/**
* 映射处理器:
* 负责提供请求路径与处理器的对应关系。
*/
public class HandlerMapping { //存放请求路径与处理器的对应关系
private Map<String,Handler> handlerMap =
new HashMap<String,Handler>(); /**
* 依据请求路径,返回对应的Handler对象
*/
public Handler getHandler(String path){
return handlerMap.get(path);
} /**
* 负责建立请求路径与处理器的对应关系:
* 利用java反射获得处理器实例上的@RequestMapping
* 注解,然后读取该注解的属性值获得路径信息,
* 接下来,以该路径信息作为key,以处理器实例及方法
* 对象(Method对象)的封装(Handler)作为value,
* 将请求路径与处理器的对应关系存放到Map里面。
*/
public void process(List beans) {
for(Object bean : beans){
//获得class对象
Class clazz = bean.getClass();
//获得该对象的所有方法
Method[] methods =
clazz.getDeclaredMethods();
for(Method mh : methods){
//获得加在方法前的注解(@RequestMapping)
RequestMapping rm =
mh.getDeclaredAnnotation(
RequestMapping.class);
//获得注解上的路径信息
String path = rm.value();
System.out.println("path:" + path); /*
* 以请求路径作为key,以Handler对象
* 作为value,将请求路径与处理器的对应
* 关系存放到Map对象里面
*/
handlerMap.put(path,
new Handler(mh,bean)); } }
System.out.println("handlerMap:"
+ handlerMap);
}
}

==============================================================================================================

灵感来自代码,多敲,有时看得费力时候,就多敲几次,并画图,

并把细节了解清楚直到能默写。首先,看看思路,再把注释留着

代码删掉,再写一次,不会写了再看备份的代码。

(画上面的思维图,另外还有细节的思路图)

(5)如何使用SmartMVC?

step1.创建一个maven工程。

step2.导包。

在pom.xml文件中,添加如下所标配置:

<dependencies>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>

step3.拷贝base包

注: base包包含了SmartMVC的核心源代码。

step4.配置DispatcherServlet

<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>base.web.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

step5.添加处理器类

注:在方法前添加@RequestMapping注解:

@RequestMapping("/toBmi.do")
public String toBmi(){
return "bmi";
}

step6.添加jsp

注:
jsp的名称要与视图名一致。

step7.配置smartmvc.xml

注: 添加处理器的配置信息:

<beans>
<!--
配置处理器:
class属性用于指定处理器的类名。
-->
<bean class="controller.BmiController"/>
</beans>

---------------------------------------------------------------------------------------------------------------------------

思路总结:

1.@interface RequestMapping()    通过反射获得注解信息                                                                                               其实是一个路径的一个值

2.HelloController.java                  处理器,解析并返回一个视图名

3.smartmvc.xml                          指定处理器的类名

4.写一个DispatcherServlet            该servlet用dom4j解析smartmvc.xml,并用反射读取HelloController的全限定名和方法         绑定一个类               dom4j(配置文件)和反射(类和方法)

5.映射处理器                               负责提供请求路径和处理器的对应的关系,过程:用Map集合

存储请求路径和处理器的对应的关系,用反射获取注解的路径信息。                                  并用反射从类中获得注解的所对应的路径请求的信息

6.将以上文件打包到一个文件夹,并写视图文件 ,开始测试。

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

  1. .NET轻量级MVC框架:Nancy入门教程(二)——Nancy和MVC的简单对比

    在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy的优势在哪里?和微软的MVC比 ...

  2. .NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy

    当我们要接到一个新的项目的时候,我们第一时间想到的是用微软的MVC框架,但是你是否想过微软的MVC是不是有点笨重?我们这个项目用MVC是不是有点大材小用?有没有可以替代MVC的东西呢?看到这里也许你会 ...

  3. openresty 前端开发轻量级MVC框架封装一(控制器篇)

    通过前面几章,我们已经掌握了一些基本的开发知识,但是代码结构比较简单,缺乏统一的标准,模块化,也缺乏统一的异常处理,这一章我们主要来学习如何封装一个轻量级的MVC框架,规范以及简化开发,并且提供类似p ...

  4. Java Servlet开发的轻量级MVC框架最佳实践

    在Servlet开发的工程实践中,为了减少过多的业务Servlet编写,会采用构建公共Servlet的方式,通过反射来搭建轻量级的MVC框架,从而加快应用开发. 关于Servlet开发的基础知识,请看 ...

  5. 轻量级MVC框架:Nancy学习

    一.认识Nancy 今天听讲关于Nancy框架的培训,被Nancy的易用性所吸引.故晚上回来梳理了一下知识. 什么是Nancy呢?如标题所述,Nancy是一个轻量级的独立的框架: Nancy 是一个轻 ...

  6. openresty 前端开发轻量级MVC框架封装二(渲染篇)

    这一章主要介绍怎么使用模板,进行后端渲染,主要用到了lua-resty-template这个库,直接下载下来,放到lualib里面就行了,推荐第三方库,已经框架都放到lualib目录里面,lua目录放 ...

  7. 轻量级MVC框架(自行开发)

    源码及demo: https://github.com/killallspree/myFrame/

  8. JSP学习笔记(6)—— 自定义MVC框架

    仿照SpringMVC,实现一个轻量级MVC框架,知识涉及到了反射机制.注解的使用和一些第三方工具包的使用 思路 主要的总体流程如下图所示 和之前一样,我们定义了一个DispatchServlet,用 ...

  9. 开源:Taurus.MVC 框架

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

随机推荐

  1. Angular知识点

    Angular CLI 快速创建Angular 2项目和组件, 压缩打包发布. 7.创建包含html.ts.css文件的命令cd到需要创建文件的目录下面,输入如下命令 ng g c myFile 会自 ...

  2. 实习培训——Java多线程(9)

    实习培训——Java多线程(9) 很适合新手 http://www.cnblogs.com/GarfieldEr007/p/5746362.html http://www.cnblogs.com/Ga ...

  3. Windows下解压分卷压缩方法

    各种压缩分卷格式 rar分卷格式是*.part1.rar,*.part2.rar 等等. 360分卷压缩出来的文件的名字是*.zip.001.*.zip002 等等. WinZip分卷压缩出来的文件名 ...

  4. python安装pandas模块

    直接安装时报错了 localhost:~ ligaijiang$ pip3 install pandas Collecting pandas Downloading https://files.pyt ...

  5. unity3d-多媒体与网络

    1.音乐 unity3d 共支持4种音乐的格式文件 aiff:适用于较短的音乐文件,可用于游戏音效 wav:适用于较短的音乐文件,可用于游戏音效 mp3:适用于较长的音乐文件,可用于游戏音乐 ogg: ...

  6. 第六天实验详解——dedecms通过xss漏洞写马

    第六天实验详解 **XSS跨站攻击的分类** XSS漏洞类型主要分为持久型和非持久型两种: 1. 非持久型XSS漏洞一般存在于URL参数中,需要访问黑客构造好的特定URL才能触发漏洞. 2. 持久型X ...

  7. time_t time()

    time_t  atime,  btime; time(&atime); btime = time(0); 两种方式效果一样.

  8. LeetCode160.相交链表

    编写一个程序,找到两个单链表相交的起始节点. 例如,下面的两个链表: A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3 在节点 c1 开始相交. 注意: 如果两个 ...

  9. 用C#创建一个窗体,在构造函数里面写代码和在from_load事件里面写代码有什么不同?

    没太大区别.一区别就是代码加载时间先后的问题.构造函数先加载,load事件中后加载.

  10. clear/reset select2,重置select2,恢复默认

    4.0 version //方法一$('#yourButton').on('click', function() { $('#yourfirstSelect2').val(null).trigger( ...