1.自定义mvc在mvc的基础上进行优化,主要是为了减少代码量
2.mvc先创建 中央控制器
package com.zking.frame;
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 com.zking.web.BookCupi;
/**
* 目标: 根据自定义mvc框架的原理图 完成 框架的研发
*
* Cpu中央控制器
*
* @author 花火
*
* 寻找子控制器
*/
@WebServlet("*.action")
public class Cpu extends HttpServlet {
//子控制器不只一个,有专门存放子控制器的地方
private Map<String, CupiE> ie = new HashMap<String, CupiE>();
//初始化子控制器集合,经过初始化,ie容器就有子控制器集合
//init ,Serviet, destroy
@Override
public void init() throws ServletException {
// 初试化子控制器
ie.put("/book", new BookCupi());
}
@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/MVC/book.action?methodName=add
// 目标:BookCupiE.add();
/**
* 思路 1.从浏览器URL中获取"/book"字符串 2.在子控制器容器中拿到Cupie 3.找到方法
*/
// 获取uri
String uri = req.getRequestURI();
// 截取
uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
CupiE c = ie.get(uri);
c.execute(req, resp);
}
}
3.创建子控制器通用获取方法名的方法
package com.zking.frame;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CupiE implements Cupi {
@Override
public void execute(HttpServletRequest req, HttpServletResponse resp) {
String me = req.getParameter("methodName");
try {
Method m = this.getClass().getDeclaredMethod(me,HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
m.invoke(this,req,resp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4.创建子控制器并继承Cupi类
package com.zking.frame;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 1.运行/处理前台的浏览器请求
* 2.运行jsp传递到后台的方法字符串所代表的方法
* @author 花火
*
*/
public interface Cupi {
public void execute(HttpServletRequest req, HttpServletResponse resp);
/*
private void add(HttpServletRequest req, HttpServletResponse resp) {
// TODO Auto-generated method stub
System.out.println("bookDao.add()..");
}
private void delete(HttpServletRequest req, HttpServletResponse resp) {
// TODO Auto-generated method stub
System.out.println("bookDao.delete()..");
}
private void edit(HttpServletRequest req, HttpServletResponse resp) {
// TODO Auto-generated method stub
System.out.println("bookDao.edit()..");
}
private void list(HttpServletRequest req, HttpServletResponse resp) {
// TODO Auto-generated method stub
System.out.println("bookDao.list()..");
}
private void load(HttpServletRequest req, HttpServletResponse resp) {
// 数据回显
// TODO Auto-generated method stub
System.out.println("bookDao.load()..");
}
private void ref(HttpServletRequest req, HttpServletResponse resp) {
// 数据回显
// TODO Auto-generated method stub
System.out.println("bookDao.ref()..");
}*/
}
5.通过add的方法名运行以写好的add方法