自定义MVC(02)

思维导图

 代码

DispatchServlet

package com.zking.framework;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

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.zking.web.BookAction;
import com.zking.web.GoodsAction;

/**
 * 目标:
 * 	根据自定义mvc框架的原理图	完成	框架的研发
 * @author Administrator
 * 中央控制器
 * 	寻找子控制器
 *
 */
@WebServlet("*.action")
public class DispatchServlet extends HttpServlet {
//	存放子控制器的容器
//	private Map<String, ActionSupport> actions = new HashMap<String, ActionSupport>();
	private ConfigModel configModel = null;
//	初始化子控制器容器(集合),经过初始化,actions容器内部就有了子控制器
//	init,service,destroy
	/*
	 * 需求:
	 * 	在增加一个商品类的增删查改
	 * 步骤:
	 * 	改动init中代码
	 * 思考:
	 * 	能不能不改动代码完成这个需求
	 * 	参考DBAccess的数据源配置文件config.properties
	 * 		1.减少代码改动风险性
	 * 		2.减少代码的编译次数(对于已经部署到服务器后)
	 * 	解决方案:
	 * 	改成子控制器可配置
	 * 	解决步骤:
	 * 		1.必须有配置文件config.xml
	 * 		2.配置文件config.xml中要包含处理业务的子控制器
	 * 		3.读取到配置文件config.xml中的对应的处理浏览器请求的子控制器
	 * 	编码
	 * 		...
	 */
	@Override
	public void init() throws ServletException {
		try {
			configModel = ConfigModelFactory.build();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
//		actions.put("/book", new BookAction());
//		actions.put("/goods", new GoodsAction());
//		actions.put("/order", new BookAction());
//		actions.put("/OrderItem", new BookAction());
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		完成寻找子控制的过程
//		浏览器:http://localhost:8080/t266_mvc/book.action?methodName=add
//		目标:BookAction.add()...
		/*
		 * 思路:
		 * 	1.从浏览器URL中获取到“/book”字符串
		 * 	2.在子控制器容器中拿到BookAction
		 * 	3.BookAction.add()
		 */
		String uri = req.getRequestURI();
		uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
//		action=BookAction
//		ActionSupport action = actions.get(uri);
		ActionModel actionModel = configModel.pop(uri);
		String type = actionModel.getType();
		ActionSupport action;
		try {
			action = (ActionSupport) Class.forName(type).newInstance();
//		ActionSupport action = new BookAction()
			if(action instanceof ModelDriver) {
				ModelDriver m = (ModelDriver) action;
				Object obj = m.getModel();
//				有对象
//				接受所有的前端JSP传递到后台的参数
				Map<String, String[]> parameterMap = req.getParameterMap();
//				对 对象 赋值
//				PropertyUtils.getProperty(obj, "")
				BeanUtils.populate(obj, parameterMap);
			}
//			execute->delete
			String res = action.execute(req, resp);
			/*
			 * 思路
			 * 1.方法执行完毕必须有一个返回值
			 * 2.通过返回值决定是否重定向,还是转发
			 * 3.通过返回值决定跳转哪一个页面
			 */
			ForwardModel forwardModel = actionModel.pop(res);
			if(forwardModel.isRedirect()) {
				resp.sendRedirect(req.getContextPath()+forwardModel.getPath());
			}else {
				req.getRequestDispatcher(forwardModel.getPath()).forward(req, resp);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

结果

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值