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. CodeForces - 876D Sorting the Coins

    题意:有n个数的序列,n个数都为0,每次指定某个数变为1,当序列中第i个数为1,第i+1个数为0时,这两个数可交换,将序列从头到尾进行一次交换记为1次,直到某一次从头到尾的交换中没有任何两个数交换.序 ...

  2. VUE - 取消默认事件

    1,在 methods 中 <template>   <div>       <form @submit="addTodo">          ...

  3. 文本情感分析(二):基于word2vec、glove和fasttext词向量的文本表示

    上一篇博客用词袋模型,包括词频矩阵.Tf-Idf矩阵.LSA和n-gram构造文本特征,做了Kaggle上的电影评论情感分类题. 这篇博客还是关于文本特征工程的,用词嵌入的方法来构造文本特征,也就是用 ...

  4. IDEA中利用MAVEN制作和打包普通可执行应用(非SprintBoot的WEB应用)

    我使用IDEA也就半年,开发中常常会遇到一些问题,例如用IDEA编写普通的可执行程序: 之前使用Eclipse编写一个可执行的JAVA程序,然后导出打包,非常方便: 但是我呢,想在 IDEA 中用Ma ...

  5. uniapp属性插值报错Interpolation inside attributes has been removed. Use v-bind or the colon shorthand instead.

    解决方法: 因为vue 2.x不支持对属性使用插值{{}}的方式赋值,所以要使用v-bind指令(或简写“:”)来指定属性. v-bind指令 v-bind:id="item.id" ...

  6. TCP/IP 三次握手,四次断开

    TCP/IP 三次握手,四次断开 一.TCP报文格式                     TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷 本. 下面是TCP报文格式图: 图 ...

  7. Linux服务器命令大全

    快捷提示键: table 查看文件夹:  ls , ls –all ,ls –l,ll 进入某个文件夹: cd usr/local 回到root 目录 : cd /root/ 回到根目录:cd / 回 ...

  8. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-cloud

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  9. Live555研究之一 源代码编译

    Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编码格式的音视频数据的流化 ...

  10. JS - 音频的播放和暂停

        $(".gameSound").bind("click",function() {             var audio = document.g ...