_

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

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

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. 使用awk处理文本

    http://blog.wuxu92.com/using-awk/ 在Liux下我们经常需要对一些文本文档做一些处理,尤其像从日志里提取一些数据,这是我们一般会用awk工具和sed工具去实现需求,这里 ...

  2. Spark SQL 函数全集

    org.apache.spark.sql.functions是一个Object,提供了约两百多个函数. 大部分函数与Hive的差不多. 除UDF函数,均可在spark-sql中直接使用. 经过impo ...

  3. Linux下搭建redis服务器

    1.redis需要gcc的编译环境,在线安装gcc:#  yum install gcc-c++ 2.上传redis的压缩包到Linux系统,解压 3.进入源码目录,编译(注意要有makefile), ...

  4. 强制SVN上传代码时添加日志

    因SVN不能像Git一样,审核代码之后才合入到主版本.为了使开发人员养成良好的上传习惯,强制要求上付时必须写明上传内容. 可以通过以下方法设置 1,在SVN服务器上找到源码仓库路径,找到下面文件夹:C ...

  5. 【LeetCode每天一题】Swap Nodes in Pairs

    Given a linked list, swap every two adjacent nodes and return its head. You may not modify the value ...

  6. selenium python3

    安装pip3 install selenium 查看版本pip3 show selenium 安装后还是提示找不到相应的模块 Mac安装PyCharm后,将已有工程导入,之前使用Mac终端执行脚本时正 ...

  7. [LeetCode] 504. Base 7_Easy tag: Math

    Given an integer, return its base 7 string representation. Example 1: Input: 100 Output: "202&q ...

  8. [LeetCode] 492. Construct the Rectangle_Easy tag: Math

    For a web developer, it is very important to know how to design a web page's size. So, given a speci ...

  9. Hybrid设计--核心交互

    普通网页中跳转使用a标签,这里我们要对跳转进行更多的干预,所以将全站的跳转收口到框架层,用forward去实现.拒绝用a和window.location.如果我想对所有跳转做一个处理,开动画或者对跳转 ...

  10. Oracle推进SCN系列:使用oradebug在mount状态下推进SCN

    环境:RHEL 6.5(x86-64) + Oracle 11.2.0.4 声明:推进SCN属于非常规恢复范畴,不建议非专业人员操作,否则后果自负. 需求:我这里演示下推进SCN 10W数量级,实际需 ...