自定义MVC框架简单入门、开发
自定义MVC框架简单入门、开发
MVC简介
什么是MVC ?
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,它是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码.
Model1 jsp+jdbc
Model2 ->MVC
MVC核心思想:各司其职
MVC结构
M
实体域模型(名词)
过程域模型(动词)
V
jsp/ios/android
C
servlet/action
web | 做浏览器请求分发 |
---|---|
service | 调用dao处理项目业务的 |
dao | 操作数据库 |
注意:
- 不能跨层调用
- 只能出现由上而下的调用
MVC开发
现今开发
实体类、dao、web
AddBookServlet
DelBookServlet
。。。。。。
web.xml
AddBookServlet
DelBookServlet
。。。。。。
....>
BookServlet
web.xml
BookServlet
String methodName = req.getParamater("methodName");
String methodName = req.getParamater("bname");
String methodName = req.getParamater("pice");
String methodName = req.getParamater("type");
........
Book b = new Book();
b.set()
......
if("add".equals(methodName)){
add(req,resp);
}
重定向、转发
req.getResquestDispather("xxx.jsp").forward(req,resp);
resp.sendRedirect();
jsp--->methodName=add/del/....
-->
前一种方式有一种方式有什么不好呢?
-
1、BookServlet中的if语句判断非常多
-
2、省去jsp传递到后台封装成对象的过程
-
3、省去结果集的处理
控制器:
中央控制器 子控制器
自定义MVC工作原理
自定义MVC工作原理图:
注意:图中的ActionServlet也可是DispatcherServlet
控制器:
主控制动态调用子控制器,完成具体的业务逻辑
主控制器:查看是否有对应的子控制器来处理用户请求,如果就调用子控制器来处理请求,没有就报错,就处理不了请求
子控制器:就是处理用户请求用的
简单计算器案例
首先定义主控制器,代码如下:
package com.dj.framework;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dj.web.AddCalAction;
import com.dj.web.DelCalAction;
import com.dj.web.DivideCalAction;
import com.dj.web.MultiplyCalAction;
/**
* 主控制器
* @author 86182
*/
public class DispatcherServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private Map<String, Action> actionMap = new HashMap<>();//键值对
public void init() {
actionMap.put("/addCal", new AddCalAction());//加
actionMap.put("/delCal", new DelCalAction());//减
actionMap.put("/multiplyCal", new MultiplyCalAction());//乘
actionMap.put("/divideCal", new DivideCalAction());//除
}
@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 {
init();
String url = req.getRequestURI();//路径
url = url.substring(url.lastIndexOf("/"),url.lastIndexOf("."));
Action action = actionMap.get(url);
action.execut(req, resp);
}
}
其次定义子控制器,
package com.dj.framework;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 子控制器
* 专门用来处理业务逻辑
* @author 86182
*/
public interface Action {
void execut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
}
然后,完成业务逻辑处理界面
加:
public class AddCalAction implements Action{
@Override
public void execut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String num1 = req.getParameter("num1");
String num2 = req.getParameter("num2");
req.setAttribute("res", Integer.valueOf(num1) + Integer.valueOf(num2));
req.getRequestDispatcher("calRes.jsp").forward(req, resp);
}
}
减:
public class DelCalAction implements Action{
@Override
public void execut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String num1 = req.getParameter("num1");
String num2 = req.getParameter("num2");
req.setAttribute("res", Integer.valueOf(num1) - Integer.valueOf(num2));
req.getRequestDispatcher("calRes.jsp").forward(req, resp);
}
}
乘:
public class MultiplyCalAction implements Action{
@Override
public void execut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String num1 = req.getParameter("num1");
String num2 = req.getParameter("num2");
req.setAttribute("res", Integer.valueOf(num1) * Integer.valueOf(num2));
req.getRequestDispatcher("calRes.jsp").forward(req, resp);
}
}
除:
public class DivideCalAction implements Action{
@Override
public void execut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String num1 = req.getParameter("num1");
String num2 = req.getParameter("num2");
req.setAttribute("res", Integer.valueOf(num1) / Integer.valueOf(num2));
req.getRequestDispatcher("calRes.jsp").forward(req, resp);
}
}
当然,少不了要配置web.xml
除此之外,在jsp界面中还有一个很重要的函数。
页面展示效果如下:
依次点击 “+”、“-”、“*”、“/”,依次得到以下结果:
诸位可以自己尝试做简单的计算器,还是挺有意思的呢 (●’◡’●) (/≧▽≦)/ 。