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,在浏览器中输入:

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

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

  1. JavaWeb之搭建自己的MVC框架

    https://blog.csdn.net/anita9999/article/details/83378111 自己写一个mvc框架吧(一) https://www.cnblogs.com/heba ...

  2. JavaWeb之搭建自己的MVC框架(一)

    1. 介绍 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的 ...

  3. JavaWeb之搭建自己的MVC框架(三)

    1. 前言         在前两节的内容中,我们完成了一个基本的框架搭建.但是如果我们在前端请求中增加参数,我们要怎么传递到后台方法呢?接下来我们就来研讨这部分内容. 2. 实现         ( ...

  4. 使用PHP搭建自己的MVC框架

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

  5. IceMx.Mvc 我的js MVC 框架 二、视图的数据绑定

    介绍 本人菜鸟,一些自己的浅薄见解,望各位大神指正. 本框架有以下优点 1.简单(调用简单.实现简单.不过度设计) 2.视图.控制器.模型分离(分离对于维护十分有必要) 3.组件化(每一个mvc模块儿 ...

  6. VueJS搭建简单后台管理系统框架 (二) 模拟Ajax数据请求

    开发过程中,免不了需要前台与后台的交互,大部分的交互都是通过Ajax请求来完成,在服务端未完成开发时,前端需要有一个可以模拟Ajax请求的服务器. 在NodeJs环境下,通过配置express可访问的 ...

  7. 自定义MVC框架(二) -基于XML文件

    1.oracle的脚本 create table STUDENT ( sid NUMBER primary key, sname ), age NUMBER, pwd ) ) create seque ...

  8. IOC+EF+Core项目搭建IOC注入及框架(二)

    配置ServiceCollection /// <summary> /// 表示IServiceCollection的扩展 /// </summary> public stat ...

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

    由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关j ...

随机推荐

  1. POJ 3259:Wormholes bellman_ford判定负环

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 37906   Accepted: 13954 Descr ...

  2. ssm web.xml文件解析

    转   以下为web.xml的配置<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:x ...

  3. package报错

    java类的第一行package 包路径 package报错 jdk版本不一致 或者jar包冲突

  4. 剑指offer 按之字型顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推.   使用两个栈进行存储,我们在打印某一行节点 ...

  5. 【WPF学习】第二十二章 文本控件

    WPF提供了三个用于输入文本的控件:TextBox.RichTextBox和PasswordBox.PasswordBox控件直接继承自Control类.TextBox和RichTextBox控件间接 ...

  6. 004-for循环输出

    <?php for ($counter = 1; $counter <= 6; $counter++) //循环6次 { print("<B>counter is $ ...

  7. 安装mysql server5.5 到start service未响应解决方法

    打开C盘,然后修改    "组织"  =>  "查看"(如下图)  里面的  "隐藏受保护的操作系统文件"  (系统这是会弹出警告,不 ...

  8. 吴裕雄--天生自然java开发常用类库学习笔记:多对多关系范例

    import java.util.List ; import java.util.ArrayList ; public class Course{ private String name ; priv ...

  9. SDRAM调试总结

    SDRAM的调试总结 1 说明 实验平台: JZ2440 CPU: S3C2440 SDRAM型号: EM63A165TS-6G   2 SDRAM的一些基本概念 2.1 引脚分配   2.2 引脚描 ...

  10. G - Traffic

    vin is observing the cars at a crossroads. He finds that there are n cars running in the east-west d ...