目录

一、让中央控制器动态加载存储子控制器

二、参数传递封装优化

三、 对于方法执行结果,转发重定向优化

四、框架配置文件可变


一、让中央控制器动态加载存储子控制器

通过上篇文章中央控制器接受浏览器的请求,在其中我们使用map集合储存子控制器

    但也存在一个问题,如果有一个订单类,那我们还要加入此类

  我们通过建模的知识来解决,在配置文件中操作

中央控制器:

DispatcherServlet优化

package com.zwc.framework;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;import javax.management.RuntimeErrorException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;import com.zwc.web.BookAction;/*** 中央控制器:* 主要职能:接受浏览器请求,找到对应的处理人* @author Administrator**/
//@WebServlet("*.action")
public class DispatcherServlet extends HttpServlet{
//  private Map<String,Action> actions = new HashMap<String,Action>();/*** 通过建模我们可以知道,最终configModel对象会包含config.xml中的所有子控制器信息* 同时为了解决中央控制器能够动态加载保存子控制器的信息,那么我们只需要引入configModel对象即可*/private ConfigModel configModel;//    程序启动时,只会加载一次@Overridepublic void init() throws ServletException {
//      actions.put("/book",new BookAction());
//      actions.put("/order",new BookAction());try {
//          配置地址
//          getInitParameter拿到web.xml中的servlet信息配置的参数String configlocation = this.getInitParameter("configLocation");if(configlocation==null || "".equals(configlocation))configModel = ConfigModelFactory.bulid();elseconfigModel = ConfigModelFactory.bulid(configlocation);} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//http://localhost:8080/mvc/book.action?methodName=listString uri = req.getRequestURI();
//      要拿到book,最后一个/到最后一个.为止uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
//       Action action = actions.get(uri);
//       相比于上一种,从map集合获取子控制器,当前需要获取config.xml中的全路径名,然后反射实例化ActionModel actionModel = configModel.pop(uri);if(actionModel == null) {throw new RuntimeException("action 配置错误");}String type = actionModel.getType();
//       type是Action子控制器的全路径名try {Action action =  (Action) Class.forName(type).newInstance();
//           action是bookactionif(action instanceof ModelDrivetr) {ModelDrivetr md = (ModelDrivetr) action;
//               model指的是bookaction中bookObject model = md.getModel();
//               要给model中的属性赋值,要接受前端jsp参数    req》getparamenterMap()//                 PropertyUtils.getProperty(bean, name)从某一个对象去某一个值//              将前端所有参数值封装进实体类BeanUtils.populate(model, req.getParameterMap());}
//          正式调用方法前,book中的属性要被赋值
//           action.execute(req, resp);String result = action.execute(req, resp);ForwardModel forwardModel = actionModel.pop(result);
//           if(forwardModel==null)
//               throw new RuntimeException("forward config error");String path = forwardModel.getPath();
//           拿到是否需要转发的配置boolean redirect = forwardModel.isRedirect();if(redirect)
//               ${req.getServletContext().getContextPath()}resp.sendRedirect(req.getServletContext().getContextPath() + path);elsereq.getRequestDispatcher(path).forward(req, resp);} catch (Exception e) {e.printStackTrace();}}
}

二、参数传递封装优化

package com.zwc.web;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.zwc.entity.Book;
import com.zwc.framework.Action;
import com.zwc.framework.ActionSupport;
import com.zwc.framework.ModelDrivetr;public class BookAction extends ActionSupport implements ModelDrivetr<Book>{private Book book = new Book();private String list(HttpServletRequest req, HttpServletResponse resp) {System.out.println("在同样一个Servlet中调用list方法");return "success";}private void edit(HttpServletRequest req, HttpServletResponse resp) {System.out.println("在同样一个Servlet中调用edit方法");}private void del(HttpServletRequest req, HttpServletResponse resp) {System.out.println("在同样一个Servlet中调用del方法");  }private String add(HttpServletRequest req, HttpServletResponse resp) {String bid = req.getParameter("bid");String bname = req.getParameter("bname");String price = req.getParameter("price");Book book = new Book();book.setBid(Integer.valueOf(bid));book.setBname(bname);book.setPrice(Float.valueOf(price));
//      bookdao.add(book)System.out.println("在同样一个Servlet中调用add方法");return "failed";}private void load(HttpServletRequest req, HttpServletResponse resp) {System.out.println("在同样一个Servlet中调用load方法");}@Overridepublic Book getModel() {return book;}}

我们要解决参数过多问题

在这里我们要建一个模型驱动接口,bookaction实现该接口在中央控制器中将所有要接收的参数封装到模型接口中,从而达到简便的效果。

ModelDriver接口类

package com.zwc.framework;/*** 模型驱动接口,接受前台jsp传递的参数,并且封装到实体类中* @author Administrator** @param <T>*/
public interface ModelDrivetr<T> {
//  拿到将要封装的类实例  ModelDriver。getModel()等价于 new book()T getModel();
}

中央控制器:

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//http://localhost:8080/mvc/book.action?methodName=listString uri = req.getRequestURI();
//      要拿到book,最后一个/到最后一个.为止uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
//       Action action = actions.get(uri);
//       相比于上一种,从map集合获取子控制器,当前需要获取config.xml中的全路径名,然后反射实例化ActionModel actionModel = configModel.pop(uri);if(actionModel == null) {throw new RuntimeException("action 配置错误");}String type = actionModel.getType();
//       type是Action子控制器的全路径名try {Action action =  (Action) Class.forName(type).newInstance();
//           action是bookactionif(action instanceof ModelDrivetr) {ModelDrivetr md = (ModelDrivetr) action;
//               model指的是bookaction中bookObject model = md.getModel();
//               要给model中的属性赋值,要接受前端jsp参数    req》getparamenterMap()//                 PropertyUtils.getProperty(bean, name)从某一个对象去某一个值//              将前端所有参数值封装进实体类BeanUtils.populate(model, req.getParameterMap());}
//          正式调用方法前,book中的属性要被赋值
//           action.execute(req, resp);String result = action.execute(req, resp);ForwardModel forwardModel = actionModel.pop(result);
//           if(forwardModel==null)
//               throw new RuntimeException("forward config error");String path = forwardModel.getPath();
//           拿到是否需要转发的配置boolean redirect = forwardModel.isRedirect();if(redirect)
//               ${req.getServletContext().getContextPath()}resp.sendRedirect(req.getServletContext().getContextPath() + path);elsereq.getRequestDispatcher(path).forward(req, resp);} catch (Exception e) {e.printStackTrace();}}
}

BookAction类

三、 对于方法执行结果,转发重定向优化

Config.xml配置文件

中央控制器:

Bookaction类

Demo2jsp:

Demo3jsp:

运行结果:

点击增加标签,会调到demo3jsp

点击查询,会跳到demo2jsp

四、框架配置文件可变

当我们如果给config.xml改变名字,我们的程序就运行不了了

在我们 ConfigModelFactory中已经默认Config.xml了

我们可以在DispatcherServlet类里的init初始化里设置它的配置地址:

中央控制器:

@Overridepublic void init() throws ServletException {
//      actions.put("/book",new BookAction());
//      actions.put("/order",new BookAction());try {
//          配置地址
//          getInitParameter拿到web.xml中的servlet信息配置的参数String configlocation = this.getInitParameter("configLocation");if(configlocation==null || "".equals(configlocation))configModel = ConfigModelFactory.bulid();elseconfigModel = ConfigModelFactory.bulid(configlocation);} catch (Exception e) {e.printStackTrace();}}

在web.xml中配置

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><display-name>T280_mvc</display-name><servlet><servlet-name>mvc</servlet-name><servlet-class>com.zwc.framework.DispatcherServlet</servlet-class><init-param><param-name>configLocation</param-name><param-value>/zwc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>mvc</servlet-name><url-pattern>*.action</url-pattern></servlet-mapping>
</web-app>

我们就改变框架配置了

在进行改名就没有问题了

自定义MVC框架实现相关推荐

  1. 第一章 自定义MVC框架

    第一章  自定义MVC框架 1.1 MVC模式设计     组成:Model:模型,用于数据和业务的处理           View :视图,用于数据的显示           Controller ...

  2. PHP笔记-自定义MVC框架

    膜拜 膜拜下黑马大佬程序员的项目,学习到了这样的手写MVC框架的方式,受益匪浅,感觉自己在C/C++和Java方面,还有许多要学习的地方,看看能不能抄下这个php自己撸一个C/C++的MVC框架. 下 ...

  3. 自定义MVC框架之工具类-图像处理类

    截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( ...

  4. 自定义mvc框架复习(crud)

    目录 一.搭建自定义mvc框架的环境 1.1导入框架的jar包依赖 1.2导入框架配套的工具类 1.3导入框架的配置文件 1.4将框架与web容器进行集成,配置web.xml 二.完成实体类与数据库表 ...

  5. java struts2 mvc_struts2自定义MVC框架

    本文实例为大家分享了struts2自定义MVC框架的方法,供大家参考,具体内容如下 自定义MVC:(首先了解Model1和Model2的概念) Model1与Model2: Model1:就是一种纯j ...

  6. 使用Intellij Idea自定义MVC框架

    今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(co ...

  7. 学到微笑之 - 自定义 MVC 框架

    没啥想说的,就放个表情包吧 1 Spring MVC 执行流程 2 MVC 框架注解开发 自定义注解 (1)MyController @Documented @Target(ElementType.T ...

  8. php mvc自定义框架视频教程,基于PHP面向对象的自定义MVC框架高级项目开发视频教程...

    ├ │  ├01-温故而知新.wmv │  ├02-验证码技术介绍.wmv │  ├03-GD处理图像的基本步骤.wmv │  ├04-画布操作基本步骤-补充.wmv │  ├05-仿制ecshop验 ...

  9. 自定义MVC原理与框架

    目录 一.自定义MVC 二.如何优化增删改查 三.自定义MVC框架 一.自定义MVC 1.自定义MVC的概念: MVC全称名是Model(模型层) View(视图层) control(控制层),这三个 ...

最新文章

  1. sap 新建事务_SAP操作常用事务代码(大全)
  2. Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决
  3. 关于VC++控制台输出中文乱码的问题
  4. Unity3D 预设打包的注意事项
  5. Vue.js-Day06-AM【项目实战(附带 完整项目源码)-day01-am:移动端响应式(响应式尺寸、视口问题、实现rem变化、rem设计)、实战项目搭建(初始化项目、处理rem、搭建路由)】
  6. android NDK 知识汇总
  7. 如何像Uber一样给工程师派单,解放外包生产力?
  8. Linux下安全审计工具 lynis 使用说明
  9. Apollo进阶课程⑯丨Apollo感知之旅——感知概貌
  10. LeetCode 链表的插入排序
  11. php nginx 实时输出,phpnginx实时输出实现方法分享
  12. 格雷码基础和生成的几种方法
  13. 谷歌(Google Chrome)插件安装
  14. GreyBox和ThickBox
  15. 转载:JS数组reduce()和reduceRight()方法
  16. java log4j 相对路径_log4j中配置日志文件相对路径[续集]
  17. math_等式不等式:平方开根号绝对值绝对值不等式放缩基本不等式均值不等式_一元二次方程复根
  18. 南阳oj STL分类练习
  19. python中reduce是什么意思_python中的reduce是什么
  20. 8080端口被占用处理方法

热门文章

  1. Acwing 第 89 场周赛
  2. C语言之冒泡排序的代码讲解
  3. Cinder对接ISCSI
  4. 阿里第2面,都会问什么?
  5. 极速office(Word)怎么添加图片
  6. Elasticsearch 入门到精通-Elasticsearch为什么只能分配最大内存32G
  7. python:一元线性回归分析实例:时间序列分段
  8. Java中的符号的理解
  9. 《Java程序设计》第17周课程设计:《猜猜看》游戏 第三天
  10. 千寻驰观测评:真正达到实用级别的北斗+AI道路智能巡检