自定义mvc框架(中)

 

                                       一.前节回顾

在前一节中,我们了解了:

1.什么是mvc框架?

2.mvc框架在企业中的大量使用

3.mvc框架和 三层架构区别?

4.分析mvc框架代码和缺陷

5.利用自定义mvc框架去优化三层架构 !

所以你学废了吗?

                                   二.继续优化mvc框架

1..将中央控制器中的Action容器,变成可控制!

缺点:中央控制器 加载不可以灵活配置

1.1老版方法

首先我们的第一个问题就是子控制器的初始化配置问题,我在上篇中的最后一个版本“反射增强版”演示到如果需要对项目中的其他表进行操作,就必须编写子控制器并进行配置。通过这样操作就可以将action中的容器便活,可以适应各种使用

1.2新版方法

新版本我们通过XML建模的方法来实现将原来写死的,将其变活!

然后那个build方法(通过此方法来调用我们的xml文件)展示为

xml文件 

 在typr位置进行修改,路径你实现servelt的方法

1.3相对应的一些文件

1.3.1中央控制器

package com.lz.fraamework;

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 com.lz.fraamework.model.ActionModel;
import com.lz.fraamework.model.ConfigModel;
import com.lz.fraamework.model.ConfigModelFactory;
import com.lz.fraamework.model.ForwardModel;
import com.lz.servelt.OederAction;
import com.lz.servelt.bookAction;

/**
 * 对应图中的 ActionServelt:中央控制器 调用反射代码块
 * 
 * @author lzzxq
 *
 */
@WebServlet("*.action")
public class DispathServelt extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private ConfigModel configModel;
	@Override
	// 服务器启动就启用
	public void init() throws ServletException {
		try {
			configModel = ConfigModelFactory.build();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		@SuppressWarnings("unused")
		// jsp传递的参数
		String methodName = request.getParameter("methodName");
		// 获取浏览器路径的book
		String uri = request.getRequestURI();
		uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
		// Action action = actionMap.get(uri);

		// 通过 uri= 在configModel寻找
		ActionModel actionmodel = configModel.pop(uri);
		if (actionmodel == null) {
			throw new RuntimeException("action not config");
		}
		String type = actionmodel.getType();
		// bookAction bk=new bookAction();
		Action action;
		try {
			action = (Action) Class.forName(type).newInstance();
			if(action instanceof ModelDriver) {
				ModelDriver md = (ModelDriver) action;
				Object bean = md.getModel();
				BeanUtils.populate(bean, request.getParameterMap());
			}
			// 具体业务代码返回值 增加,删除,修改,查看 tolist list
			String res = action.ececute(request, response);
			// 通过此方法 获取返回值
			ForwardModel forwardModel = actionmodel.pop(res);
			if (forwardModel != null) {
				boolean redirect = forwardModel.isRedirect();
				String path = forwardModel.getPath();
				if (redirect) {
					response.sendRedirect(request.getContextPath() + "/" + path);
				} else {
					request.getRequestDispatcher(path).forward(request, response);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

1.3.2需要配置的xml文件

<?xml version="1.0" encoding="UTF-8"?>

<config>
	<action path="/order" type="com.lz.servelt.OederAction">
		<forward name="failed" path="/reg.jsp" redirect="false" />
		<forward name="success" path="/login.jsp" redirect="true" />
	</action>

	<action path="/book" type="com.lz.servelt.bookAction">
		<forward name="list" path="/res.jsp" redirect="false" />
		<forward name="toList" path="/res.jsp" redirect="true" />
	</action>
</config>

 1.3.3实现servelt的方法

package com.lz.servelt;

import java.io.IOException;
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 com.lz.fraamework.Action;

public class OederAction extends  Action{
	/**
	 * 在此实现Orderservelt的方法
	 * @param request
	 * @param response
	 */
	private void Ck(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("ck....订单方法....刘兵小狗狗");
		
	}

	private void upd(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("upd....订单方法");
		
	}

	private void del(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("del....订单方法");
		
	}

	private void add(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("add....订单方法");
		
	}


}
package com.lz.servelt;

import java.io.IOException;
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 com.lz.entity.Book;
import com.lz.fraamework.Action;
import com.lz.fraamework.ModelDriver;

public class bookAction extends  Action implements  ModelDriver<Book>{
	private Book book = new Book();
	/**
	 * 在此实现servelt的方法
	 * @param request
	 * @param response
	 * @throws Exception 
	 * @throws ServletException 
	 */
	private String add(HttpServletRequest request, HttpServletResponse response) throws Exception {
		Map<String, String[]> parameterMap = request.getParameterMap();
		/* 1.要有表对应的类属性对象 Book book
		 * 2.获取到所有的参数 及参数 
		 * 3.将参数值封装到表对应的对象中
		 * 4.要做到所有子控制器通用
		 */
//		String bid = request.getParameter("bid");
//		String bname = request.getParameter("bname");
//		String price = request.getParameter("price");
//		Book book = new Book();
//		book.setBid(Integer.valueOf(bid));
//		book.setBname(bname);
//		book.setPrice(Float.valueOf(price));
		System.out.println("add....方法");
		//request.getRequestDispatcher("res.jsp").forward(request, response);
		request.setAttribute("content", "送快递盒饭");
		return  "toList";
		
	}
	
	
	private String Ck(HttpServletRequest request, HttpServletResponse response) throws ServletException, Exception {
		System.out.println("ck....方法....刘兵小狗狗");
	//	response.sendRedirect("res.jsp");
		request.setAttribute("content", "送快递盒饭");
		return  "List";
		
		
	}

	private  String upd(HttpServletRequest request, HttpServletResponse response) throws Exception {
		System.out.println("upd....方法");
//		request.getRequestDispatcher("res.jsp").forward(request, response);
		request.setAttribute("content", "送快递盒饭");
		return  "toList";
		
	}

	private String del(HttpServletRequest request, HttpServletResponse response) throws Exception {
		System.out.println("del....方法");
	//	request.getRequestDispatcher("res.jsp").forward(request, response);	
		request.setAttribute("content", "送快递盒饭");
		return  "toList";
	}


	@Override
	public Book getModel() {
		// TODO Auto-generated method stub
		return book;
	}




}

2.针对于反射调用业务代码,最终页面跳转 

1.老版的页面跳转

request.getRequestDispatcher("res.jsp").forward(request, response);    

response.sendRedirect("res.jsp");

无非是通过这两个方法进行封面跳转,但是使用这种页面跳转在每一个页面都要写东,属于重复代码

2.新版本

 实现思路:定义一个res,用此来接受我们的m.invoke方法并且将我们的方法从void变成String

在一个return  返回res

其次:

 将我们的servelt方法void变成String  在一个return  返回“List”or"toList" (查询)为后面的配置xml做准备

 将name属性变成 list or ltoist  然后把path路径变成我们要跳转的页面!

接着进行一个if判断是转发,还是重定向?


3.jsp页面参数传递后台的代码优化字段太多有影响!

3.1老版本的封装实体,获取参数

弊端:使用于字段名比较少,如果字段名太多就会增加代码数量,并且在编码的时候很容易出现错误 ,耗费时间

3.2新版本

模型驱动接口 替换 Book book = new Book();

 定义一个集合保存存储的数据

Map<String, String[]> parameterMap = request.getParameterMap();

在 DispathServelt判断是否实现接口

                          三.对于这些方法总结

<p>版本5</p>

常识:查询必然转发,增删改使用重定向

弊端:中央控制器中的action容器加载不可以灵活配置

<hr>

<a href="book.action?methodName=add">增加</a>

<a href="book.action?methodName=del">删除</a>

<a href="book.action?methodName=upd">修改</a>

<a href="book.action?methodName=list">查询</a>

<p>版本6</p>

弊端:jsp传递到后台,封装到实体类的代码过多

<hr>

<a href="book.action?methodName=add&bid=1&bname=nb&price=9.9">增加</a>

<a href="book.action?methodName=del">删除</a>

<a href="book.action?methodName=upd">修改</a>

<a href="book.action?methodName=list">查询</a>

<p>版本7</p>

<hr>

<a href="book.action?methodName=add&bid=1&bname=nb&price=9.9">增加</a>

<a href="book.action?methodName=del">删除</a>

<a href="book.action?methodName=upd">修改</a>

<a href="book.action?methodName=list">查询</a>

</body>

</html>

所以你学废了吗?

猜你喜欢

转载自blog.csdn.net/lz17267861157/article/details/131499656