自定义MVC框架实现
目录
一、让中央控制器动态加载存储子控制器
二、参数传递封装优化
三、 对于方法执行结果,转发重定向优化
四、框架配置文件可变
一、让中央控制器动态加载存储子控制器
通过上篇文章中央控制器接受浏览器的请求,在其中我们使用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框架实现相关推荐
- 第一章 自定义MVC框架
第一章 自定义MVC框架 1.1 MVC模式设计 组成:Model:模型,用于数据和业务的处理 View :视图,用于数据的显示 Controller ...
- PHP笔记-自定义MVC框架
膜拜 膜拜下黑马大佬程序员的项目,学习到了这样的手写MVC框架的方式,受益匪浅,感觉自己在C/C++和Java方面,还有许多要学习的地方,看看能不能抄下这个php自己撸一个C/C++的MVC框架. 下 ...
- 自定义MVC框架之工具类-图像处理类
截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( ...
- 自定义mvc框架复习(crud)
目录 一.搭建自定义mvc框架的环境 1.1导入框架的jar包依赖 1.2导入框架配套的工具类 1.3导入框架的配置文件 1.4将框架与web容器进行集成,配置web.xml 二.完成实体类与数据库表 ...
- java struts2 mvc_struts2自定义MVC框架
本文实例为大家分享了struts2自定义MVC框架的方法,供大家参考,具体内容如下 自定义MVC:(首先了解Model1和Model2的概念) Model1与Model2: Model1:就是一种纯j ...
- 使用Intellij Idea自定义MVC框架
今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(co ...
- 学到微笑之 - 自定义 MVC 框架
没啥想说的,就放个表情包吧 1 Spring MVC 执行流程 2 MVC 框架注解开发 自定义注解 (1)MyController @Documented @Target(ElementType.T ...
- php mvc自定义框架视频教程,基于PHP面向对象的自定义MVC框架高级项目开发视频教程...
├ │ ├01-温故而知新.wmv │ ├02-验证码技术介绍.wmv │ ├03-GD处理图像的基本步骤.wmv │ ├04-画布操作基本步骤-补充.wmv │ ├05-仿制ecshop验 ...
- 自定义MVC原理与框架
目录 一.自定义MVC 二.如何优化增删改查 三.自定义MVC框架 一.自定义MVC 1.自定义MVC的概念: MVC全称名是Model(模型层) View(视图层) control(控制层),这三个 ...
最新文章
- sap 新建事务_SAP操作常用事务代码(大全)
- Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决
- 关于VC++控制台输出中文乱码的问题
- Unity3D 预设打包的注意事项
- Vue.js-Day06-AM【项目实战(附带 完整项目源码)-day01-am:移动端响应式(响应式尺寸、视口问题、实现rem变化、rem设计)、实战项目搭建(初始化项目、处理rem、搭建路由)】
- android NDK 知识汇总
- 如何像Uber一样给工程师派单,解放外包生产力?
- Linux下安全审计工具 lynis 使用说明
- Apollo进阶课程⑯丨Apollo感知之旅——感知概貌
- LeetCode 链表的插入排序
- php nginx 实时输出,phpnginx实时输出实现方法分享
- 格雷码基础和生成的几种方法
- 谷歌(Google Chrome)插件安装
- GreyBox和ThickBox
- 转载:JS数组reduce()和reduceRight()方法
- java log4j 相对路径_log4j中配置日志文件相对路径[续集]
- math_等式不等式:平方开根号绝对值绝对值不等式放缩基本不等式均值不等式_一元二次方程复根
- 南阳oj STL分类练习
- python中reduce是什么意思_python中的reduce是什么
- 8080端口被占用处理方法