封装的mvc模式

主控制器主控制器的DispathcherServlet类

public class DispatcherServlet extends HttpServlet {

	private static final long serialVersionUID = 723689920988912828L;
	private  ConfigModel ConfigModel =null;
	
	@Override
	public void init() throws ServletException {
		try {
			//将原有的读取框架的默认配置文件转变成读取可配置路径的配置文件
			String xmlPath =this.getInitParameter("xmlPath");//xml路径
			//	独立的包类的来配置xml文件
			if(xmlPath ==null || "".equals(xmlPath))//判断是文件的路径和forward是否没有配置
			ConfigModel =ConfigModelFactory.build();//没有配置就原来的方法进入报错
			else 
				ConfigModel =ConfigModelFactory.build(xmlPath);//配置成功就是运行结果
		} catch (Exception e) {
		}		
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stubd
		init();
		String url = req.getRequestURI();
		url =url.substring(url.lastIndexOf("/"), url.lastIndexOf("."));
	
		ActionModel actionModel = ConfigModel.pop(url);//传路径名
		if(actionModel ==null) {
			throw new RuntimeException("你没有配置对应的子控制器Action!!!");
		}
		try {
			//将原来的子控制 器的来源是map集合,这样的话子控制会被写死在map容器中,代码不够灵活
//			现在将子控制器以配置的方式存放在config.xml中,未来可以通过改变config.xml中的内容
//			随意给中央控制器添加子控制器
			
			Action newInstance = (Action) Class.forName(actionModel.getType()).newInstance();
			
			//调用模型驱动接口,获取所需要操作的实体类,然后将jsp传递过来的参数,封装到实体类中
			if(newInstance instanceof ModelDriven ) {//实现接口,传递参数到实体类中去
				ModelDriven modelDriven =(ModelDriven) newInstance;
				Object model = modelDriven.getModel();//获取要驱动的的方法
				
				//可以获取到类对应属性bname,获取到类所对应的属性值 反射读写方法
				BeanUtils.populate(model, req.getParameterMap());
				
			}
			
			//每个子控制器,都需要对结果进行对应的处理,也就是说要么转发,要么重定向,代码重复量较大
//			针对于这一现象 ,将其交给配置文件来处理
//			调用了增强版的子控制器来处理业务逻辑
			String code =newInstance.execute(req, resp);
			ForwardModel forwardModel = actionModel.pop(code);
			if(forwardModel ==null) {
				throw new RuntimeException("你没有配置对应的子控制器Action的处理方式的forward!!!");
			}
			String jspPath =forwardModel.getPath();
			if(forwardModel.isRedirect()) {
//				resp.sendRedirect(req.getContextPath()+jspPath);//加上绝对路径,重定向跳转页面时,不能传值过去。
				resp.sendRedirect(jspPath);//没有加绝对路径,用重定向跳转界面时要加上绝对路径不然报缺少根目录的问题。
				
			}else {
				req.getRequestDispatcher(jspPath).forward(req, resp);
			}
		}	
		 catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		  catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	
}

集合方法封装的泛型方法CalAction

  • 子控制器
/**
 * 专门用来出来业务逻辑的
 * @author 林凡
 * 
 * 增强后的子控制器实现了该子控制器类
 */
public interface Action {
	String execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
}
  • 增强版的子控制器

/**
* 之前的Action只能处理一个实体类的一个业务
* 凡是这个实体类的操作,对应的方法都可以写在当前增强版的子控制器来完成;
* 将一组相关的操作放到一个Action中(反射调用方法)
* 
* @author 林凡
*/
public class ActionSupport implements Action {//实现了Action方法

   @Override
   public final  String execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   	String methodName = req.getParameter("methodName");
   	String code =null;
   	try {
   		Method method = this.getClass().getDeclaredMethod(methodName, 
   				HttpServletRequest.class,
   				HttpServletResponse.class);
   		method.setAccessible(true);
   		//具体调用了你自己所写的子控制器中的方法来处理浏览器请求
   		code  = (String) method.invoke(this, req, resp);
   		} catch (IllegalAccessException e) {
   			e.printStackTrace();
   		} catch (IllegalArgumentException e) {
   			e.printStackTrace();
   		} catch (InvocationTargetException e) {
   			e.printStackTrace();
   		} catch (NoSuchMethodException e) {
   			e.printStackTrace();
   		} catch (SecurityException e) {
   			e.printStackTrace();
   		}
   		return code;
   }
}
  • 模型驱动接口
/**
 * 	是用来处理jsp页面传递过来的参数, 将所有的参数自动封装到实体类T中
 * 利用ModelDriver接口对Java对象进行赋值
 * 
 * @author 林凡
 * @param <T>
 */
public interface ModelDriven<T> {
	T getModel();//用接口封装的方法
}

  • 封装的集合方法
/**
* 集合的把所有方法放到一个集合
* 并且实现用到封装的泛型类
* @author 林凡
*
*/
public class CalAction extends ActionSupport implements ModelDriven<Cal>  {
   //实例化一个属性方法,通用的
   private Cal cal =new Cal();
   //先加方法
   public String add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   	req.setAttribute("res",
   			Integer.valueOf(cal.getNum1())+Integer.valueOf(cal.getNum2()));//直接调用方法的属性名
   	return "calRes";//返回一个所对应的根据name找到type=com.web.CalAction
   }
   	//先减方法
   public String del(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   	req.setAttribute("res",
   			Integer.valueOf(cal.getNum1())-Integer.valueOf(cal.getNum2()));//直接调用方法的属性名
   	return "calRes";//返回一个所对应的根据name找到type=com.web.CalAction
   }
   	//先乘方法
   public String chen(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   	req.setAttribute("res",
   			Integer.valueOf(cal.getNum1())*Integer.valueOf(cal.getNum2()));//直接调用方法的属性名
   	return "calRes";//返回一个所对应的根据name找到type=com.web.CalAction
   }
   	//先除方法
   public String chu(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   	req.setAttribute("res",
   			Integer.valueOf(cal.getNum1())/Integer.valueOf(cal.getNum2()));//直接调用方法的属性名
   	return "calRes";//返回一个所对应的根据name找到type=com.web.CalAction
   }
   @Override
   public Cal getModel() {
   	//用到泛型封装的方法
   	return cal;
   }
   
}

xml的配置

<config>

!-- 	独立的包类的来配置xml文件
	 使得框架的配置文件可变 同区域的名的配置文件 
	 将Action的信息配置到xml(反射实例化) -->
	 
 	<action path="/Cal" type="com.web.CalAction">
 		<forward name="calRes" path="calRes.jsp" redirect="false" />
	</action>
 	
</config>

主界面cal.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	function doSb(val) {
		if(val == 1){
			calForm.methodName.value ="add";
		}
		else if(val ==2){
			calForm.methodName.value ="del";
		}
		else if(val ==3){
			calForm.methodName.value ="chen";
		}
		else if(val ==4){
			calForm.methodName.value ="chu";
		}
		calForm.submit();
	}
	
</script>

</head>
<body>
<form id="calForm" name="calForm" action="${pageContext.request.contextPath }/Cal.action">
	num1:<input type="text" name="num1" ><br>
	num2:<input type="text" name="num2" ><br>
	<input type="hidden" name="methodName" >
	<button onclick="doSb(1)">+</button>
	<button onclick="doSb(2)">-</button>
	<button onclick="doSb(3)">*</button>
	<button onclick="doSb(4)">/</button>
</form>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值