JavaWeb之搭建自己的MVC框架(二)

1. 前言

JavaWeb之搭建自己的MVC框架(一) 中我们完成了URL到JAVA后台方法的最基本跳转。但是实际操作中会发现有一个不方便的地方,现在在com.mvc.controller包中只有一个SayController类,如果我们想增加一个新的***Controller类,我们还需要到UrlMappingCollection中修改controllerList属性,这样是不合理的。

所以我们在这一节中要将这种耦合解除掉。我们要将UrlMappingCollection中controllerList提到xml配置文件中。

2. 准备Jar包

在这一节里我们需要用dom4j来解析xml文件。当然你也可以用其他工具来解析xml。

3. 实现

(1)首先我们要在web.xml中记录下我们将来需要扫描的controller列表:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <listener>
        <listener-class>com.mvc.listener.UrlMappingCollection</listener-class>
    </listener>    

    <mymvc>
        <controllers>
            <controller>com.mvc.controller.SayController</controller>
        </controllers>
    </mymvc>                    

    <servlet>
        <servlet-name>main</servlet-name>
        <servlet-class>com.mvc.servlet.ServletCenter</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>main</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

其中,mymvc节点及其子节点就是我们在本节中新增的节点。

(2)然后我们调整UrlMappingCollection这个类,来读取web.xml中新增的mymvc节点内容。

package com.mvc.listener;

import java.io.File;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.mvc.annotation.URLMapping;
import com.mvc.base.MVCBase;

public class UrlMappingCollection implements ServletContextListener {
    //被注解了URLMapper的类方法列表
    private static List<MVCBase> mvcBases;

    private final String MyMVC_NodeName = "mymvc";
    private final String ControllerList_NodeName = "controllers";
    private final String Control_NodeName = "controller";

    //我们要扫描的Controller列表
    @SuppressWarnings("unchecked")
    private List<String> getControllerList(ServletContextEvent sce) throws DocumentException{
        List<String> ctrlList = new ArrayList<String>();
        String webxml = sce.getServletContext().getRealPath("WEB-INF\\web.xml");
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(new File(webxml));
        Element rootElement = document.getRootElement();
        List<Element> crtlNodeList = rootElement.element(MyMVC_NodeName).
                                                 element(ControllerList_NodeName).
                                                 elements(Control_NodeName);
        for (Element element : crtlNodeList) {
            ctrlList.add(element.getText());
        }
        return ctrlList;
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // TODO Auto-generated method stub
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        mvcBases = new ArrayList<MVCBase>();
        try {
            List<String> controllerList = getControllerList(sce);
            //循环所有需要扫描的Controller
            for (int i = 0; i < controllerList.size(); i++) {
                String controllerName = controllerList.get(i); 

                String classURL = "";
                String methodURL = "";

                Class<?> clazz = Class.forName(controllerName); //获取Controller类
                if (clazz.isAnnotationPresent(URLMapping.class)) { //class被标记了URLMapping注解
                    classURL = ((URLMapping) clazz.getAnnotation(URLMapping.class)).url();
                }
                //获取method列表
                Method[] methods = clazz.getMethods();
                for (Method method : methods) {
                    if (method.isAnnotationPresent(URLMapping.class)) { //method被标记了URLMapping注解
                        methodURL = ((URLMapping) method.getAnnotation(URLMapping.class)).url(); 

                        MVCBase mvcBase = new MVCBase();
                        mvcBase.setUrl(classURL+methodURL);
                        mvcBase.setController(controllerName);
                        mvcBase.setMethod(method.getName());

                        mvcBases.add(mvcBase);
                    }
                }
            }
        }
        catch (Exception e) {

        }
    }

    public static List<MVCBase> getMvcBases() {
        return mvcBases;
    }

}

我们增加了getControllerList函数来读取web.xml中的配置信息,然后把controller列表读取出来,其他地方稍作修改,读着可对比上一节中此处代码来观察做了哪些修改。

4. 测试效果:

首先,我们需要增加一个新的controller:

package com.mvc.controller;

import com.mvc.annotation.URLMapping;

@URLMapping(url="/Eat")
public class EatController {

    @URLMapping(url="/Apple")
    public String EatApple(){
        System.out.println("I‘m eating apples");
        return "Apple";
    }

    @URLMapping(url="/Banana")
    public String EatBanana(){
        System.out.println("I‘m eating Banana");
        return "Banana";
    }
}

然后,调整web.xml,增加com.mvc.controller.EatController:

    <mymvc>
        <controllers>
            <controller>com.mvc.controller.SayController</controller>
            <controller>com.mvc.controller.EatController</controller>
        </controllers>
    </mymvc>

最后,我们启动tomcat,在浏览器中输入:

看看是否能打印出我们想要的结果。

时间: 2024-08-06 20:05:49

JavaWeb之搭建自己的MVC框架(二)的相关文章

搭建基于spring MVC框架 + RESTful架构风格技术总结

实战篇: 在SpringMVC框架中搭建RESTful架构风格来完成客户端与服务器端的低耦合度.可扩展性.高并发与大数据流量的访问. 用RESTful架构的创建步骤: 1.创建一个全新的Web工程 2.导包,导入所需要的所有第三方jar包.(springMVC+Hibernate的基本包是必须的) 3.作配置,针对不同的项目需求和不同的搭建设计,开发人员可以按照自己的编码风格来设计符合项目开发具体 应该用多少篇配置文件.但是这几篇配置文件是必不可少的: 3-1.web.xml配置文件:最基本的配

使用PHP搭建自己的MVC框架

一.什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能.除此之外,此模式通过对复杂度的简化,使程序结构更加直观.软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能.专业人员可以通过自身的专长分组: (控制器Controlle

Spring MVC 框架的架包分析,功能作用,优点

由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关jar的作用.关系.这篇文章总结一下spring框架的相关知识. 一.spirng的简介(高手可以跳过) Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的

Spring MVC 框架搭建及详解

一.Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar.spring-webmvc.jar.commons-logging.jar.cglib-nodep-2.1_3.jar Hibernate 3.6.8:hibernate3.jar.hibernate-jpa-2.0-api-1.0.1.Final.jar.antlr-2.7.6.jar.commons-collections-3

Spring MVC 框架搭建及具体解释

如今主流的Web MVC框架除了Struts这个主力 外.其次就是Spring MVC了,因此这也是作为一名程序猿需要掌握的主流框架.框架选择多了.应对多变的需求和业务时,可实行的方案自然就多了. 只是要想灵活运用Spring MVC来应对大多数的Web开发,就必需要掌握它的配置及原理. 一.Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar.spring-webmvc.jar.com

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

前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个更加清晰的认识. 本文原创地址:http://www.cnblogs.com/landeanfen/p/6000978.html 这篇博主打算从零开始一步一步来加上MVC里面用到的一些技术,整篇通过三个版本,逐步完善. 一.版本一:搭建环境,实现MVC请求 通过上篇的介绍,我们知道,MVC里面两个最

Spring MVC框架搭建

Spring MVC篇一.搭建Spring MVC框架 本项目旨在搭建一个简单的Spring MVC框架,了解Spring MVC的基础配置等内容. 一.项目结构 本项目使用idea intellij创建,配合maven管理.整体的目录结构如图: 其中java文件夹是sources文件夹,resources是资源文件夹.spring文件夹里是Spring上下文配置和Spring MVC配置文件. 需要注意的是,项目自动生成以后会有两个web文件目录,一个是web文件夹(我这里已经删除了),另一个

Spring MVC篇一、搭建Spring MVC框架

本项目旨在搭建一个简单的Spring MVC框架,了解Spring MVC的基础配置等内容. 一.项目结构 本项目使用idea intellij创建,配合maven管理.整体的目录结构如图: 其中java文件夹是sources文件夹,resources是资源文件夹.spring文件夹里是Spring上下文配置和Spring MVC配置文件. 需要注意的是,项目自动生成以后会有两个web文件目录,一个是web文件夹(我这里已经删除了),另一个是默认的webapp文件夹.我这里使用默认的目录,也就是

ASP.NET MVC搭建项目后台UI框架—5、Demo演示Controller和View的交互

目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NET MVC搭建项目后台UI框架—4.tab多页签支持 ASP.NET MVC搭建项目后台UI框架—5.演示Controller和View的交互 这一节,我将用一个Demo来演示在此UI框架中,控制器和视图的交互.以渠道管理为例.效果图如下: 这里我使用了基于jquery的模态窗体组件lhgdialo