目录
一、前言
继承上篇文章:自定义MVC(上)__Leaf1217的博客-CSDN博客
我们在上篇文章编写了自定义MVC框架,
但是却并不完善,这篇文章就是来接着完善我们自定义框架,
我们首先抛出今天要完善的几个目标点!
<!--
优化点:
1、实现中央控制器动态加载存储子控制器;
2、优化在我们前台传递参数后的封装代码;
3、优化方法执行后要重定向还是转发;
4、实现框架的配置文件名可以修改。
-->
二、实现中央控制器动态加载存储子控制器
2.1 利用建模的知识编写好配置文件
/**
* 通过建模可以知道,最终configModel对象会包含config.xml中的所有子控制器信息
* 同时为了解决中央控制器能够动态加载子控制器的信息,* 那么我们只需要引入configModel对象即可
*/
这个建模的相关资料在我前面的文章:XML建模__Leaf1217的博客-CSDN博客
不会的可以先去参考一下再来噢~
这里就不重复放过多的资料了,直接把之前的config的相关类直接复制一份到当前MVC的包下。
就放上需要改动一点的XML文件吧:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<action path="/Book" type="com.leaf.servlet.BookAction">
<forward name="failed" path="/reg.jsp" redirect="false" />
<forward name="success" path="/login.jsp" redirect="true" />
</action>
</config>
这里吧action的path值改为了我们的测试MVC的实体类/Book,type改成请求的action全路径名。
2.2 封装configModel类并调用工厂的方法给他赋值
我们先封装一个configModel属性:
private ConfigModel configModel;
然后调用工厂类ConfigModelFactory的方法给模型configModel赋值,
从而改变子控制器定死,需要手动添加的问题:
@Override
public void init() throws ServletException {
//这里是请求的servlet,暂时定死,下篇文章进行优化。
//actions.put("/Book", new BookAction());
try {
configModel = ConfigModelFactory.bulid();
} catch (Exception e) {
e.printStackTrace();
}
}
2.3 拿到配置文件中的全路径名,反射实例化。
//相比于上一种从Map集合获取控制器,当前需要获取config.xml中的